您现在的位置是:网站首页 > NPM脚本(npm scripts)文章详情

NPM脚本(npm scripts)

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

注意:starttest等是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"
  }
}

更推荐使用工具如concurrentlynpm-run-all

npm install concurrently --save-dev
{
  "scripts": {
    "dev": "concurrently \"webpack --watch\" \"nodemon server.js\""
  }
}

跨平台兼容性

不同操作系统的命令语法可能不同。例如,删除文件的命令在Windows和Unix-like系统中分别是delrm。解决方案:

  1. 使用跨平台工具如rimraf
    {
      "scripts": {
        "clean": "rimraf dist/*"
      }
    }
    
  2. 借助ShellJS等库编写跨平台脚本。

复杂脚本的模块化

当脚本逻辑复杂时,可以将其拆分为单独的JS文件,再通过node执行:

{
  "scripts": {
    "setup": "node scripts/setup.js"
  }
}

示例setup.js

const { execSync } = require('child_process');
execSync('npm install', { stdio: 'inherit' });
console.log('依赖安装完成!');

钩子脚本的实际应用

利用prepost钩子实现自动化流程。例如,在发布前运行测试:

{
  "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"
  }
}

性能优化技巧

  1. 减少依赖加载时间:使用--no-optional跳过可选依赖
    npm install --no-optional
    
  2. 缓存优化:通过--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"
  }
}

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步