1.1、Node.js v20
2023年4 月 18 日,Node.js 正式发布了 v20 版本,是当前最新的可用版本。从Node.js 8之后,很长一段时间,都是围绕如何兼容Web新规范而演进,之所以要讲解v20这个版本,主要有5个原因。
- 变化较多,从Node.js 8到v20,可以说是翻天覆地的变化,无论Node.js新手,还是老手,都值得重新学习一下。
- 截止到v20版本,新特性基本趋于稳定,像ESM、Async函数等都已经非常成熟了。
- 搭配前端最新Web规范,很多Node.js知识点需要更新,比如内置fetch等。
- Deno、Bun等服务端JavaScript运行时崛起,其实Node.js v20已经有很多与时俱进的内容,比如network-import等,依然是当前主流,稳定,可靠的。
- AIGC爆火,带动Node.js全栈需求更加旺盛。结合LLM模型(OpenAI或Replicate等),Langchain.js,以及https://github.com/vercel-labs/ai SDK,组合数据库操作,可以快速落地AI业务。
Node.js是什么
按照官方介绍https://nodejs.dev/en/learn/,通过5个要点来讲解Node.js是什么,具体如下。
1、JavaScript运行时环境
Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它是几乎任何类型项目的流行工具!Node.js 具有独特的优势,因为数百万为浏览器编写 JavaScript 的前端开发者现在除了客户端代码之外,还能够编写服务器端代码,而无需学习完全不同的语言。
这里需要说明的是,JavaScript优先,但也支持C/C++/Rust,通过N-Api(之前叫Nan node addon)扩展即可。
Node.js主要场景是服务器端代码,却在前端工程领域无心插柳柳成荫,变成了大前端领域必备的组成部分。下面讲Node.js应用场景的时候会细讲。
2、基于v8,所以快
Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使得 Node.js 执行速度非常高效。
很多c代码写的算法,都不一定比v8写的js代码执行速度快。参考https://github.com/felixge/faster-than-c
3、单进程单线程,简单
Node.js 应用在单个进程中运行,无需为每个请求创建新线程。 Node.js 在其标准库中提供了一组异步 I/O ,以防止 JavaScript 代码阻塞,并且通常Node.js 中的库是使用非阻塞范例编写的,这使得阻塞行为成为异常而不是常态。
缺点:部署服务端代码的时候,一般你需要根据多少个cpu核数n来决定起n-1个实例,这时候就需要pm2这样的进程管理工具,很多人吐槽pm2,其根本原因是Node.js自身机制问题。
4、基于libuv实现的事件循环,成败皆因此
当 Node.js 执行 I/O 操作时,如从网络读取、访问数据库或文件系统,Node.js 不会阻塞线程和浪费 CPU 周期等待,而是会在事件循环完成恢复操作。
当Node.js进程启动时,Node会创建一个类似于while(true){...}的EventLoop(浏览器也有),每执行一次循环体的过程我们称为Tick。每个Tick的过程就是查看是否有事件待处理,如果有,就取事件及其相关的回调函数。如果存在关联的回调函数,就执行它们。然后进入下一个循环,如果不再有事件要处理,就退出进程。以后学的深入的时候,需要setImmediate 和 process.nextTick,就是围绕EventLoop操作的相关API。
这使得 Node.js 可以使用单个服务器处理数千个并发连接,而不会引入管理线程并发的负担(这可能是灾难的来源)。
基于EventLoop,任务是异步的,所以要采用Error-first Callback写法,所以导致后面异步流程极其复杂,且编写代码时,需要时刻注意EventLoop里加入的代码是否为异步,不然就可能出现性能问题。
辩证的看,Node.js的好处是让你不需要关注多线程就能实现高性能,但你需要关注事件循环是否为异步。
果然,天下没有免费的午餐。
5、跟进Web标准
在 Node.js 中,可以毫无问题地使用新的 ECMAScript 标准(部分),因为你不必等待所有用户更新他们的浏览器(但要等v8更新) - 你负责通过更改 Node.js 版本来决定使用哪个 ECMAScript 版本(这其实不是特性,而是不完善), 你还可以通过运行带有标志的 Node.js 来启用特定的实验性特性(这种一般就是玩玩)。
说的有点夸张了,但跟进是事实,且一定是有滞后现象的。
Node.js应用场景
1、最重要的场景是Server场景(初心)
2、最通用的是Cli工具开发场景(通用)
3、占比较大的前端相关场景(当前最多,除了Server、API,其他基本都算)
Node.js v20运行原理和新特性
- node v20特性:std lib 在标准化,user lib 在精细化
- v8+eventloop+promise-base api(error-first)+event
- npm
- esm
- async/await + promise
- worker thread(tinypool)
- loader
- test runner
- 权限模型
- 可观测性,包括 logging/metrics/tracing,以及 APM 等
- 现代化的 HTTP:undici
- wasm
- n-api
本节主要讲解Node.js v20入门,大家了解一下即可,限于篇幅,下一门课会详细讲具体细节。
Node.js和大前端的关系
讲Node.js应用场景的时候,我们说过占比较大的前端相关场景,除了Server、API,其他基本都算是大前端场景的组成部分。
下面我们来看一下Node.js和大前端的关系。
Node.js在大前端中发挥了重要作用,主要包括以下方面:
- 服务器端开发:Node.js可以作为服务器端语言来处理HTTP请求,实现服务器端的逻辑处理和数据存储等功能。
- 前端构建工具:Node.js提供了npm包管理工具,开发者可以通过npm下载和管理各种前端框架、库和插件等。
- 前端自动化构建:Node.js可以结合gulp、grunt、webpack、vite等自动化构建工具来进行前端代码的自动化打包、压缩、合并等操作,提高开发效率。
- 实时通信:Node.js可以通过socket.io等技术实现实时通信,例如聊天室、在线游戏等,比如hmr等。
- 数据库操作:Node.js可以通过mongoose等库来进行数据库的操作,例如数据的增删改查等。
- 人工智能:Node.js可以结合TensorFlow等机器学习框架来进行人工智能的开发和应用。
- 云计算:Node.js可以结合AWS Lambda等云计算平台来进行云计算相关的开发和应用。
总之,Node.js在大前端中的应用非常广泛,可以帮助开发者快速搭建服务器、构建前端、实现自动化构建、进行实时通信、操作数据库、开发人工智能等。