如何为可执行/启动器脚本启动的Node.js传递命令行参数
一、给可执行脚本启动的Node进程传命令行参数
如果你的脚本是用#!/usr/bin/env node开头的可执行文件(比如自己写的CLI工具),传递参数非常直接——直接把参数加在脚本命令后面就行。
比如你有个叫my-cli的可执行脚本,运行时直接写:
my-cli --foo bar hello world
在Node代码里,你可以通过process.argv数组获取这些参数:
// 打印所有参数 console.log(process.argv); // 输出大概是:[ '/path/to/node', '/path/to/my-cli', '--foo', 'bar', 'hello', 'world' ]
注意前两个元素固定是Node可执行文件的路径和脚本本身的路径,从第三个元素开始才是你传递的自定义参数。
二、给npm启动器脚本(node_modules/.bin下的脚本)传Node本身的参数
你提到的像micro、moleculer这类框架的启动脚本,都是npm放在node_modules/.bin里的sh/CMD脚本,直接给这些脚本加--inspect、-r这类Node级别的参数是无效的——因为这些参数是传给Node进程的,不是传给框架脚本的。这里有三种靠谱的解决方法:
方法1:用NODE_OPTIONS环境变量(最方便的临时方案)
Node.js原生支持NODE_OPTIONS环境变量,它会把里面的参数自动传给所有启动的Node进程。完美解决你需要给框架脚本附加Node参数的场景。
比如你要实现等效于node --inspect -r ts-node/register -r dotenv-safe/config src/index.ts的效果,但用micro的启动脚本:
- Linux/macOS:在终端先设置环境变量,再运行脚本
export NODE_OPTIONS="--inspect -r ts-node/register -r dotenv-safe/config" micro src/index.ts # 或者如果是npm脚本(比如package.json里"start": "micro src/index.ts") npm run start - Windows命令行:
set NODE_OPTIONS="--inspect -r ts-node/register -r dotenv-safe/config" npm run start - Windows PowerShell:
$env:NODE_OPTIONS="--inspect -r ts-node/register -r dotenv-safe/config" npm run start
这个方法的好处是不用修改任何配置,临时生效,适合开发时调试用。缺点是会影响当前终端里所有启动的Node进程,如果同时运行多个项目要注意。
方法2:直接用node命令运行框架脚本的入口文件
找到框架启动脚本对应的Node源码文件(比如micro的入口是node_modules/micro/bin/micro.js),然后直接用node命令带参数运行它:
node --inspect -r ts-node/register -r dotenv-safe/config node_modules/micro/bin/micro.js src/index.ts
这种方式完全绕开了node_modules/.bin的脚本,直接控制Node进程的参数,适合需要精确控制的场景。
方法3:修改npm脚本(固定配置方案)
如果这个参数组合是你常用的,可以直接把node命令和参数写进package.json的scripts里:
{ "scripts": { "start": "node --inspect -r ts-node/register -r dotenv-safe/config node_modules/micro/bin/micro.js src/index.ts" } }
之后运行npm run start就会自动用这些参数启动进程,适合长期固定的开发配置。
内容的提问来源于stack exchange,提问作者millimoose

