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
不带参数执行以启动交互式解释器。
有关 node inspect
的更多信息,请参阅调试器文档。
程序入口点是类似说明符的字符串。 如果字符串不是绝对路径,则解析为当前工作目录的相对路径。 然后由 CommonJS 模块加载器解析该路径。 如果没有找到对应的文件,则抛出错误。
如果找到文件,则其路径将在以下任一条件下传给 ECMAScript 模块加载器:
.mjs
。.cjs
扩展名,并且最近的父 package.json
文件包含值为 "module"
的顶层 "type"
字段。否则,使用 CommonJS 模块加载器加载文件。 参阅模块加载器了解更多详细信息。
当加载 ECMAScript 模块加载器加载程序入口点时,node
命令将仅接受使用 .js
、.mjs
、或 .cjs
扩展名的文件作为输入;当启用 --experimental-wasm-modules
时,则使用 .wasm
扩展名。
所有选项,包括 V8 选项,都允许用破折号 (-
) 或下划线 (_
) 分隔单词。
例如,--pending-deprecation
等价于 --pending_deprecation
。
如果接受单个值的选项(例如 --max-http-header-size
)被多次传入,则使用最后传入的值。
来自命令行的选项优先于通过 NODE_OPTIONS
环境变量传入的选项。
-
#标准输入的别名。
类似于在其他命令行工具中使用 -
,这意味着脚本是从标准输入读取的,其余的选项将传给该脚本。
--
#指示 node 选项的结束。 将其余参数传给脚本。 如果在此之前没有提供脚本文件名或评估/打印脚本,则下一个参数用作脚本文件名。
--abort-on-uncaught-exception
#中止而不是退出会导致使用调试器(例如 lldb
、gdb
和 mdb
)生成用于事后分析的核心文件。
如果传入了此标志,则该行为仍然可以设置为不通过 process.setUncaughtExceptionCaptureCallback()
中止(以及通过使用使用它的 domain
模块)
--completion-bash
#为 Node.js 打印可源代码的 bash 完成脚本。
$ node --completion-bash > node_bash_completion
$ source node_bash_completion
-C=condition
, --conditions=condition
#启用对自定义的条件导出解析条件的实验性支持。
允许任意数量的自定义字符串条件名称。
"node"
、"default"
、"import"
和 "require"
的默认 Node.js 条件将始终按照定义应用。
例如,要运行具有 "development" 解析的模块:
$ node -C=development app.js
--cpu-prof
#启动时开始 V8 CPU 分析器,并且在退出前将 CPU 分析文件写入磁盘。
如果未指定--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-dir
#指定放置 --cpu-prof
生成的 CPU 分析文件的目录
默认值由 --diagnostic-dir
命令行选项控制。
--cpu-prof-interval
#为 --cpu-prof
生成的 CPU 分析文件指定以微秒为单位的采样间隔。
默认为 1000 微秒。
--cpu-prof-name
#指定 --cpu-prof
生成的 CPU 分析文件的文件名。
--diagnostic-dir=directory
#设置写入所有诊断输出文件的目录。 默认为当前工作目录。
影响默认输出目录:
--disable-proto=mode
#禁用 Object.prototype.__proto__
属性。
如果 mode
是 delete
,则该属性将被完全删除。
如果 mode
是 throw
,则访问该属性会使用代码 ERR_PROTO_ACCESS
抛出异常。
--disallow-code-generation-from-strings
#使从字符串生成代码的 eval
和 new Function
等内置语言功能抛出异常。
这不会影响 Node.js vm
模块。
--dns-result-order=order
#在 dns.lookup()
和 dnsPromises.lookup()
中设置 verbatim
的默认值。
该值可能是:
ipv4first
: 设置默认的 verbatim
为 false
。verbatim
: 设置默认的 verbatim
为 true
。默认为 ipv4first
,并且 dns.setDefaultResultOrder()
的优先级高于 --dns-result-order
。
--enable-fips
#在启动时启用符合 FIPS 的加密。 (需要针对兼容 FIPS 的 OpenSSL 构建 Node.js。)
--enable-source-maps
#启用 Source Map v3 对堆栈跟踪的支持。
当使用转译器(例如 TypeScript)时,应用程序抛出的堆栈跟踪会引用转译后的代码,而不是原始的源位置。
--enable-source-maps
启用源映射缓存并尽最大努力报告相对于原始源文件的堆栈跟踪。
覆盖 Error.prepareStackTrace
可防止 --enable-source-maps
修改堆栈跟踪。
--experimental-import-meta-resolve
#启用实验性 import.meta.resolve()
支持。
--experimental-json-modules
#为 ES 模块加载器启用实验性 JSON 支持。
--experimental-loader=module
#指定自定义的实验的 ECMAScript 模块加载器的 module
。
module
可以是任何作为 import
说明符接受的字符串。
--experimental-policy
#使用指定的文件作为安全策略。
--no-experimental-repl-await
#使用此标志在交互式解释器中禁用顶层等待。
--experimental-specifier-resolution=mode
#设置解析 ES 模块说明符的解析算法。
有效选项为 explicit
和 node
。
默认为 explicit
,需要提供模块的完整路径。
node
模式支持可选文件扩展名和导入具有索引文件的目录的能力。
请参阅自定义的 ESM 说明符解析以获取示例用法。
--experimental-vm-modules
#在 vm
模块中启用实验性 ES 模块支持。
--experimental-wasi-unstable-preview1
#启用实验性 WebAssembly 系统接口 (WASI) 支持。
--experimental-wasm-modules
#启用实验性 WebAssembly 模块支持。
--force-context-aware
#禁用加载不是上下文感知的原生插件。
--force-fips
#在启动时强制执行符合 FIPS 的加密。
(不能从脚本代码中禁用。)(与 --enable-fips
要求相同。)
--frozen-intrinsics
#启用像 Array
和 Object
这样的实验性冻结内在函数。
仅支持根上下文。
不能保证 globalThis.Array
确实是默认的内在引用。
代码可能会在此标志下被破坏。
为了允许添加 polyfill,--require
在冻结内在函数之前运行。
--heapsnapshot-near-heap-limit=max_count
#当 V8 堆使用量接近堆限制时,将 V8 堆快照写入磁盘。
count
应该是非负整数(在这种情况下,Node.js 将不超过 max_count
的快照写入磁盘)。
当生成快照时,可能会触发垃圾回收并降低堆使用率,因此可能会在 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: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
....
--heapsnapshot-signal=signal
#启用信号句柄,当接收到指定的信号时,它会导致 Node.js 进程写入堆转储。
signal
必须是有效的信号名称。
默认禁用。
$ node --heapsnapshot-signal=SIGUSR2 index.js &
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
node 1 5.5 6.1 787252 247004 ? Ssl 16:43 0:02 node --heapsnapshot-signal=SIGUSR2 index.js
$ kill -USR2 1
$ ls
Heap.20190718.133405.15554.0.001.heapsnapshot
--heap-prof
#在启动时开始 V8 堆分析器,并在退出前将堆分析器写入磁盘。
如果未指定--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
--heap-prof-dir
#指定 --heap-prof
生成的堆分析文件将被放置的目录。
默认值由 --diagnostic-dir
命令行选项控制。
--heap-prof-interval
#指定 --heap-prof
生成的堆分析文件的平均采样间隔(以字节为单位)。
默认为 512 * 1024 字节。
--heap-prof-name
#指定 --heap-prof
生成的堆分析文件的文件名。
--icu-data-dir=file
#指定 ICU 数据加载路径。
(覆盖 NODE_ICU_DATA
。)
--input-type=type
#这将 Node.js 配置为将字符串输入解释为 CommonJS 或 ES 模块。
字符串输入是通过 --eval
、--print
或 STDIN
输入的。
有效值为 "commonjs"
和 "module"
。
默认为 "commonjs"
。
--inspect-brk[=[host:]port]
#在 host:port
上激活检查器并在用户脚本开始时中断。
默认 host:port
为 127.0.0.1:9229
。
--inspect-port=[host:]port
#设置检查器激活时使用的 host:port
。
在通过发送 SIGUSR1
信号激活检查器时很有用。
默认主机是 127.0.0.1
。
请参阅下面有关 host
参数用法的安全警告。
--inspect[=[host:]port]
#在 host:port
上激活检查器。
默认为 127.0.0.1:9229
。
V8 检查器集成允许 Chrome 开发者工具和 IDE 等工具调试和分析 Node.js 实例。 该工具通过 tcp 端口连接到 Node.js 实例,并使用 Chrome 开发者工具协议进行通信。
将检查器绑定到具有开放端口的公共 IP(包括 0.0.0.0
)是不安全的,因为它允许外部主机连接到检查器并执行远程代码执行攻击。
如果指定主机,请确保:
9229
)不受防火墙保护,则 --inspect=0.0.0.0
是不安全的。有关详细信息,请参阅调试安全隐患章节。
--inspect-publish-uid=stderr,http
#指定检查器网络套接字网址的暴露方式。
默认情况下,检查器网络套接字网址在标准错误和 http://host:port/json/list
上的 /json/list
端点下可用。
--insecure-http-parser
#使用接受无效 HTTP 标头的不安全 HTTP 解析器。 这可能允许与不一致的 HTTP 实现的互操作性。 它还可能允许请求走私和其他依赖于接受无效标头的 HTTP 攻击。 避免使用此选项。
--jitless
#禁用可执行内存的运行时分配。 出于安全原因,某些平台可能需要这样做。 在其他平台上也可以减少攻击面,但性能影响可能比较严重。
此标志是从 V8 继承的,可能会在上游发生变化。 它可能会在非语义化主版本中消失。
--max-http-header-size=size
#指定 HTTP 标头的最大大小(以字节为单位)。 默认为 16 KB。
--napi-modules
#此选项为空操作。 它是为了兼容性而保留的。
--no-addons
#禁用 node-addons
导出条件以及禁用加载原生插件。
当指定 --no-addons
时,调用 process.dlopen
或加载原生 C++ 插件将失败并抛出异常。
--no-deprecation
#静默弃用警告。
--no-force-async-hooks-checks
#禁用 async_hooks
的运行时检查。
当启用 async_hooks
时,这些仍然会动态启用。
--no-global-search-paths
#不从全局路径(如 $HOME/.node_modules
和 $NODE_PATH
)中搜索模块。
--no-warnings
#静默所有进程警告(包括弃用的)。
--node-memory-debug
#为 Node.js 内部的内存泄漏启用额外的调试检查。 这通常只用于开发者调试 Node.js 本身。
--openssl-config=file
#在启动时加载 OpenSSL 配置文件。 除其他用途外,如果 Node.js 是针对支持 FIPS 的 OpenSSL 构建的,则可用于启用符合 FIPS 的加密。
--pending-deprecation
#触发挂起的弃用警告。
挂起的弃用通常与运行时弃用相同,但值得注意的是,它们默认关闭关闭,除非设置了 --pending-deprecation
命令行标志或 NODE_PENDING_DEPRECATION=1
环境变量,否则不会触发。
待弃用用于提供一种选择性的"早期警告"机制,开发者可以利用该机制来检测弃用的 API 的使用情况。
--policy-integrity=sri
#如果策略不具有指定的完整性,则指示 Node.js 在运行任何代码之前出错。 它需要子资源完整性字符串作为参数。
--preserve-symlinks
#指示模块加载器在解析和缓存模块时保留符号链接。
默认情况下,当 Node.js 从符号链接到不同磁盘位置的路径加载模块时,Node.js 将取消引用该链接并使用模块的实际磁盘“真实路径”作为既是标识符又是定位其他依赖模块的根路径。
在大多数情况下,这种默认行为是可以接受的。
但是,当使用符号链接的对等依赖项时,如下例所示,如果 moduleA
尝试要求 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-main
#指示模块加载器在解析和缓存主模块 (require.main
) 时保留符号链接。
此标志的存在是为了让主模块可以选择加入 --preserve-symlinks
为所有其他导入提供的相同行为;但是,它们是单独的标志,以便与旧的 Node.js 版本向后兼容。
--preserve-symlinks-main
并不意味着 --preserve-symlinks
;当在解析相对路径之前不希望遵循符号链接时,除了 --preserve-symlinks
之外,还使用 --preserve-symlinks-main
。
有关详细信息,请参阅 --preserve-symlinks
。
--prof
#生成 V8 分析器输出。
--prof-process
#处理使用 V8 选项 --prof
生成的 V8 分析器输出。
--redirect-warnings=file
#将进程警告写入给定文件而不是打印到标准错误。 如果文件不存在则创建,如果存在则追加。 如果在尝试将警告写入文件时发生错误,则警告将改为写入标准错误。
file
名称可以是绝对路径。
如果不是,则它将被写入的默认目录由 --diagnostic-dir
命令行选项控制。
--report-compact
#以紧凑的单行 JSON 格式编写报告,与专为人类使用而设计的默认多行格式相比,日志处理系统更易于使用。
--report-dir=directory
, report-directory=directory
#生成报告的位置。
--report-filename=filename
#将写入报告的文件的名称。
--report-on-fatalerror
#使报告能够在导致应用程序终止的致命错误(Node.js 运行时中的内部错误,例如内存不足)时触发。 用于检查各种诊断数据元素,例如堆、堆栈、事件循环状态、资源消耗等 推断致命错误。
--report-on-signal
#在接收到正在运行的 Node.js 进程的指定(或预定义)信号时生成报告。
触发报告的信号通过 --report-signal
指定。
--report-signal=signal
#设置或重置报告生成信号(Windows 不支持)。
默认信号为 SIGUSR2
。
--report-uncaught-exception
#启用对未捕获的异常生成报告。 在结合原生堆栈和其他运行时环境数据检查 JavaScript 堆栈时很有用。
--secure-heap=n
#初始化 n
个字节的 OpenSSL 安全堆。
当初始化时,安全堆用于密钥生成和其他操作期间 OpenSSL 中选定类型的分配。
这很有用,例如,防止敏感信息因指针溢出或不足而泄漏。
安全堆的大小是固定的,不能在运行时调整大小,因此,如果使用,选择足够大的堆来覆盖所有应用程序使用是很重要的。
给定的堆大小必须是 2 的幂。 任何小于 2 的值都将禁用安全堆。
默认情况下禁用安全堆。
安全堆在 Windows 上不可用。
有关详细信息,请参阅 CRYPTO_secure_malloc_init
。
--secure-heap-min=n
#当使用 --secure-heap
时,--secure-heap-min
标志指定安全堆的最小分配。
最小值为 2
。
最大值是 --secure-heap
或 2147483647
中的较小者。
给定的值必须是 2 的幂。
--throw-deprecation
#为弃用抛出错误。
--title=title
#在启动时设置 process.title
。
--tls-cipher-list=list
#指定替代的默认 TLS 密码列表。 需要使用加密支持构建 Node.js(默认)。
--tls-keylog=file
#将 TLS 密钥材料记录到文件中。
密钥材料为 NSS SSLKEYLOGFILE
格式,可被软件(如 Wireshark)用于解密 TLS 流量。
--tls-max-v1.2
#将 tls.DEFAULT_MAX_VERSION
设置为 'TLSv1.2'。
用于禁用对 TLSv1.3 的支持。
--tls-max-v1.3
#将默认的 tls.DEFAULT_MAX_VERSION
设置为 'TLSv1.3'。
用于启用对 TLSv1.3 的支持。
--tls-min-v1.0
#将默认的 tls.DEFAULT_MIN_VERSION
设置为 'TLSv1'。
用于与旧的 TLS 客户端或服务器兼容。
--tls-min-v1.1
#