Node.js
当前使用 Node LTS 版本为 V20.x
传送门:后端开发 - Node.js
官方对 Node.js 的定义:Node.js 是一个基于 V8 JavaScript 引擎的 JavaScript 运行时环境。
Node.js 源码仓库的 /deps 目录下有十几个依赖,其中既有 C 语言编写的模块(如 libuv、V8)也有 JavaScript 语言编写的模块(如 acorn)。
其中:
- acorn:用 JavaScript 编写的轻量级 JavaScript 解析器。
- brotli:C 语言编写的 Brotli 压缩算法。
- cares:应该写为“c-ares”,C 语言编写的用来处理异步 DNS 请求。
- histogram:C 语言编写,实现柱状图生成功能。
- icu-small:C 语言编写,为 Node.js 定制的 ICU(International Components for Unicode)库,包括一些用来操作 Unicode 的函数。
- llhttp:C 语言编写,轻量级的 http 解析器。
- nghttp2/ngtcp2:处理 HTTP/2、TCP/2 协议。
- npm:JavaScript 编写的 Node.js 模块管理器。
- openssl:C 语言编写,加密相关的模块,在 tls 和 crypto 模块中都有使用。
- uv:C 语言编写,采用非阻塞型的 I/O 操作,为 Node.js 提供了访问系统资源的能力。
- uvwasi:C 语编写,实现 WASI 系统调用 API。
- v8:C 语言编写,JavaScript 引擎。
- zlib:用于快速压缩,Node.js 使用 zlib 创建同步、异步和数据流压缩、解压接口。
其中最重要的是 v8 和 uv 两个目录对应的模块。
Node 基础
部分简介
V8 引擎的原理
简单了解一下它执行 JavaScript 代码的原理:
- Parse 模块会将 JavaScript 代码转换成 AST(抽象语法树),这是因为解释器并不直接认识 JavaScript 代码;
- 如果函数没有被调用,那么是不会被转换成 AST 的;
- Parse 的 V8 官方文档:https://v8.dev/blog/scanner
- Ignition 是一个解释器,会将 AST 转换成 ByteCode(字节码)
- 同时会收集 TurboFan 优化所需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算);
- 如果函数只调用一次,Ignition 会执行解释执行 ByteCode;
- Ignition 的 V8 官方文档:https://v8.dev/blog/ignition-interpreter
- TurboFan 是一个编译器,可以将字节码编译为 CPU 可以直接执行的机器码;
- 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过 TurboFan 转换成优化的机器码,提高代码的执行性能;
- 但是,机器码实际上也会被还原为 ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如 sum 函数原来执行的是 number 类型,后 来执行变成了 string 类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码;
- TurboFan 的 V8 官方文档:https://v8.dev/blog/turbofan-jit
- 上面是 JavaScript 代码的执行过程,事实上 V8 的内存回收也是其强大的另外一个原因,不过这里暂时先不展开讨论:
- Orinoco 模块,负责垃圾回收,将程序中不需要的内存回收;
- Orinoco 的 V8 官方文档:https://v8.dev/blog/trash-talk
什么是 libuv(uv)
libuv 是一个用 C 编写的支持多平台的异步 I/O 库,主要解决 I/O 操作容易引起阻塞的问题。最开始是专门为 Node.js 使用而开发的,但后来也被 Luvit、Julia、pyuv 等其他模块使用。
什么是 REPL
- REPL 是 Read-Eval-Print Loop 的简称,翻译为“读取-求值-输出”循环;
- REPL 是一个简单的、交互式的编程环境;
不同环境下关注的 node 差异
node 版本管理
缓存清理
Npm
- 查看缓存路径
要查看 npm 的缓存路径,您可以执行以下命令:
npm config get cache
- 清除缓存
要清除 npm 的缓存,可以执行以下命令:
npm cache clean --force
注:这将清除 npm 缓存目录中的所有文件。需要注意的是,这可能会导致重新下载项目的依赖,因此在执行此命令之前,请确保您已备份了重要的依赖信息。
Yarn
- 查看缓存列表
要查看 yarn 的缓存列表,可以执行以下命令:
yarn cache list
- 查看缓存路径
要查看 yarn 的缓存路径,可以执行以下命令:
yarn cache dir
- 清除缓存
要清除 yarn 的缓存,可以执行以下命令:
yarn cache clean
注:这将清除 yarn 缓存目录中的所有文件。和清除 npm 缓存一样,在执行此命令之前,请确保您已备份了重要的依赖信息。Yarn 缓存文档
Pnpm
- 缓存路径
要查看 pnpm 的缓存路径,可以执行以下命令:
pnpm store path
您可以手动删除该路径下的文件,以清除 pnpm 的缓存。 注: 请注意,删除缓存文件后,pnpm 可能会在未来的安装过程中速度变慢,因为它需要重新下载被删除的文件。
- 清除缓存
要清除 pnpm 的缓存,可以执行以下命令:
pnpm store prune
注:从存储中删除未引用的(无关的、孤立的)包。修剪商店无害,但可能降低未来安装的速度。有关未引用包的更多信息以及原因,请访问 Pnpm store 文档