全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-25 8 分钟 ✍️ juanwangdev

脚本执行与跨平台兼容

npm scripts默认串行执行,跨平台兼容和参数传递是实际项目中的核心痛点。

脚本并行与串行执行

串行执行

使用&&连接,前一个失败则后续不执行:

JSON
{
  "scripts": {
    "build": "npm run lint && npm run compile && npm run test"
  }
}

并行执行

使用&连接(仅Linux/macOS):

JSON
{
  "scripts": {
    "dev": "npm run watch:js & npm run watch:css"
  }
}

跨平台并行:npm-run-all

Bash
npm install --save-dev npm-run-all
JSON
{
  "scripts": {
    "watch:js": "tsc -w",
    "watch:css": "tailwindcss -w",
    "dev": "run-p watch:*",
    "build": "run-s lint compile test"
  }
}
  • run-p:并行执行(parallel)
  • run-s:串行执行(sequential)
  • 通配符watch:*匹配所有watch开头的脚本

原生&在Windows不可用,必须使用npm-run-all或concurrently等工具实现跨平台并行。

跨平台脚本兼容

核心问题

问题Linux/macOSWindows
环境变量NODE_ENV=prodset NODE_ENV=prod
删除目录rm -rf distrmdir /s /q dist
并行符&不支持

解决方案:cross-env与rimraf

Bash
npm install --save-dev cross-env rimraf
JSON
{
  "scripts": {
    "build": "cross-env NODE_ENV=production tsc",
    "clean": "rimraf dist",
    "dev": "cross-env NODE_ENV=development node server.js"
  }
}
  • cross-env:跨平台设置环境变量
  • rimraf:跨平台rm -rf
  • mkdirp:跨平台mkdir -p

规则

  • 涉及环境变量,用cross-env
  • 涉及文件操作,用对应跨平台工具
  • 涉及并行执行,用npm-run-all或concurrently

不要在npm scripts中写平台特定的shell命令,除非项目明确只运行在单一平台。

参数传递给脚本

双横线传参

Bash
npm run build -- --watch
# 实际执行:tsc --watch

--后的参数通过npm_config_前缀或直接追加到脚本命令末尾。

环境变量传参

JSON
{
  "scripts": {
    "build": "tsc --outDir $BUILD_DIR"
  }
}
Bash
BUILD_DIR=./output npm run build

npm_config_变量

npm会将--xxx参数映射为npm_config_xxx环境变量:

Bash
npm run build --output=./dist
# 脚本中可通过 $npm_config_output 获取
JSON
{
  "scripts": {
    "deploy": "echo \"部署到: $npm_config_env\""
  }
}
Bash
npm run deploy --env=staging
# 输出:部署到: staging

Windows下环境变量引用需用%npm_config_env%,建议用cross-env统一处理。双横线传参是最通用的方式。

要点总结

  • 串行用&&,并行用run-p或concurrently,避免原生&
  • cross-env解决环境变量跨平台,rimraf解决文件操作跨平台
  • --后参数追加到脚本命令末尾,是最通用的传参方式
  • npm_config_前缀可映射自定义参数为环境变量
  • 所有脚本都应考虑跨平台兼容,除非项目明确限定平台
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 npm生命周期钩子详解
下一篇 → npm link与发布内容控制
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码