菜单

构建系统

相关源文件

此页面记录了 Node.js 的构建系统,该系统负责在各种平台上配置、编译和打包 Node.js。它解释了构建架构、配置过程和跨平台构建机制。

有关运行测试的信息,请参阅测试和质量保证

构建系统架构

Node.js 构建系统基于多层架构,可将高级构建配置转换为特定于平台的构建指令。

来源:configure.py node.gyp Makefile vcbuild.bat tools/gyp_node.py

配置过程

Node.js 的构建配置过程是构建管道的第一步。它将用户需求转换为机器可读的配置。

来源:configure.py vcbuild.bat node.gyp422-423

配置文件

Node.js 构建系统中的关键配置文件包括:

文件目的
node.gyp描述目标、源文件和依赖关系的主要构建定义文件
common.gypi通用构建变量和设置
config.gypi包含特定于平台和用户配置设置的生成文件
node.gypiNode 特定的编译设置和选项
tools/v8_gypfiles/*.gypiV8 特定构建配置

来源:node.gyp node.gypi tools/v8_gypfiles/features.gypi tools/v8_gypfiles/toolchain.gypi

关键构建变量

配置过程会设置许多控制构建的变量

类别示例目的
架构target_arch, v8_target_arch指定目标 CPU 架构
模式debug, release影响优化和符号的构建类型
特性v8_enable_i18n_support, openssl_no_asm启用/禁用特定功能
依赖项node_shared_zlib, node_shared_openssl控制静态/动态链接
路径prefix, node_builtin_modules_path安装和模块路径

来源:configure.py42-60 configure.py91-139 node.gyp1-34

构建流程

配置完成后,构建过程会将 Node.js 及其依赖项编译成可执行文件和库文件。

来源:Makefile107-136 node.gyp502-594 node.gyp822-997

构建目标

Node.js 的主要构建目标包括:

目标描述可执行文件/位置
node_core_target_name主要的 Node.js 可执行文件out/Release/node
node_lib_target_nameNode.js 核心库out/Release/libnode.aout/Release/libnode.so
v8_base_without_compiler核心 V8 引擎libnode 的一部分
mksnapshot创建 V8 快照的工具out/Release/mksnapshot
cctestC++ 单元测试框架out/Release/cctest

来源:node.gyp517-736 node.gyp822-894 tools/v8_gypfiles/v8.gyp395-436

跨平台构建

Node.js 可以在各种平台上进行构建,每个平台都有其特定的要求和过程。

Unix/macOS 构建

对于包括 Linux 和 macOS 在内的类 Unix 系统,构建过程使用 configure.py 来生成配置,并使用 make 来执行构建。

来源:BUILDING.md267-278 Makefile267-308

Windows 构建

在 Windows 上,构建过程使用 vcbuild.bat 通过 Visual Studio 构建工具进行配置和构建。

来源:BUILDING.md761-776 vcbuild.bat762-815

依赖管理

Node.js 拥有几个核心依赖项,这些依赖项在构建过程中进行管理。

来源: node.gyp17-27 configure.py266-553 BUILDING.md129-192

共享库与静态库

Node.js 提供选项,可使用捆绑的静态库或系统提供的共享库。

依赖项静态选项共享选项配置变量
OpenSSL捆绑系统node_shared_openssl
zlib捆绑系统node_shared_zlib
libuv捆绑系统node_shared_libuv
http_parser捆绑系统node_shared_http_parser
nghttp2捆绑系统node_shared_nghttp2
ICU各种模式系统 ICUwith_intl

来源: configure.py259-554 node.gyp17-28

构建优化

构建系统包含各种优化,以提高构建性能和二进制文件的大小/性能。

性能优化

优化标志描述
ccache--use-ccache-win通过缓存中间输出来加速编译。
链接时优化--enable-lto在链接时启用跨模块优化。
基于配置文件的优化--enable-pgo-generate/--enable-pgo-use使用运行时配置文件数据来优化代码。
NinjaBUILD_WITH=ninja另一个更快的构建系统。
基于磁盘的 JS 文件--node-builtin-modules-path从磁盘加载 JS 文件,而不是嵌入。

来源: configure.py208-215 BUILDING.md544-592 Makefile140-149

安装

构建后,Node.js 可以安装到系统中。

来源: tools/install.py91-116 tools/install.py152-205 Makefile190-193

常见问题排查

常见的构建问题及解决方案

问题可能解决方案
缺少依赖项安装所需的开发包
编译器版本不匹配使用推荐的编译器版本。
OpenSSL ASM 故障使用 --openssl-no-asm 进行构建。
文件未找到错误尝试 make distclean 并重新构建。
内存错误使用 -j2 减少并行任务数,或增加 RAM。
Windows vcpkg 问题运行 vcpkg integrate remove

来源: BUILDING.md595-609 BUILDING.md626-631

高级构建选项

Node.js 为特定用例提供了一些高级构建选项。

选项描述用例
--debug启用带符号的调试构建。调试和开发
--fully-static创建完全静态的可执行文件。容器化部署
--enable-vtune-profiling启用 Intel VTune 性能分析器支持。性能分析
--coverage启用代码覆盖率。测试覆盖率测量
--openssl-fips使用符合 FIPS 标准的 OpenSSL 构建。安全合规性
--without-intl禁用国际化支持。更小的二进制文件大小

来源: configure.py92-126 configure.py189-207 BUILDING.md489-502

单一可执行应用程序

Node.js 支持构建单一可执行应用程序 (SEA)。

Node.js 默认启用 SEA 支持,除非使用 --disable-single-executable-application 配置标志明确禁用。

来源: configure.py169-173 node.gyp138