vscode 能识别 package.json 的 "scripts" 字段,前提是文件位于工作区根目录且 json 格式合法;脚本名不能含空格、不以数字开头,值必须为字符串;windows 用户需注意 powershell 脚本执行策略,建议用 cross-env 或 npm-run-all;终端环境变量不生效时应配置 login shell(如添加 "-l" 参数);部署前须校验分支、加人工确认或使用 deploy.js 分步控制;npm scripts 面板无响应时应右键“run script in terminal”查看真实输出。

npm script 在 package.json 里怎么写才不会被 VSCode 忽略
VSCode 默认能识别 package.json 中的 "scripts" 字段,但前提是文件必须在工作区根目录,且格式合法。常见错误是把 package.json 放在子文件夹(比如 src/package.json),或用了注释、尾逗号等非法 JSON 语法。
确保脚本名不含空格、不以数字开头,值必须是字符串(哪怕只是调用另一个命令):
{
"scripts": {
"build": "tsc --build",
"deploy": "npm run build && rsync -av dist/ user@server:/var/www/app/"
}
}
- 脚本名如
build:prod、deploy:staging都合法;build prod会报错 - Windows 用户注意:
&&在 CMD 下可用,但 PowerShell 默认禁用脚本执行;建议统一用cross-env或改用npm-run-all - 如果 VSCode 左侧“NPM Scripts”面板为空,先按
Ctrl+Shift+P→ 输入Developer: Reload Window刷新
VSCode 内置终端执行 npm script 时环境变量不生效怎么办
VSCode 终端默认不会加载 shell 的 profile(如 ~/.zshrc),导致 PATH 缺失、nvm 切换的 Node 版本未生效,进而出现 command not found: tsc 或 node: command not found。
- 在 VSCode 设置中搜
terminal.integrated.profiles,为对应终端(如zsh)显式指定"path"和"args",例如:"zsh": { "path": "/bin/zsh", "args": ["-l"] // -l 表示 login shell,会加载 .zshrc } - 或者直接在
package.json脚本里用绝对路径调用二进制,比如"build": "/Users/you/.nvm/versions/node/v18.18.2/bin/tsc --build"(不推荐长期使用) - 验证方式:在 VSCode 终端运行
which node和echo $PATH,对比系统终端输出是否一致
一键打包部署时如何避免误发测试环境到生产
所谓“一键”,本质是组合多个脚本 + 环境隔离。直接写 "deploy": "npm run build && scp..." 极易因 cwd 错误、分支未切换、环境变量漏设而发错。
- 用
Cross-env控制构建环境:"build:prod": "cross-env NODE_ENV=production vite build"
- 部署脚本加确认步骤(尤其涉及 rm / rsync --delete):
"deploy:prod": "npm run build:prod && echo 'Deploy to PROD? (y/N)' && read -r ans && [ \"$ans\" = \"y\" ] && rsync -av --delete dist/ user@prod-server:/var/www/app/"
- 更稳妥的做法:把部署逻辑抽成独立
deploy.js,用child_process.execSync分步控制,并校验当前 git 分支(git rev-parse --abbrev-ref HEAD)和 tag
为什么点击 NPM Scripts 面板里的 deploy 没反应,或卡在“running”
VSCode 的 NPM Scripts 面板本质是调用 npm run <script></script>,但它不继承你在终端里手动设置的 alias、函数或非标准 shell 功能(比如 zsh 的 glob 扩展)。一旦脚本里用了 $(date)、[[ -f ... ]] 或管道链过长,就可能静默失败。
- 打开 VSCode 设置,开启
npm.enableScriptExplorer(默认已开),再右键脚本 → “Run Script in Terminal”,观察真实输出 - 避免在 script 值里写多行命令;改用
npm-run-all或拆成子脚本:"predeploy": "npm run lint", "deploy": "npm-run-all predeploy build:prod --serial --race deploy:rsync"
- 某些部署命令(如
ssh密码交互)在 VSCode 终端里无法响应输入,必须提前配置 SSH key 并测试ssh user@server -o ConnectTimeout=5
真正麻烦的不是写脚本,而是部署动作本身不可逆、依赖外部状态(服务器权限、网络、磁盘空间)。每次改完 package.json 里的 deploy 脚本,务必先在本地模拟执行路径、检查 rsync 源目标是否反了、确认 --delete 是否真有必要。











