您现在的位置是:网站首页 > NPM脚本(npm scripts)文章详情
NPM脚本(npm scripts)
陈川
【
Node.js
】
57714人已围观
3627字
npm scripts是Node.js项目中不可或缺的一部分,通过package.json
中的scripts
字段定义,能够快速执行常见任务,比如启动服务、运行测试或打包代码。它们不仅简化了命令行操作,还能通过组合命令实现复杂的自动化流程。
npm scripts的基本用法
在package.json
中,scripts
字段是一个键值对集合,键是脚本名称,值是要执行的命令。例如:
{
"scripts": {
"start": "node server.js",
"test": "jest"
}
}
运行这些脚本时,只需在终端输入:
npm run start
# 或简写为
npm start
npm run test
注意:start
、test
等是npm默认支持的脚本,可以省略run
直接执行。
预定义脚本与自定义脚本
npm提供了一些预定义脚本钩子,比如:
prestart
:在start
之前自动执行posttest
:在test
之后自动执行
{
"scripts": {
"prestart": "echo '准备启动服务...'",
"start": "node server.js",
"posttest": "echo '测试已完成!'"
}
}
自定义脚本则可以自由命名,比如构建项目的脚本:
{
"scripts": {
"build": "webpack --mode production"
}
}
环境变量与参数传递
npm scripts中可以通过process.env
访问环境变量。例如,传递一个自定义环境变量:
npm run build -- --env.NODE_ENV=production
在脚本中获取:
{
"scripts": {
"build": "webpack --env.NODE_ENV=$npm_config_env_NODE_ENV"
}
}
串行与并行执行
使用&&
实现串行执行(前一个成功后再执行下一个):
{
"scripts": {
"deploy": "npm run build && npm run publish"
}
}
使用&
(Windows)或|
(Unix-like)实现并行执行:
{
"scripts": {
"watch": "webpack --watch & nodemon server.js"
}
}
更推荐使用工具如concurrently
或npm-run-all
:
npm install concurrently --save-dev
{
"scripts": {
"dev": "concurrently \"webpack --watch\" \"nodemon server.js\""
}
}
跨平台兼容性
不同操作系统的命令语法可能不同。例如,删除文件的命令在Windows和Unix-like系统中分别是del
和rm
。解决方案:
- 使用跨平台工具如
rimraf
:{ "scripts": { "clean": "rimraf dist/*" } }
- 借助ShellJS等库编写跨平台脚本。
复杂脚本的模块化
当脚本逻辑复杂时,可以将其拆分为单独的JS文件,再通过node
执行:
{
"scripts": {
"setup": "node scripts/setup.js"
}
}
示例setup.js
:
const { execSync } = require('child_process');
execSync('npm install', { stdio: 'inherit' });
console.log('依赖安装完成!');
钩子脚本的实际应用
利用pre
和post
钩子实现自动化流程。例如,在发布前运行测试:
{
"scripts": {
"pretest": "eslint src",
"test": "jest",
"prepublishOnly": "npm run test"
}
}
调试npm脚本
添加--inspect
参数调试Node.js脚本:
{
"scripts": {
"debug": "node --inspect server.js"
}
}
或在Chrome DevTools中调试:
npm run debug
与其他工具集成
结合npx
直接运行本地安装的工具:
{
"scripts": {
"format": "npx prettier --write src/**/*.js"
}
}
性能优化技巧
- 减少依赖加载时间:使用
--no-optional
跳过可选依赖npm install --no-optional
- 缓存优化:通过
--prefer-offline
优先使用缓存{ "scripts": { "ci": "npm install --prefer-offline" } }
真实项目示例
一个完整的React项目脚本配置可能包含:
{
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"lint": "eslint src",
"format": "prettier --write \"src/**/*.{js,jsx}\"",
"prepare": "husky install",
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook"
}
}
错误处理策略
通过||
操作符处理失败情况:
{
"scripts": {
"deploy": "npm run build || echo '构建失败!'"
}
}
更复杂的错误处理可以结合Shell脚本:
{
"scripts": {
"safe-deploy": "sh scripts/deploy.sh"
}
}
自动化部署流程
典型CI/CD流程的脚本示例:
{
"scripts": {
"ci:test": "npm run lint && npm run test -- --coverage",
"ci:build": "npm run build",
"ci:deploy": "npm run ci:test && npm run ci:build && ./deploy.sh"
}
}
本地开发环境配置
开发时常用的辅助脚本:
{
"scripts": {
"dev": "nodemon --watch src --exec 'npm start'",
"reset-db": "node scripts/reset-db.js",
"seed": "node scripts/seed-data.js"
}
}