菜单

依赖管理

相关源文件

本文档介绍了 Node.js 如何管理其依赖项,包括 V8、libuv 等核心依赖项。它解释了依赖项如何在 Node.js 代码库中集成、配置和更新。有关构建配置过程本身的信息,请参阅 构建配置

概述

Node.js 依赖于几个关键的依赖项来提供其核心功能。这些依赖项包括 JavaScript 引擎、事件循环库、加密库以及各种其他组件。管理这些依赖项对于确保 Node.js 保持稳定、安全和高性能至关重要。

来源

核心依赖项结构

Node.js 在存储库中将依赖项组织在 deps/ 目录中。每个依赖项通常包含为一个 Git 子模块或作为源代码的 vendored 副本。

来源

依赖项配置选项

Node.js 提供了多种配置选项来管理依赖项的构建和链接方式

  1. 共享库与静态库:依赖项可以构建为共享库或静态链接到 Node.js 中。
  2. 系统依赖项与捆绑依赖项:Node.js 可以使用系统提供的库或其捆绑的版本。
  3. 功能配置:某些依赖项可以配置为启用或禁用特定功能。

共享库配置

下表列出了共享依赖项的关键配置选项

依赖项Configure FlagDefault Library Name
http_parser--shared-http-parserhttp_parser
libuv--shared-libuvuv
nghttp2--shared-nghttp2nghttp2
OpenSSL--shared-opensslcrypto,ssl
zlib--shared-zlibz
brotli--shared-brotlibrotlidec,brotlienc
c-ares--shared-carescares
ICUVarious ICU options-

对于每个共享库,Node.js 还提供额外的配置选项

  • --shared-{dependency}-includes:包含头文件的目录
  • --shared-{dependency}-libname:用于链接的备用库名称
  • --shared-{dependency}-libpath:用于搜索共享库的目录

来源

内置可共享的 JavaScript 模块

Node.js 还管理 JavaScript 模块依赖项,这些模块通常是捆绑的,但也可以共享

来源

依赖项更新工作流

Node.js 使用自动化工作流来更新其依赖项。此过程通过 GitHub Actions 实现,这些 Actions 定期运行以检查更新,并在有新版本可用时创建拉取请求。

来源

构建系统集成

Node.js 的构建系统通过 GYP(Generate Your Projects)构建配置系统来管理依赖项。依赖项在各种 .gyp.gypi 文件中定义,主要配置在 node.gyp 中。

node.gyp 中的依赖项变量

node.gyp 文件包含控制依赖项如何集成的变量

来源

Configure 脚本选项

用于在构建过程中配置依赖项的 configure.py 脚本提供了许多选项

  1. 共享库选项:控制是使用共享链接还是静态链接
  2. 包含路径:指定查找依赖项头文件的位置
  3. 库路径:指定查找依赖项库的位置
  4. 功能标志:启用或禁用依赖项中的特定功能

当运行 configure 脚本时,它会生成 config.gypi,然后 GYP 构建系统会使用它来正确链接依赖项。

来源

V8 集成

V8 JavaScript 引擎是 Node.js 最关键的依赖项之一。由于其复杂性和重要性,它通过一个专门的过程进行集成。

V8 通过以下机制进行集成

  1. 位于 tools/v8_gypfiles/ 中的 GYP 构建文件
  2. 用于重新构建 V8 的特殊 Makefile 目标
  3. 位于 configure.py 中的 V8 特定配置选项

来源

依赖项更新脚本

Node.js 在 tools/dep_updaters/ 目录中维护依赖项的更新脚本。这些脚本由自动化工作流用于检查和应用更新。

每个依赖项都有其自己的更新脚本,该脚本处理更新该依赖项的特定要求,包括:

  1. 检查新版本
  2. 下载新版本
  3. 更新必要的文件
  4. 创建适当的提交消息

来源

平台特定依赖项

Node.js 根据目标平台以不同的方式处理依赖项。构建系统包含针对以下方面的特殊处理:

  1. Windows:使用 Visual Studio 工具和库
  2. macOS:使用 Xcode 和 macOS 特定设置
  3. Linux/Unix:使用平台特定的工具链
  4. 交叉编译:针对不同架构时进行特殊处理

来源

特殊依赖项

ICU (International Components for Unicode)

ICU 库提供国际化支持,并有几个配置选项

  • --with-intl=full-icu: 全国际化支持(默认)
  • --with-intl=small-icu: 最小国际化支持(仅限英语)
  • --with-intl=none: 无国际化支持
  • --with-icu-source: 自定义 ICU 源路径
  • --with-icu-path: 自定义 ICU 构建路径

来源

OpenSSL

OpenSSL 提供加密功能,并有几个配置选项

  • --shared-openssl: 使用共享 OpenSSL 库
  • --openssl-no-asm: 禁用汇编优化
  • --openssl-system-ca-path: 指定系统 CA 路径
  • --openssl-default-cipher-list: 自定义默认密码列表

来源

结论

Node.js 中的依赖项管理涉及一个复杂的配置选项、构建过程和自动化更新工作流系统。该系统确保 Node.js 可以针对不同的平台和用例使用适当的依赖项进行构建,同时还能保持依赖项的最新和安全。