本文档介绍了 Node.js 如何管理其依赖项,包括 V8、libuv 等核心依赖项。它解释了依赖项如何在 Node.js 代码库中集成、配置和更新。有关构建配置过程本身的信息,请参阅 构建配置。
Node.js 依赖于几个关键的依赖项来提供其核心功能。这些依赖项包括 JavaScript 引擎、事件循环库、加密库以及各种其他组件。管理这些依赖项对于确保 Node.js 保持稳定、安全和高性能至关重要。
来源
Node.js 在存储库中将依赖项组织在 deps/ 目录中。每个依赖项通常包含为一个 Git 子模块或作为源代码的 vendored 副本。
来源
Node.js 提供了多种配置选项来管理依赖项的构建和链接方式
下表列出了共享依赖项的关键配置选项
| 依赖项 | Configure Flag | Default Library Name |
|---|---|---|
| http_parser | --shared-http-parser | http_parser |
| libuv | --shared-libuv | uv |
| nghttp2 | --shared-nghttp2 | nghttp2 |
| OpenSSL | --shared-openssl | crypto,ssl |
| zlib | --shared-zlib | z |
| brotli | --shared-brotli | brotlidec,brotlienc |
| c-ares | --shared-cares | cares |
| ICU | Various ICU options | - |
对于每个共享库,Node.js 还提供额外的配置选项
--shared-{dependency}-includes:包含头文件的目录--shared-{dependency}-libname:用于链接的备用库名称--shared-{dependency}-libpath:用于搜索共享库的目录来源
Node.js 还管理 JavaScript 模块依赖项,这些模块通常是捆绑的,但也可以共享
来源
Node.js 使用自动化工作流来更新其依赖项。此过程通过 GitHub Actions 实现,这些 Actions 定期运行以检查更新,并在有新版本可用时创建拉取请求。
来源
Node.js 的构建系统通过 GYP(Generate Your Projects)构建配置系统来管理依赖项。依赖项在各种 .gyp 和 .gypi 文件中定义,主要配置在 node.gyp 中。
node.gyp 文件包含控制依赖项如何集成的变量
来源
用于在构建过程中配置依赖项的 configure.py 脚本提供了许多选项
当运行 configure 脚本时,它会生成 config.gypi,然后 GYP 构建系统会使用它来正确链接依赖项。
来源
V8 JavaScript 引擎是 Node.js 最关键的依赖项之一。由于其复杂性和重要性,它通过一个专门的过程进行集成。
V8 通过以下机制进行集成
tools/v8_gypfiles/ 中的 GYP 构建文件configure.py 中的 V8 特定配置选项来源
Node.js 在 tools/dep_updaters/ 目录中维护依赖项的更新脚本。这些脚本由自动化工作流用于检查和应用更新。
每个依赖项都有其自己的更新脚本,该脚本处理更新该依赖项的特定要求,包括:
来源
Node.js 根据目标平台以不同的方式处理依赖项。构建系统包含针对以下方面的特殊处理:
来源
ICU 库提供国际化支持,并有几个配置选项
--with-intl=full-icu: 全国际化支持(默认)--with-intl=small-icu: 最小国际化支持(仅限英语)--with-intl=none: 无国际化支持--with-icu-source: 自定义 ICU 源路径--with-icu-path: 自定义 ICU 构建路径来源
OpenSSL 提供加密功能,并有几个配置选项
--shared-openssl: 使用共享 OpenSSL 库--openssl-no-asm: 禁用汇编优化--openssl-system-ca-path: 指定系统 CA 路径--openssl-default-cipher-list: 自定义默认密码列表来源
Node.js 中的依赖项管理涉及一个复杂的配置选项、构建过程和自动化更新工作流系统。该系统确保 Node.js 可以针对不同的平台和用例使用适当的依赖项进行构建,同时还能保持依赖项的最新和安全。