脚本执行与跨平台兼容
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/macOS | Windows |
|---|---|---|
| 环境变量 | NODE_ENV=prod | set NODE_ENV=prod |
| 删除目录 | rm -rf dist | rmdir /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_前缀可映射自定义参数为环境变量
- 所有脚本都应考虑跨平台兼容,除非项目明确限定平台