推荐使用 prepublishOnly 钩子在 npm publish 前自动执行测试,它仅在发布时触发、不干扰本地安装;配置 "prepublishOnly": "npm run test" 可确保测试失败则中止发布;避免已弃用的 prepublish;还可串联 build 等步骤增强验证,并通过 files 字段精确控制发布内容。

在 npm 包发布前自动执行测试用例,核心是利用 npm 内置的 publish 生命周期钩子,特别是 prepublishOnly —— 它只在 npm publish 执行时触发,且不会在 npm install 本地安装时运行,语义清晰、安全可靠。
✅ 推荐方式:用 prepublishOnly 确保发包前必过测试
在 package.json 的 scripts 字段中配置:
"scripts": {
"test": "jest",
"prepublishOnly": "npm run test"
}
这样每次执行 npm publish 时,npm 会自动按顺序执行:
-
prepublishOnly→ 运行npm run test - 若测试失败(进程退出码非 0),发布立即中止,不会上传任何内容
- 只有测试全部通过,才会继续走打包、上传流程
⚠️ 注意避开 prepublish 的陷阱
prepublish 曾被广泛使用,但它会在 npm install 本地安装时也触发,导致:
立即学习“Java免费学习笔记(深入)”;
- 开发者
npm install项目依赖时,意外运行测试甚至构建脚本 - CI/CD 中重复执行、拖慢流程,甚至因环境缺失而失败
- npm v4+ 已明确弃用该钩子,推荐统一使用
prepublishOnly
? 增强实践:组合构建与验证
更稳健的发布前检查可串联多个关键步骤:
"scripts": {
"test": "jest",
"build": "rollup -c",
"prepublishOnly": "npm run test && npm run build"
}
这确保:
- 测试通过 ✅
- 产物已正确生成(如
dist/目录存在且无报错)✅ - 二者任一失败,发布即终止 ✅
? 补充:配合 files 或 .npmignore 控制发布内容
即使测试和构建通过,也要防止误发源码或冗余文件。推荐显式声明:
- 在
package.json中设置"files"字段,只包含真正需要发布的目录/文件(如["dist", "lib", "index.js", "package.json"]) - 避免依赖
.npmignore,除非有特殊排除需求;files优先级更高,更可控


















