跳到主要内容

Node.js

当前使用 Node LTS 版本为 V20.x

传送门:后端开发 - Node.js

官方对 Node.js 的定义:Node.js 是一个基于 V8 JavaScript 引擎的 JavaScript 运行时环境。

Node.js 源码仓库的 /deps 目录下有十几个依赖,其中既有 C 语言编写的模块(如 libuv、V8)也有 JavaScript 语言编写的模块(如 acorn)。

1628-KgUnY4

其中:

  • 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 两个目录对应的模块。

2252-jGHyUW

Node 基础

部分简介

V8 引擎的原理

简单了解一下它执行 JavaScript 代码的原理:

  • Parse 模块会将 JavaScript 代码转换成 AST(抽象语法树),这是因为解释器并不直接认识 JavaScript 代码;
  • 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 的内存回收也是其强大的另外一个原因,不过这里暂时先不展开讨论:

什么是 libuv(uv)

libuv 是一个用 C 编写的支持多平台的异步 I/O 库,主要解决 I/O 操作容易引起阻塞的问题。最开始是专门为 Node.js 使用而开发的,但后来也被 Luvit、Julia、pyuv 等其他模块使用。

什么是 REPL

  • REPL 是 Read-Eval-Print Loop 的简称,翻译为“读取-求值-输出”循环;
  • REPL 是一个简单的、交互式的编程环境;

不同环境下关注的 node 差异

1057-F8KCvC

node 版本管理

缓存清理

Npm

  1. 查看缓存路径

要查看 npm 的缓存路径,您可以执行以下命令:

npm config get cache
  1. 清除缓存

要清除 npm 的缓存,可以执行以下命令:

npm cache clean --force

注:这将清除 npm 缓存目录中的所有文件。需要注意的是,这可能会导致重新下载项目的依赖,因此在执行此命令之前,请确保您已备份了重要的依赖信息。

Yarn

  1. 查看缓存列表

要查看 yarn 的缓存列表,可以执行以下命令:

yarn cache list
  1. 查看缓存路径

要查看 yarn 的缓存路径,可以执行以下命令:

yarn cache dir
  1. 清除缓存

要清除 yarn 的缓存,可以执行以下命令:

yarn cache clean

注:这将清除 yarn 缓存目录中的所有文件。和清除 npm 缓存一样,在执行此命令之前,请确保您已备份了重要的依赖信息。Yarn 缓存文档

Pnpm

  1. 缓存路径

要查看 pnpm 的缓存路径,可以执行以下命令:

pnpm store path

您可以手动删除该路径下的文件,以清除 pnpm 的缓存。 注: 请注意,删除缓存文件后,pnpm 可能会在未来的安装过程中速度变慢,因为它需要重新下载被删除的文件。

  1. 清除缓存

要清除 pnpm 的缓存,可以执行以下命令:

pnpm store prune

注:从存储中删除未引用的(无关的、孤立的)包。修剪商店无害,但可能降低未来安装的速度。有关未引用包的更多信息以及原因,请访问 Pnpm store 文档