Node.js 附带各种命令行选项。这些选项提供了内置的调试功能、多种执行脚本的方式以及其他有用的运行时选项。
若要在终端中将此文档查看为手册页,请运行 man node。
node [options] [V8 options] [<program-entry-point> | -e "script" | -] [--] [arguments]
node inspect [<program-entry-point> | -e "script" | <host>:<port>] …
node --v8-options
不带参数执行以启动 REPL。
有关 node inspect 的更多信息,请参阅 [debugger][] 文档。
程序入口点是一个类似说明符的字符串。如果该字符串不是绝对路径,则它会从当前工作目录解析为相对路径。然后,该入口点字符串的解析方式就好像它是从当前工作目录通过 require() 请求的一样。如果找不到相应的文件,则会抛出错误。
默认情况下,解析后的路径的加载方式也好像它是通过 require() 请求的,除非适用以下条件之一——那么它的加载方式就好像它是通过 import() 请求的:
- 程序的启动使用了强制通过 ECMAScript 模块加载器加载入口点的命令行标志,例如
--import。 - 文件的扩展名为
.mjs、.mts或.wasm。 - 文件没有
.cjs扩展名,并且最近的父级package.json文件包含值为"module"的顶层"type"字段。
有关更多详细信息,请参阅 [module resolution and loading][]。
稳定性:2 - 稳定
所有选项(包括 V8 选项)都允许单词之间使用连字符(-)或下划线(_)分隔。例如,--pending-deprecation 等同于 --pending_deprecation。
如果传递了多次接受单个值的选项(例如 --max-http-header-size),则使用最后传递的值。命令行选项优先于通过 NODE_OPTIONS 环境变量传递的选项。
如果传递了此标志,仍然可以通过 process.setUncaughtExceptionCaptureCallback()(以及通过使用它的 node:domain 模块)将行为设置为不中止。
当使用 [权限模型][] 时,进程默认将无法使用原生插件。
除非用户在启动 Node.js 时显式传递 --allow-addons 标志,否则尝试这样做将抛出 ERR_DLOPEN_DISABLED。
示例:
// 尝试 require 一个原生插件
require('nodejs-addon-example');当使用 Permission Model 时,进程默认将无法生成任何子进程。
除非用户在启动 Node.js 时显式传递 --allow-child-process 标志,否则尝试这样做将抛出 ERR_ACCESS_DENIED。
示例:
const childProcess = require('node:child_process');
// 尝试绕过权限
childProcess.spawn('node', ['-e', 'require("fs").writeFileSync("/new-file", "example")']);child_process.fork() API 从父进程继承执行参数。这意味着如果 Node.js 启动时启用了权限模型并设置了 --allow-child-process 标志,则使用 child_process.fork() 创建的任何子进程都将自动接收所有相关的权限模型标志。
此行为也适用于 child_process.spawn(),但在这种情况下,标志是通过 NODE_OPTIONS 环境变量传播的,而不是直接通过进程参数。
当使用 Permission Model 时,进程默认将无法使用 FFI
API。尝试使用 FFI API 将抛出一个 ERR_ACCESS_DENIED
异常,除非用户在启动 Node.js 时显式传递 --allow-ffi 标志。
node:ffi 模块还需要
--experimental-ffi 标志,并且仅在具备 FFI 支持的构建中可用。
示例:
const { DynamicLibrary } = require('node:ffi');
const lib = new DynamicLibrary('mylib.so');--allow-fs-read 标志的有效参数为:
*- 允许所有FileSystemRead操作。- 可以使用多个
--allow-fs-read标志允许多个路径。 示例--allow-fs-read=/folder1/ --allow-fs-read=/folder2/
示例可以在 文件系统权限 文档中找到。
初始化模块和自定义 --require 模块具有隐式读取权限。
$ node --permission -r custom-require.js -r custom-require-2.js index.jscustom-require.js、custom-require-2.js和index.js默认将在允许的读取列表中。
process.permission.has('fs.read', 'index.js'); // true
process.permission.has('fs.read', 'custom-require.js'); // true
process.permission.has('fs.read', 'custom-require-2.js'); // true--allow-fs-write 标志的有效参数为:
*- 允许所有FileSystemWrite操作。- 可以使用多个
--allow-fs-write标志来允许多个路径。 示例--allow-fs-write=/folder1/ --allow-fs-write=/folder2/
不再允许使用逗号 (,) 分隔的路径。
当传递带有逗号的单个标志时,将显示警告。
示例可以在 文件系统权限 文档中找到。
当使用 [权限模型][] 时,进程将无法通过检查器协议连接。
除非用户在启动 Node.js 时显式传递 --allow-inspector 标志,否则尝试这样做将抛出 ERR_ACCESS_DENIED。
示例:
const { Session } = require('node:inspector/promises');
const session = new Session();
session.connect();当使用 Permission Model 时,进程默认将无法访问网络。
除非用户在启动 Node.js 时显式传递 --allow-net 标志,否则尝试这样做将抛出 ERR_ACCESS_DENIED。
示例:
const http = require('node:http');
// 尝试绕过权限
const req = http.get('http://example.com', () => {});
req.on('error', (err) => {
console.log('err', err);
});当使用 Permission Model 时,进程默认将无法创建任何 WASI 实例。
出于安全原因,除非用户在主 Node.js 进程中显式传递 --allow-wasi 标志,否则调用将抛出 ERR_ACCESS_DENIED。
示例:
const { WASI } = require('node:wasi');
// 尝试绕过权限
new WASI({
version: 'preview1',
// 尝试挂载整个文件系统
preopens: {
'/': '/',
},
});当使用 Permission Model 时,进程默认将无法创建任何工作线程。
出于安全原因,除非用户在主 Node.js 进程中显式传递 --allow-worker 标志,否则调用将抛出 ERR_ACCESS_DENIED。
示例:
const { Worker } = require('node:worker_threads');
// 尝试绕过权限
new Worker(__filename);从 JSON 配置文件生成 [single executable application][]。参数必须是配置文件的路径。如果路径不是绝对路径,则相对于当前工作目录解析。
有关配置字段、跨平台说明和资源 API,请参阅 [single executable application][] 文档。
构建快照时,如果未指定 --snapshot-blob,则生成的 blob 默认将写入当前工作目录中的 snapshot.blob。否则,它将写入 --snapshot-blob 指定的路径。
$ echo "globalThis.foo = 'I am from the snapshot'" > snapshot.js
# 运行 snapshot.js 来初始化应用程序并将其状态快照到 snapshot.blob 中。
$ node --snapshot-blob snapshot.blob --build-snapshot snapshot.js
$ echo "console.log(globalThis.foo)" > index.js
# 加载生成的快照并从 index.js 启动应用程序。
$ node --snapshot-blob snapshot.blob index.js
I am from the snapshotv8.startupSnapshot API 可用于在快照构建时指定入口点,从而避免在反序列化时需要额外的入口脚本:
$ echo "require('v8').startupSnapshot.setDeserializeMainFunction(() => console.log('I am from the snapshot'))" > snapshot.js
$ node --snapshot-blob snapshot.blob --build-snapshot snapshot.js
$ node --snapshot-blob snapshot.blob
I am from the snapshot有关更多信息,请查看 v8.startupSnapshot API 文档。
快照当前仅支持在快照构建过程中加载单个入口点,它可以加载内置模块,但不能加载额外的用户态模块。 在构建快照之前,用户可以使用自己选择的打包工具将应用程序打包成单个脚本。
由于确保所有内置模块的可序列化性很复杂,而且这些模块也在不断增长,因此只有一部分内置模块经过充分测试,可以在快照构建过程中序列化。
Node.js 核心测试套件检查了几个相当复杂的应用程序是否可以快照化。被 [TRANSDOC_LOCK_14][] 的内置模块列表被视为受支持。
当快照构建器遇到无法序列化的内置模块时,它可能会导致快照构建过程崩溃。在这种情况下,典型的解决方法是延迟加载该模块直到运行时,使用 v8.startupSnapshot.setDeserializeMainFunction() 或 v8.startupSnapshot.addDeserializeCallback()。如果需要在快照构建过程中为额外的模块进行序列化,请在 [Node.js 问题跟踪器][] 中提交请求,并将其链接到 [用户态快照的跟踪问题][].
目前支持以下选项:
<string>--build-snapshot
并将
builder
作为主脚本名称一样。<boolean>使用此标志时,命令行上提供的其他脚本文件将不会执行,而是被解释为常规命令行参数。
node --completion-bash > node_bash_completion
source node_bash_completion允许任意数量的自定义字符串条件名称。
默认的 Node.js 条件 "node"、"default"、"import" 和 "require" 将始终按定义应用。
例如,要以 "development" 解析运行模块:
node -C development app.js如果未指定 --cpu-prof-dir,则生成的配置文件将放置在当前工作目录中。
如果未指定 --cpu-prof-name,则生成的配置文件命名为 CPU.${yyyymmdd}.${hhmmss}.${pid}.${tid}.${seq}.cpuprofile。
$ node --cpu-prof index.js
$ ls *.cpuprofile
CPU.20190409.202950.15293.0.0.cpuprofile如果指定了 --cpu-prof-name,则提供的值用作文件名的模板。支持以下占位符,并将在运行时替换:
${pid}— 当前进程 ID
$ node --cpu-prof --cpu-prof-name 'CPU.${pid}.cpuprofile' index.js
$ ls *.cpuprofile
CPU.15293.cpuprofile默认值由 --diagnostic-dir 命令行选项控制。
影响以下内容的默认输出目录:
按 code 或 type 禁用特定的进程警告。
从 process.emitWarning() 发出的警告可能包含 code 和 type。此选项将不发出具有匹配 code 或 type 的警告。
[deprecation warnings][] 列表。
Node.js 核心警告类型为:DeprecationWarning 和 ExperimentalWarning
例如,以下脚本在使用 node --disable-warning=DEP0025 执行时将不发出 DEP0025 require('node:sys'):
import sys from 'node:sys';例如,以下脚本在使用 node --disable-warning=ExperimentalWarning 执行时将发出 [DEP0025 require('node:sys')][DEP0025 警告],但不发出任何实验性警告(例如 <=v21 中的 [实验性警告:vm.measureMemory 是一项实验性功能][]):
import sys from 'node:sys';
import vm from 'node:vm';
vm.measureMemory();在启动时,Node.js 自动检查是否有足够的虚拟内存可用以分配至少一个笼,如果没有,则自动禁用陷阱处理程序优化,以便 WebAssembly 仍然可以使用内联边界检查运行(性能较差)。但是,如果应用程序需要创建许多 WebAssembly 内存实例,并且机器仍然配置了相对较高的虚拟内存限制,由于虚拟内存使用量增加,WebAssembly 内存实例的分配仍可能比预期更快地失败。
--disable-wasm-trap-handler 完全禁用此优化,以便 WebAssembly 内存实例始终使用内联边界检查,而不是保留大虚拟内存笼。当 Node.js 进程可用的虚拟内存地址空间有限时,这允许创建更多实例。
ipv4first:将默认order设置为ipv4first。ipv6first:将默认order设置为ipv6first。verbatim:将默认order设置为verbatim。
默认值为 verbatim,并且 dns.setDefaultResultOrder() 的优先级高于 --dns-result-order。
使用转译器(如 TypeScript)时,应用程序抛出的堆栈跟踪引用的是转译后的代码,而不是原始源位置。--enable-source-maps 启用源映射的缓存,并尽最大努力报告相对于原始源文件的堆栈跟踪。
覆盖 Error.prepareStackTrace 可能会阻止 --enable-source-maps 修改堆栈跟踪。在覆盖函数中调用并返回原始 Error.prepareStackTrace 的结果以使用源映射修改堆栈跟踪。
const originalPrepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = (error, trace) => {
// 修改错误和跟踪,并使用原始的 Error.prepareStackTrace 来格式化堆栈跟踪。
return originalPrepareStackTrace(error, trace);
};注意,启用源映射可能会在访问 Error.stack 时给应用程序带来延迟。如果在应用程序中频繁访问 Error.stack,请考虑 --enable-source-maps 的性能影响。
如果存在,Node.js 将把入口点解释为 URL,而不是路径。
遵循 ECMAScript module 解析规则。
URL 中的任何查询参数或哈希都可以通过 import.meta.url 访问。
node --entry-url 'file:///path/to/file.js?queryparams=work#and-hashes-too'
node --entry-url 'file.ts?query#hash'
node --entry-url 'data:text/javascript,console.log("Hello")'您可以传递多个 --env-file 参数。后续文件会覆盖先前文件中定义的现有变量。
如果文件不存在,则抛出错误。
node --env-file=.env --env-file=.development.env index.js文件的格式应为每行一个环境变量名称和值的键值对,由 = 分隔:
PORT=3000# 之后的任何文本都被视为注释:
# 这是一个注释
PORT=3000 # 这也是一个注释值可以以以下引号开始和结束:`、" 或 '。它们会从值中省略。
USERNAME="nodejs" # 将导致 `nodejs` 作为值。支持多行值:
MULTI_LINE="THIS IS
A MULTILINE"
# 将导致 `THIS IS\nA MULTILINE` 作为值。键之前的 export 关键字会被忽略:
export USERNAME="nodejs" # 将导致 `nodejs` 作为值。如果您想从可能不存在的文件加载环境变量,可以改用 --env-file-if-exists 标志。
如果 script 以 - 开头,请使用 = 传递它(例如,node --print --eval=-42),以便将其解析为 --eval 的值。
在 Windows 上,使用 cmd.exe 时单引号将无法正常工作,因为它只识别双 " 进行引号。在 Powershell 或 Git bash 中,' 和 " 均可用。
除非提供 --no-strip-types 标志,否则可以运行包含内联类型的代码。
启用对 .node 插件的实验性导入支持。
如果存在,Node.js 将在指定路径查找配置文件。
如果未指定路径,Node.js 将在当前工作目录中查找 node.config.json 文件。
要指定自定义路径,请使用 --experimental-config-file=path 形式。
不支持空格分隔的 --experimental-config-file path 形式。
别名 --experimental-default-config-file 等同于不带参数的 --experimental-config-file。
Node.js 将读取配置文件并应用设置。配置文件应为具有以下结构的 JSON 文件。$schema 中的 vX.Y.Z 必须替换为您正在使用的 Node.js 版本,或者为该主版本最新版本使用 latest-vX.x。
{
"$schema": "https://nodejs.org/dist/vX.Y.Z/docs/node-config-schema.json",
"nodeOptions": {
"import": [
"amaro/strip"
],
"watch-path": "src",
"watch-preserve-output": true
},
"test": {
"test-isolation": "process"
},
"watch": {
"watch-preserve-output": true
}
}配置文件支持特定于命名空间的选项:
-
nodeOptions字段包含NODE_OPTIONS中允许的 CLI 标志。 -
命名空间字段(如
test、watch和permission)包含特定于该子系统的配置。
配置文件可以使用 nodeVersion 目标指向特定的 Node.js 主版本:
{
"nodeVersion": 25,
"nodeOptions": {
"watch-path": "src"
}
}要在同一文件中保留多个特定版本的配置,请使用 configs 数组。Node.js 将使用 nodeVersion 与当前 Node.js 主版本匹配的第一个条目:
{
"$schema": "https://nodejs.org/dist/latest-v26.x/docs/node-config-schema.json",
"configs": [
{
"nodeVersion": 25,
"config": {
"$schema": "https://nodejs.org/dist/latest-v25.x/docs/node-config-schema.json",
"nodeOptions": {
"watch-path": "src"
}
}
}
]
}使用 configs 时,顶层只能包含 $schema 和 configs。每个 configs 项必须定义一个整数 nodeVersion 和一个对象 config。单个顶层配置不需要 nodeVersion,但如果存在,则必须与当前 Node.js 主版本匹配。
当配置文件中存在命名空间时,Node.js 会自动启用相应标志(例如 --test、--watch、--permission)。这允许您在不显式在命令行中传递该标志的情况下配置特定子系统的选项。
例如:
{
"test": {
"test-isolation": "process"
}
}等同于:
node --test --test-isolation=process要禁用自动标志而仍使用命名空间选项,您可以在命名空间内将标志显式设置为 false:
{
"test": {
"test": false,
"test-isolation": "process"
}
}不支持无操作标志。 并非所有 V8 标志目前都受支持。
可以使用 官方 JSON 模式 验证配置文件,这可能因 Node.js 版本而异。 配置文件中的每个键对应于一个可以作为命令行参数传递的标志。键的值是将传递给标志的值。
例如,上面的配置文件等同于以下命令行参数:
node --import amaro/strip --watch-path=src --watch-preserve-output --test-isolation=process配置中的优先级如下:
- NODE_OPTIONS 和命令行选项
- Dotenv NODE_OPTIONS
- 配置文件
配置文件中的值不会覆盖环境变量、命令行选项或由 --env-file 标志解析的 NODE_OPTIONS env 文件中的值。
键不能在同一或不同命名空间内重复。
如果配置文件包含未知键或不能在命名空间中使用的键,配置解析器将抛出错误。
Node.js 不会清理或验证用户提供的配置,因此切勿使用不可信的配置文件。
此标志是 --experimental-config-file 不带参数的别名。
如果存在,Node.js 将在当前工作目录中查找 node.config.json 文件并将其作为配置文件加载。
启用对 DTLS 协议的实验性支持。有关详细信息,请参阅 dtls 文档。
启用实验性的 node:ffi 模块。
此标志仅在具备 FFI 支持的构建中可用。
之前限制了整个 import.meta.resolve 功能。
启用通过 with { type: 'text' } 导入模块的实验性支持。
启用对检查器网络资源的实验性支持。
指定包含导出的 [asynchronous module customization hooks][] 的 module。module 可以是任何接受为 [import specifier][] 的字符串。
如果与 [权限模型][] 一起使用,此功能需要 --allow-worker。
启用与 Chrome DevTools 进行网络检查的实验性支持。
启用实验性的包映射解析。path 参数指定定义包解析映射的 JSON 配置文件的位置。
node --experimental-package-map=./package-map.json app.js启用后,裸说明符解析会查询包映射以进行解析。 这使得可以显式控制哪些包可以导入哪些依赖项。
有关配置文件格式和解析算法的详细信息,请参阅 [包映射][].
启用 QUIC 协议的实验性支持。
使用此标志生成一个 blob,可以将其注入到 Node.js 二进制文件中以生成 [单文件可执行应用程序][]。有关详细信息,请参阅有关 此配置 的文档。
启用存储检查的实验性支持
启用实验性 node:stream/iter 模块。
在测试运行器中启用模块模拟。
如果与 [权限模型][] 一起使用,此功能需要 --allow-worker。
仅运行其标签集合包含 <tag> 的测试。测试通过
tags 选项在 test()、it()、suite() 或 describe() 上声明标签;标签
通过并集从套件继承到嵌套测试。过滤不区分大小写。
该标志可以指定多次;测试必须包含每一个 过滤值才能运行。有关声明和 继承标签的详细信息,请参阅 [测试标签][].
启用实验性的 node:vfs 模块。
启用与 Chrome DevTools 进行工作线程检查的实验性支持。
此标志将暴露 V8 的 gc 扩展。
if (globalThis.gc) {
globalThis.gc();
}为了防止现有插件使进程崩溃,默认情况下不启用此标志。将来,此标志将默认启用以强制正确的行为。
启用实验性冻结的内在对象,如 Array 和 Object。
仅支持根上下文。不能保证 globalThis.Array 确实是默认的内在对象引用。在此标志下代码可能会中断。
为了允许添加 polyfill,--require 和 --import 都在冻结内在对象之前运行。
如果未指定 --heap-prof-dir,则生成的配置文件将放置在当前工作目录中。
如果未指定 --heap-prof-name,则生成的配置文件命名为 Heap.${yyyymmdd}.${hhmmss}.${pid}.${tid}.${seq}.heapprofile。
$ node --heap-prof index.js
$ ls *.heapprofile
Heap.20190409.202950.15293.0.001.heapprofile默认值由 --diagnostic-dir 命令行选项控制。
生成快照时,可能会触发垃圾回收并降低堆使用量。因此,在 Node.js 实例最终耗尽内存之前,可能会向磁盘写入多个快照。可以比较这些堆快照以确定在连续快照拍摄期间分配了哪些对象。不能保证 Node.js 会向磁盘写入恰好 max_count 个快照,但当 max_count 大于 0 时,它会尽最大努力在 Node.js 实例耗尽内存之前生成至少一个、最多 max_count 个快照。
生成 V8 快照需要时间和内存(V8 堆管理的内存和 V8 堆之外的原生内存)。堆越大,需要的资源越多。Node.js 将调整 V8 堆以适应额外的 V8 堆内存开销,并尽最大努力避免使用进程可用的所有内存。当进程使用的内存超过系统认为适当的量时,根据系统配置,进程可能会被系统突然终止。
$ node --max-old-space-size=100 --heapsnapshot-near-heap-limit=3 index.js
Wrote snapshot to Heap.20200430.100036.49580.0.001.heapsnapshot
Wrote snapshot to Heap.20200430.100037.49580.0.002.heapsnapshot
Wrote snapshot to Heap.20200430.100038.49580.0.003.heapsnapshot
<--- Last few GCs --->
[49580:0x110000000] 4826 ms: Mark-sweep 130.6 (147.8) -> 130.5 (147.8) MB, 27.4 / 0.0 ms (average mu = 0.126, current mu = 0.034) allocation failure scavenge might not succeed
[49580:0x110000000] 4845 ms: Mark-sweep 130.6 (147.8) -> 130.6 (147.8) MB, 18.8 / 0.0 ms (average mu = 0.088, current mu = 0.031) allocation failure scavenge might not succeed
<--- JS stacktrace --->
FATAL ERROR: 接近堆限制时的无效标记压缩,分配失败 - JavaScript 堆内存不足
....在启动时预加载指定的模块。如果多次提供该标志,每个模块将按出现的顺序依次执行,从 NODE_OPTIONS 中提供的模块开始。
遵循 ECMAScript module 解析规则。
使用 --require 加载 CommonJS module。
使用 --require 预加载的模块将在使用 --import 预加载的模块之前运行。
模块被预加载到主线程以及任何工作线程、fork 的进程或集群进程中。
如果未提供 --input-type,
Node.js 将尝试通过以下步骤检测语法:
- 将输入作为 CommonJS 运行。
- 如果步骤 1 失败,将输入作为 ES 模块运行。
- 如果步骤 2 因 SyntaxError 失败,则剥离类型。
- 如果步骤 3 因错误代码
ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX或ERR_INVALID_TYPESCRIPT_SYNTAX失败,则抛出步骤 2 的错误,包括消息中的 TypeScript 错误,否则作为 CommonJS 运行。 - 如果步骤 4 失败,将输入作为 ES 模块运行。
为了避免多次语法检测传递的延迟,可以使用 --input-type=type 标志指定应如何解释 --eval 输入。
REPL 不支持此选项。将 --input-type=module 与 --print 一起使用将抛出错误,因为 --print 不支持 ES 模块语法。
启用后,解析器将接受以下内容:
- 无效的 HTTP 头值。
- 无效的 HTTP 版本。
- 允许消息同时包含
Transfer-Encoding和Content-Length头。 - 当存在
Connection: close时,允许消息后有额外数据。 - 提供
chunked后允许额外的传输编码。 - 允许使用
\n作为令牌分隔符,而不是\r\n。 - 允许在块后不提供
\r\n。 - 允许在块大小之后和
\r\n之前存在空格。
以上所有都将使您的应用程序暴露于请求走私或投毒攻击。避免使用此选项。
有关 Node.js 调试器的进一步说明,请参阅 V8 Inspector integration for Node.js。
有关 host 参数使用的 安全警告,请参阅下文。
默认主机为 127.0.0.1。如果指定端口 0,则将使用随机可用端口。
有关 host 参数使用的 安全警告,请参阅下文。
默认情况下,检查器 WebSocket URL 可在 stderr 中获取,并可在 http://host:port/json/list 上的 /json/list 端点下获取。
有关 Node.js 调试器的进一步说明,请参阅 V8 Inspector integration for Node.js。
有关 host 参数使用的 安全警告,请参阅下文。
V8 检查器集成允许 Chrome DevTools 和 IDE 等工具调试和配置 Node.js 实例。工具通过 tcp 端口附加到 Node.js 实例,并使用 Chrome DevTools Protocol 进行通信。有关 Node.js 调试器的进一步说明,请参阅 V8 Inspector integration for Node.js。
将检查器绑定到公共 IP(包括 0.0.0.0)并开放端口是不安全的,因为这允许外部主机连接到检查器并执行 远程代码执行 攻击。
如果指定主机,请确保:
- 主机无法从公共网络访问。
- 防火墙禁止端口上的未授权连接。
更具体地说,如果端口(默认为 9229)没有防火墙保护,则 --inspect=0.0.0.0 是不安全的。
有关更多信息,请参阅 调试安全影响 部分。
禁用 可执行内存的运行时分配。出于安全原因,某些平台可能需要此功能。它还可以减少其他平台上的攻击面,但性能影响可能很大。
用于存储 localStorage 数据的文件。如果该文件不存在,则在首次访问 localStorage 时创建它。同一个文件可以在多个 Node.js 进程之间并发共享。
percentage 参数必须是大于 0 且不超过 100 的数字,表示分配给 V8 堆的可用系统内存百分比。
注意: 此标志利用 --max-old-space-size,由于整数溢出问题,它在 32 位平台上可能不可靠。
# 使用 50% 的可用系统内存
node --max-old-space-size-percentage=50 index.js
# 使用 75% 的可用系统内存
node --max-old-space-size-percentage=75 index.js禁用在全局作用域上暴露 Navigator API.
--no-require-module 的遗留别名。
禁用 [Web 存储][] 支持。
请参阅 [使用 require() 加载 ECMAScript 模块][].
Pending deprecations are generally identical to runtime deprecations with
the notable exception that they are off by default and will not be emitted
unless either the --pending-deprecation command-line flag or the
NODE_PENDING_DEPRECATION=1 environment variable is set. Pending deprecations
are used to provide a selective "early warning" mechanism that
developers may leverage to detect use of deprecated APIs.
- 文件系统 - 可通过
--allow-fs-read,--allow-fs-write标志管理 - 网络 - 可通过
--allow-net标志管理 - 子进程 - 可通过
--allow-child-process标志管理 - 工作线程 - 可通过
--allow-worker标志管理 - WASI - 可通过
--allow-wasi标志管理 - 加载项 - 可通过
--allow-addons标志管理 - FFI - 可通过
--allow-ffi标志管理
默认情况下,当 Node.js 从符号链接到
不同磁盘位置的路径加载模块时,Node.js 将取消引用链接并使用模块的实际磁盘“真实路径”作为标识符和作为根
路径来定位其他依赖模块。在大多数情况下,此默认行为
是可以接受的。但是,当使用符号链接的对等依赖时,如下例所示,如果 moduleA 尝试 require moduleB 作为对等依赖,默认行为会导致抛出异常:
{appDir}
├── app
│ ├── index.js
│ └── node_modules
│ ├── moduleA -> {appDir}/moduleA
│ └── moduleB
│ ├── index.js
│ └── package.json
└── moduleA
├── index.js
└── package.json--preserve-symlinks 命令行标志指示 Node.js 对模块使用
符号链接路径而不是真实路径,允许找到符号链接的
对等依赖。
但是请注意,使用 --preserve-symlinks 可能会产生其他副作用。
具体来说,如果符号链接的_原生_模块从依赖树中的多个位置链接,则可能无法加载(Node.js 会将它们视为两个单独的模块并尝试多次加载模块,导致抛出异常)。
--preserve-symlinks 标志不适用于主模块,这允许
node --preserve-symlinks node_module/.bin/<foo> 工作。要对主模块应用相同的
行为,还请使用 --preserve-symlinks-main。
存在此标志是为了让主模块可以选择加入与
--preserve-symlinks 给予所有其他导入相同的行为;但是,它们是单独的标志,
为了与旧版 Node.js 版本向后兼容。
--preserve-symlinks-main 不隐含 --preserve-symlinks;当
不希望在使用相对路径解析之前跟随符号链接时,请除了
--preserve-symlinks 外还使用 --preserve-symlinks-main。
更多信息请参阅 --preserve-symlinks.
file 名称可以是绝对路径。如果不是,则写入它的默认目录由
--diagnostic-dir 命令行选项控制。
如果文件名设置为 'stdout' 或 'stderr',则报告分别写入
进程的 stdout 或 stderr。
遵循 require() 的模块解析
规则。module 可以是文件路径,也可以是 node 模块名称。
使用 --require 预加载的模块将在使用 --import 预加载的模块之前运行。
模块被预加载到主线程以及任何工作线程、 fork 的进程或集群进程中。
--run 将向上遍历到根目录并找到 package.json
文件以从中运行命令。
--run 将 ./node_modules/.bin 预先添加到当前目录的每个祖先目录的
PATH 中,'utility perhaps? noqa'
稳定性:1 - 实验性
要求最低百分比的覆盖函数。如果代码覆盖率未达到
指定的阈值,进程将以退出码 1 退出。
使用 glob 模式将特定文件包含在代码覆盖率中,该模式可以匹配 绝对和相对文件路径。
可以多次指定此选项以包含多个 glob 模式。
如果同时提供 --test-coverage-exclude 和 --test-coverage-include,
文件必须满足两者标准才能包含在覆盖率报告中。
要求最低百分比的覆盖行。如果代码覆盖率未达到
指定的阈值,进程将以退出码 1 退出。
指定一个模块,该模块将在所有测试执行之前求值,并 可用于为测试设置全局状态或测试固件。
有关更多详细信息,请参阅 [全局设置和 teardown][] 文档。
如果同时提供 --test-name-pattern 和 --test-skip-pattern,
测试必须满足两者要求才能执行。
值必须是 0 到 4294967295 之间的整数。
此标志不能与 --watch 或 --test-rerun-failures 一起使用。
用于随机化的种子会打印在测试摘要中,并且可以
与 --test-random-seed 一起重用。
有关详细行为和示例,请参阅 随机化测试执行顺序。
此标志不能与 --watch 或 --test-rerun-failures 一起使用。
index是正整数,划分部分的索引。total是正整数,划分部分的总数。
此命令将所有测试文件划分为 total 个相等部分,
并仅运行那些恰好在 index 部分中的文件。
例如,要将测试套件分为三部分,请使用此命令:
node --test --test-shard=1/3
node --test --test-shard=2/3
node --test --test-shard=3/3如果同时提供了 --test-name-pattern 和 --test-skip-pattern,
测试必须同时满足两个条件才能运行。
- Node.js 内部执行的环境变量读取。
- 形式为
process.env.KEY = "SOME VALUE"的写入。 - 形式为
process.env.KEY的读取。 - 形式为
Object.defineProperty(process.env, 'KEY', {...})的定义。 - 形式为
Object.hasOwn(process.env, 'KEY')、process.env.hasOwnProperty('KEY')或'KEY' in process.env的查询。 - 形式为
delete process.env.KEY的删除。 - 形式为
...process.env或Object.keys(process.env)的枚举。
仅打印被访问的环境变量的名称。不打印值。
要打印访问的堆栈跟踪,请使用 --trace-env-js-stack 和/或
--trace-env-native-stack。
当 mode 为 all 时,打印所有使用情况。当 mode 为 no-node-modules 时,排除
来自 node_modules 文件夹的使用情况。
启用此选项可能会对垃圾回收行为产生负面影响。
throw:发出unhandledRejection。如果未设置此钩子,则将未处理的拒绝作为未捕获异常抛出。这是默认值。strict:将未处理的拒绝作为未捕获异常抛出。如果异常已处理,则发出unhandledRejection。warn:始终触发警告,无论是否设置了unhandledRejection钩子,但不打印弃用警告。warn-with-error-code:发出unhandledRejection。如果未设置此钩子,则触发警告,并将进程退出代码设置为 1。none:静默所有警告。
如果在命令行入口点的 ES 模块静态 加载阶段发生拒绝,它将始终将其作为未捕获异常抛出。
Node.js 提供的捆绑 CA 存储是发布时固定的 Mozilla CA 存储 快照。它在所有支持的平台上都是相同的。
使用 OpenSSL 存储允许对外部修改存储。对于大多数 Linux 和 BSD 发行版,此存储由发行版 维护者和系统管理员维护。OpenSSL CA 存储位置取决于 OpenSSL 库的配置,但这可以在运行时使用 环境变量更改。
请参阅 SSL_CERT_DIR 和 SSL_CERT_FILE。
启用后,Node.js 会在启动期间解析 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY
环境变量,并通过指定的代理路由请求。
仅将此选项用于部署中受信任且已授权的代理。代理支持旨在通过授权的代理服务器访问外部网络,例如防火墙需要代理时。它不用于隐藏流量或规避网络策略。另请参阅 [内置代理支持][]。
这等同于设置 NODE_USE_ENV_PROXY=1 环境变量。两者同时设置时,--use-env-proxy 优先生效。
mode 的有效值如下:
off:不会尝试映射。这是默认值。on:如果操作系统支持,将尝试映射。映射失败将 被忽略,并且消息将打印到标准错误。silent:如果操作系统支持,将尝试映射。映射失败将 被忽略,并且不会报告。
在 Windows 和 macOS 上,证书信任策略类似于 [Chromium 的本地受信任证书策略][],但有一些差异:
在 macOS 上,尊重以下设置:
- 默认和系统钥匙串
- 信任:
- 任何“使用此证书时”标志设置为“始终信任”的证书,或
- 任何“安全套接字层 (SSL)"标志设置为“始终信任”的证书。
- 证书还必须有效,且"X.509 基本策略”设置为“始终信任”。
- 信任:
在 Windows 上,尊重以下设置:
- 本地计算机(通过
certlm.msc访问)- 信任:
- 受信任的根证书颁发机构
- 受信任的人员
- 企业信任 -> 企业 -> 受信任的根证书颁发机构
- 企业信任 -> 企业 -> 受信任的人员
- 企业信任 -> 组策略 -> 受信任的根证书颁发机构
- 企业信任 -> 组策略 -> 受信任的人员
- 信任:
- 当前用户(通过
certmgr.msc访问)- 信任:
- 受信任的根证书颁发机构
- 企业信任 -> 组策略 -> 受信任的根证书颁发机构
- 信任:
在 Windows 和 macOS 上,Node.js 会在使用受信任 证书之前检查用户的设置是否未禁止它们用于 TLS 服务器身份验证。
Node.js 当前不支持基于系统设置从不信任/吊销来自其他来源的证书。
在其他系统上,Node.js 从默认证书文件
(通常为 /etc/ssl/cert.pem)和默认证书目录(通常为
/etc/ssl/certs)加载证书,Node.js 链接的 OpenSSL 版本尊重这些证书。
这通常适用于主要 Linux 发行版和其他
类 Unix 系统上的约定。如果覆盖了 OpenSSL 环境变量
(通常为 SSL_CERT_FILE 和 SSL_CERT_DIR,取决于 Node.js 链接的 OpenSSL 的配置
),则将使用指定路径加载
证书。如果 Node.js 链接的 OpenSSL 版本使用的约定路径
由于某种原因与用户拥有的系统配置不一致,这些环境变量可用作变通方法。
如果设置为 0,则 Node.js 将根据并行度的估计值选择适当的线程池大小。
并行度是指在给定机器中可以 同时进行的计算数量。通常,它与 CPU 数量相同,但在 VM 或容器等环境中可能不同。
此标志不能与
--check、--eval、--interactive 或 REPL 组合。
注意:--watch 标志需要文件路径作为参数,并且与
--run 或内联脚本输入不兼容,因为 --run 优先并忽略监视
模式。如果未提供文件,Node.js 将以状态码 9 退出。
node --watch index.js自定义在监视模式重启时发送给进程的信号。
node --watch --watch-kill-signal SIGINT test.js此标志不能与
--check、--eval、--interactive、--test 或 REPL 组合。
注意:使用 --watch-path 隐式启用 --watch,这需要文件路径
并且与 --run 不兼容,因为 --run 优先并忽略监视模式。
node --watch-path=./src --watch-path=./tests index.js此选项仅在 macOS 和 Windows 上支持。
当在不支持它的平台上使用此选项时,将抛出
ERR_FEATURE_UNAVAILABLE_ON_PLATFORM 异常。
node --watch --watch-preserve-output test.js稳定性:2 - 稳定
1、true或空字符串''表示支持 16 色,2表示支持 256 色,或3表示支持 1600 万色。
当使用 FORCE_COLOR 并设置为支持的值时,NO_COLOR 和 NODE_DISABLE_COLORS 环境变量都会被忽略。
任何其他值将导致彩色输出被禁用。
为 Node.js 实例禁用 模块编译缓存。有关详细信息,请参阅 模块编译缓存 的文档。
当为 TLS 或 HTTPS 客户端或服务器显式指定 ca 选项属性时,既不使用已知证书,也不使用额外证书。
当 node 作为 setuid root 运行或设置了 Linux 文件能力时,此环境变量将被忽略。
NODE_EXTRA_CA_CERTS 环境变量仅在 Node.js 进程首次启动时读取。在运行时使用 process.env.NODE_EXTRA_CA_CERTS 更改值对当前进程无效。
如果选项值包含空格,可以使用双引号进行转义:
NODE_OPTIONS='--require "./my path/file.js"'作为命令行选项传递的单例标志将覆盖传递给 NODE_OPTIONS 的相同标志:
# 检查器将在端口 5555 上可用
NODE_OPTIONS='--inspect=localhost:4444' node --inspect=localhost:5555可以多次传递的标志将按先传递其 NODE_OPTIONS 实例、再传递其命令行实例的顺序处理:
NODE_OPTIONS='--require "./a.js"' node --require "./b.js"
# 等同于:
node --require "./a.js" --require "./b.js"允许的 Node.js 选项如下。如果某个选项同时支持 --XX 和 --no-XX 变体,则两者都支持,但下面的列表中只包含其中一个。
--allow-addons--allow-child-process--allow-ffi--allow-fs-read--allow-fs-write--allow-inspector--allow-net--allow-wasi--allow-worker--conditions,-C--cpu-prof-dir--cpu-prof-interval--cpu-prof-name--cpu-prof--diagnostic-dir--disable-proto--disable-sigusr1--disable-warning--disable-wasm-trap-handler--dns-result-order--enable-fips--enable-network-family-autoselection--enable-source-maps--entry-url--experimental-abortcontroller--experimental-addon-modules--experimental-detect-module--experimental-dtls--experimental-eventsource--experimental-ffi--experimental-import-meta-resolve--experimental-import-text--experimental-json-modules--experimental-loader--experimental-modules--experimental-package-map--experimental-print-required-tla--experimental-quic--experimental-require-module--experimental-shadow-realm--experimental-specifier-resolution--experimental-stream-iter--experimental-test-isolation--experimental-top-level-await--experimental-vfs--experimental-vm-modules--experimental-wasi-unstable-preview1--force-context-aware--force-fips--force-node-api-uncaught-exceptions-policy--frozen-intrinsics--heap-prof-dir--heap-prof-interval--heap-prof-name--heap-prof--heapsnapshot-near-heap-limit--heapsnapshot-signal--http-parser--icu-data-dir--import--input-type--insecure-http-parser--inspect-brk--inspect-port,--debug-port--inspect-publish-uid--inspect-wait--inspect--localstorage-file--max-http-header-size--max-old-space-size-percentage--network-family-autoselection-attempt-timeout--no-addons--no-async-context-frame--no-deprecation--no-experimental-global-navigator--no-experimental-repl-await--no-experimental-sqlite--no-experimental-strip-types--no-experimental-websocket--no-experimental-webstorage--no-extra-info-on-fatal-exception--no-force-async-hooks-checks--no-global-search-paths--no-network-family-autoselection--no-strip-types--no-warnings--no-webstorage--node-memory-debug--openssl-config--openssl-legacy-provider--openssl-shared-config--pending-deprecation--permission-audit--permission--preserve-symlinks-main--preserve-symlinks--prof-process--redirect-warnings--report-compact--report-dir,--report-directory--report-exclude-env--report-exclude-network--report-filename--report-on-fatalerror--report-on-signal--report-signal--report-uncaught-exception--require-module--require,-r--secure-heap-min--secure-heap--snapshot-blob--test-coverage-branches--test-coverage-exclude--test-coverage-functions--test-coverage-include--test-coverage-lines--test-global-setup--test-isolation--test-name-pattern--test-only--test-random-seed--test-randomize--test-reporter-destination--test-reporter--test-rerun-failures--test-shard--test-skip-pattern--throw-deprecation--title--tls-cipher-list--tls-keylog--tls-max-v1.2--tls-max-v1.3--tls-min-v1.0--tls-min-v1.1--tls-min-v1.2--tls-min-v1.3--trace-deprecation--trace-env-js-stack--trace-env-native-stack--trace-env--trace-event-categories--trace-event-file-pattern--trace-events-enabled--trace-exit--trace-require-module--trace-sigint--trace-sync-io--trace-tls--trace-uncaught--trace-warnings--track-heap-objects--unhandled-rejections--use-bundled-ca--use-env-proxy--use-largepages--use-openssl-ca--use-system-ca--v8-pool-size--watch-kill-signal--watch-path--watch-preserve-output--watch--zero-fill-buffers
允许的 V8 选项有:
--abort-on-uncaught-exception--disallow-code-generation-from-strings--enable-etw-stack-walking--expose-gc--interpreted-frames-native-stack--jitless--max-heap-size--max-old-space-size--max-semi-space-size--perf-basic-prof-only-functions--perf-basic-prof--perf-prof-unwinding-info--perf-prof--stack-trace-limit
--perf-basic-prof-only-functions、--perf-basic-prof、--perf-prof-unwinding-info 和 --perf-prof 仅在 Linux 上可用。
--enable-etw-stack-walking 仅在 Windows 上可用。
在 Windows 上,这是一个 ';' 分隔的列表。
待弃用通常与运行时弃用相同,但显著的区别在于它们默认是_关闭_的,除非设置了 --pending-deprecation 命令行标志或 NODE_PENDING_DEPRECATION=1 环境变量,否则不会发出。待弃用用于提供一种选择性“早期警告”机制,开发人员可以利用它来检测已弃用的 API 使用情况。
启用后,Node.js 会在启动期间解析 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY
环境变量,并通过指定的代理路由请求。
仅在代理是受信任且经授权用于该部署时才使用此功能。代理支持旨在通过授权的 代理服务器访问外部网络,例如防火墙要求使用代理时。它并不是用于隐藏 流量或规避网络策略。参见 [内置代理支持][]。
这也可以通过 --use-env-proxy 命令行标志启用。
当两者都设置时,--use-env-proxy 优先。
也可以使用 --use-system-ca 命令行标志启用此功能。当两者都设置时,--use-system-ca 优先。
NODE_V8_COVERAGE 将自动传播到子进程,使得检测调用 child_process.spawn() 系列函数的应用程序更容易。NODE_V8_COVERAGE 可以设置为空字符串,以防止传播。
覆盖率作为 ScriptCoverage 对象数组输出在顶层键 result 上:
{
"result": [
{
"scriptId": "67",
"url": "internal/tty.js",
"functions": []
}
]
}稳定性:1 - 实验性
如果找到,源代码映射数据将附加到 JSON 覆盖率对象的顶层键 source-map-cache 上。
source-map-cache 是一个对象,其键表示提取源代码映射的文件,其值包括原始源代码映射 URL(在 url 键中)、解析后的 Source Map v3 信息(在 data 键中)和源文件的行长度(在 lineLengths 键中)。
{
"result": [
{
"scriptId": "68",
"url": "file:///absolute/path/to/source.js",
"functions": []
}
],
"source-map-cache": {
"file:///absolute/path/to/source.js": {
"url": "./path-to-map.json",
"data": {
"version": 3,
"sources": [
"file:///absolute/path/to/original.js"
],
"names": [
"Foo",
"console",
"info"
],
"mappings": "MAAMA,IACJC,YAAaC",
"sourceRoot": "./"
},
"lineLengths": [
13,
62,
38,
27
]
}
}
}
### `NODE_REPL_HISTORY`
[`NODE_REPL_HISTORY`][] 是 `NODE_REPL_HISTORY_SIZE` 的别名。环境变量的值是任意的。
### `NODE_EXTRA_CA_CERTS`
<!-- YAML
added: v6.11.0
-->
启动时加载 OpenSSL 配置文件。除其他用途外,这可用于在 Node.js 使用 `--openssl-config` 构建时启用符合 FIPS 的加密。
如果使用了 [`--use-openssl-ca`][] 命令行选项,则会忽略该环境变量。
### `NODE_OPTIONS`
<!-- YAML
added: v7.7.0
-->
如果启用了 `--use-openssl-ca`,或者在 macOS 和 Windows 以外的平台上启用了 `--use-bundled-ca`,这将覆盖并设置 OpenSSL 包含受信任证书的目录。
请注意,除非显式设置子环境,否则任何子进程都将继承此环境变量,如果它们使用 OpenSSL,可能会导致它们信任与 node 相同的 CA。
### `NODE_OPENSSL_CERT_FILE`
<!-- YAML
added: v7.7.0
-->
如果启用了 `--use-openssl-ca`,或者在 macOS 和 Windows 以外的平台上启用了 `--use-bundled-ca`,这将覆盖并设置 OpenSSL 包含受信任证书的文件。
请注意,除非显式设置子环境,否则任何子进程都将继承此环境变量,如果它们使用 OpenSSL,可能会导致它们信任与 node 相同的 CA。
### `TZ`
<!-- YAML
added: v0.0.1
changes:
- version:
- v16.2.0
pr-url: https://github.com/nodejs/node/pull/38642
description:
使用 process.env.TZ = 更改 TZ 变量也会在 Windows 上更改时区。
- version:
- v13.0.0
pr-url: https://github.com/nodejs/node/pull/20026
description:
使用 process.env.TZ = 更改 TZ 变量会在 POSIX 系统上更改时区。
-->
`TZ` 环境变量用于指定时区配置。
虽然 Node.js 不支持 [在其他环境中的处理方式][] 的所有各种方式,但它支持基本的 [时区 ID][](例如 `America/New_York`、`Europe/Paris` 或 `Asia/Tokyo`)。它可能支持一些其他缩写或别名,但强烈不鼓励使用且不保证支持。
```console
$ TZ=Europe/Dublin node -pe "new Date().toString()"
Wed May 12 2021 20:30:48 GMT+0100 (Irish Standard Time)只要可能,Node.js 就会使用异步系统 API,但在它们不存在的地方,libuv 的线程池用于基于同步系统 API 创建异步 node API。使用线程池的 Node.js API 有:
- 所有
fsAPI,除了文件监视器 API 和那些明确同步的 API - 异步加密 API,例如
crypto.pbkdf2()、crypto.scrypt()、crypto.randomBytes()、crypto.randomFill()、crypto.generateKeyPair() dns.lookup()- 所有
zlibAPI,除了那些明确同步的 API
因为 libuv 的线程池大小是固定的,这意味着如果出于任何原因这些 API 中的任何一个花费很长时间,其他(看似无关的)在 libuv 线程池中运行的 API 将经历性能下降。为了缓解此问题,一个潜在的解决方案是通过将 'UV_THREADPOOL_SIZE' 环境变量设置为大于 4(其当前默认值)的值来增加 libuv 线程池的大小。但是,在进程内部使用 process.env.UV_THREADPOOL_SIZE=size 设置此值不能保证有效,因为线程池将在用户代码运行之前作为运行时初始化的一部分创建。有关更多信息,请参阅 libuv 线程池文档.
V8 有一套自己的 CLI 选项。任何提供给 node 的 V8 CLI 选项都将传递给 V8 处理。V8 的选项_无稳定性保证_。V8 团队本身并不认为它们是其正式 API 的一部分,并保留随时更改它们的权利。同样,它们也不受 Node.js 稳定性保证的覆盖。许多 V8 选项仅与 V8 开发人员有关。尽管如此,仍有一小部分 V8 选项广泛适用于 Node.js,在此文档中:
此选项通常用于限制进程可用于其 JavaScript 堆的内存量。
在具有 2 GiB 内存的机器上,考虑将其设置为 1536(1.5 GiB),以便为其他用途留出一些内存并避免交换。
node --max-old-space-size=1536 index.js由于 V8 堆的新生代大小是半空间大小的三倍(参见 V8 中的 YoungGenerationSizeFromSemiSpaceSize),因此半空间增加 1 MiB 会应用于三个独立的半空间中的每一个,并导致堆大小增加 3 MiB。吞吐量的改进取决于您的工作负载(参见 #42511)。
默认值取决于内存限制。例如,在内存限制为 512 MiB 的 64 位系统上,半空间的最大大小默认为 1 MiB。对于高达 2GiB(含)的内存限制,在 64 位系统上半空间的默认最大大小将小于 16 MiB。
为了获得应用程序的最佳配置,您在运行应用程序基准测试时应尝试不同的 max-semi-space-size 值。
例如在 64 位系统上进行基准测试:
for MiB in 16 32 64 128; do
node --max-semi-space-size=$MiB index.js
done