本页面介绍了 Node.js 中的构建配置系统,解释了如何在不同平台上配置和构建代码库。它涵盖了配置过程、构建工具和支持的构建选项。有关跨平台构建的详细信息,请参阅跨平台构建。
Node.js 使用支持各种平台、架构和构建选项的多阶段构建配置系统。构建过程从配置阶段开始,该阶段生成特定于平台的构建文件,然后进行实际编译。
构建系统基于 GYP(Generate Your Projects),它从一组配置文件生成特定于平台的构建文件。Node.js 还支持使用 Ninja 进行构建,以提高构建性能。
来源:configure.py173-257 node.gyp1-40 Makefile177-188 vcbuild.bat192-212
配置过程因平台而异
在包括 macOS 在内的类 Unix 系统上,构建配置始于 ./configure 脚本,它是 configure.py 的封装。此脚本会:
config.gypi在 Windows 上,配置和构建过程由 vcbuild.bat 管理,它会:
configure.py 以生成 config.gypi来源:configure.py44-631 vcbuild.bat77-159 Makefile182-188
Node.js 构建系统依赖于几个关键配置文件
| 文件 | 目的 |
|---|---|
| node.gyp | 主构建配置文件,描述目标、源和依赖项 |
| common.gypi | 通用构建设置和编译器选项 |
| config.gypi | 由配置脚本生成的平台特定设置文件 |
| node.gypi | node.gyp 包含的 Node.js 特定构建定义 |
| vcbuild.bat | Windows 构建脚本 |
| Makefile | Unix 构建脚本 |
来源:node.gyp1-820 node.gypi1-146 Makefile1-105 vcbuild.bat22-76
Node.js 构建配置支持控制构建执行方式的众多变量和选项。以下是一些最重要的:
| 选项 | 描述 | 默认 |
|---|---|---|
| --debug | 使用调试配置进行构建 | 发布 |
| --dest-cpu=x64/arm64/... | 设置目标 CPU 架构 | 宿主架构 |
| --dest-os=... | 设置目标操作系统 | 宿主操作系统 |
| --shared | 构建为共享库 (DLL) | false |
| --with-intl=... | 国际化支持级别 | full-icu |
| --openssl-no-asm | 禁用 OpenSSL 汇编优化 | false |
| --without-npm | 构建时不包含 npm | false |
| --without-snapshot | 构建时不包含 V8 快照 | false |
| --use-largepages | 启用大页支持 | false |
来源:configure.py84-139 configure.py713-739 vcbuild.bat77-159 node.gyp2-34
Node.js 构建系统定义了几个重要的目标
| 目标 | 描述 |
|---|---|
| node | 主 Node.js 可执行文件 |
| libnode | 作为共享库的 Node.js |
| v8_init | V8 初始化代码 |
| v8_snapshot | V8 快照 |
| test | 运行测试套件 |
| doc | 构建文档 |
| build-addons | 构建原生插件测试 |
来源:node.gyp502-820 node.gyp822-1020 Makefile106-120 Makefile332-363
Node.js 构建系统管理着几个关键依赖项
构建系统允许通过 --shared-* 配置选项使用这些依赖项的捆绑版本或系统提供的版本。
来源:node.gyp17-27 configure.py260-596 node.gypi146-163
Node.js 可以构建为静态链接或动态链接依赖项
| 配置 | 描述 |
|---|---|
| 静态 (默认) | 依赖项从源代码构建并静态链接 |
| 共享 | 依赖项从系统库动态链接 |
共享库选项通过配置脚本中的 --shared-* 标志控制
./configure --shared-openssl --shared-zlib --shared-libuv
对于每个依赖项,您还可以指定包含路径和库路径
./configure --shared-openssl --shared-openssl-includes=/path/to/includes --shared-openssl-libpath=/path/to/libs
来源:configure.py266-596 node.gyp429-442 node.gypi44-59
Node.js 通过 ICU 库提供多种国际化支持选项
| 选项 | 描述 |
|---|---|
| --with-intl=full-icu | 完整国际化支持(默认) |
| --with-intl=small-icu | 最小国际化支持(仅英文) |
| --with-intl=none | 无国际化支持 |
| --with-icu-source=path | 从特定源使用 ICU |
| --with-icu-default-data-dir=path | 指定 ICU 数据目录 |
来源:configure.py713-739 node.gyp117-134
构建系统自动处理平台特定设置
Node.js 通过以下选项支持交叉编译
./configure --dest-cpu=arm64 --dest-os=android --cross-compiling
来源:configure.py116-125 vcbuild.bat214-307 node.gyp564-605
Node.js 集成了 V8 JavaScript 引擎,构建系统处理 V8 特定配置
| 选项 | 描述 |
|---|---|
| --v8-options | 将选项传递给 V8 |
| --experimental-enable-pointer-compression | 启用 V8 指针压缩(仅限 64 位) |
| --trace-maps | 启用 V8 映射追踪 |
来源:configure.py635-647 tools/v8_gypfiles/v8.gyp1-36 tools/v8_gypfiles/features.gypi155-163
对于开发工作流,Node.js 提供了优化构建速度的选项
./configure --use-ccache (或设置 CC="ccache gcc")./configure --node-builtin-modules-path "$(pwd)"来源:BUILDING.md534-594 configure.py128-141 Makefile279-282
Node.js 构建系统由几个协同工作的关键组件组成
来源:configure.py1-42 node.gyp37-39 Makefile173-188
在 Unix/macOS 上
在 Windows 上
vcbuild
在 Unix/macOS 上
在 Windows 上
vcbuild debug
来源:BUILDING.md274-288 vcbuild.bat77-159 Makefile106-120
Node.js 构建配置系统提供了一种灵活而强大的方式,可以为不同的平台、架构和用例构建 Node.js。了解配置选项和构建过程有助于开发人员更有效地使用 Node.js 代码库。
有关构建 Node.js 特定方面的更多详细信息,请参阅以下资源