12k
All articles

NPM Scripts 的实用技巧:远不止构建和启动

NPM scripts 可用于代码检查、测试和版本发布,并非仅限于基础构建命令。cross-env 与 rimraf 等工具有助于保持跨平台工作流的一致性。

OpenReplay Team
OpenReplay Team
NPM Scripts 的实用技巧:远不止构建和启动

前端开发者通常从简单的 npm run buildnpm run start 命令开始,但 NPM scripts 能为你的工作流程做更多事情。你可以利用 NPM scripts 来自动化重复性任务、简化开发流程,让你的项目更易于维护。

核心要点

  • NPM scripts 提供了一种简单、无依赖的方式来自动化前端工作流程
  • 使用 pre/post 钩子来链接命令,无需复杂语法
  • 利用跨平台工具确保脚本对所有团队成员都有效
  • 使用 npm-run-all 组合多个脚本来处理复杂工作流程
  • 通过环境变量访问 package.json 数据以实现动态脚本

什么是 NPM Scripts,为什么要使用它们?

NPM scripts 是在你的 package.json 文件中 "scripts" 部分定义的自定义命令。它们提供了一种简单的方式来运行命令行工具和自动化任务,无需安装全局包或复杂的构建工具。

{
  "name": "my-project",
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build"
  }
}

相比 Gulp 或 Grunt 等任务运行器,NPM scripts 的主要优势:

  • 零配置:在任何 npm 项目中都可以直接使用
  • 直接访问 CLI 工具:无需担心抽象层或插件
  • 依赖追踪:工具作为项目依赖安装,确保每个人使用相同版本
  • 简化工作流程:无需学习另一个工具的语法

前端开发者的 10 个实用 NPM Scripts

1. 代码检查和格式化

一致的代码风格提高可读性并减少错误。添加这些脚本来自动检查和格式化代码:

"scripts": {
  "lint": "eslint src/**/*.js",
  "lint:fix": "eslint src/**/*.js --fix",
  "format": "prettier --write \"src/**/*.{js,jsx,css,scss,json}\""
}

运行 npm run lint 检查问题,或运行 npm run format 自动格式化代码。

2. 清理构建目录

在创建新构建之前,清理之前的构建产物:

"scripts": {
  "clean": "rimraf dist",
  "prebuild": "npm run clean",
  "build": "webpack"
}

prebuild 脚本会在 build 之前自动运行,确保每次都有一个干净的开始。

3. 使用不同配置运行测试

为不同场景创建各种测试脚本:

"scripts": {
  "test": "jest",
  "test:watch": "jest --watch",
  "test:coverage": "jest --coverage",
  "test:e2e": "cypress run"
}

4. 管理环境变量

为开发、测试和生产环境设置不同的配置:

"scripts": {
  "dev": "cross-env NODE_ENV=development webpack serve",
  "build:dev": "cross-env NODE_ENV=development webpack",
  "build:prod": "cross-env NODE_ENV=production webpack"
}

cross-env 包确保这些脚本在不同操作系统上都能正常工作。

5. 监听文件变化

文件变化时自动重新构建:

"scripts": {
  "watch:css": "sass --watch src/styles:dist/styles",
  "watch:js": "webpack --watch",
  "watch": "npm-run-all --parallel watch:*"
}

npm-run-all 包允许并行运行多个脚本。

6. 同步环境文件

创建脚本来复制环境模板文件:

"scripts": {
  "sync-env": "node -e \"require('fs').copyFileSync('.env.example', '.env', fs.constants.COPYFILE_EXCL)\"",
  "postinstall": "npm run sync-env"
}

postinstall 钩子在 npm install 后自动运行,确保新团队成员获得环境文件。

7. 验证包依赖

检查过时、重复或有漏洞的依赖:

"scripts": {
  "check:deps": "npm outdated",
  "check:security": "npm audit",
  "check:duplicates": "npx depcheck"
}

8. 生成文档

从代码注释自动生成文档:

"scripts": {
  "docs": "jsdoc -c jsdoc.json",
  "predeploy": "npm run docs"
}

9. 自定义发布工作流程

自动化版本管理和发布:

"scripts": {
  "version:patch": "npm version patch",
  "version:minor": "npm version minor",
  "version:major": "npm version major",
  "release": "npm run build && npm publish"
}

10. 优化资源

压缩图片和其他资源:

"scripts": {
  "optimize:images": "imagemin src/images/* --out-dir=dist/images",
  "prebuild": "npm run clean && npm run optimize:images"
}

高级 NPM Script 技巧

使用 Pre/Post 钩子链接脚本

NPM 会自动运行以 “pre” 或 “post” 为前缀的脚本,分别在主脚本之前或之后执行:

"scripts": {
  "prebuild": "npm run lint",
  "build": "webpack",
  "postbuild": "npm run test"
}

当你运行 npm run build 时,它会自动执行 prebuild,然后 build,最后 postbuild

向脚本传递参数

使用 -- 向脚本传递参数:

npm run lint -- --fix

这会将 --fix 标志传递给实际的代码检查命令。

在脚本中使用环境变量

通过环境变量访问 package.json 数据:

"scripts": {
  "echo-version": "echo $npm_package_version"
}

当你运行 npm run echo-version 时,它会打印你的包版本。

跨平台兼容性

使用这些工具确保你的脚本在所有操作系统上都能工作:

  1. rimraf - rm -rf 的跨平台替代方案
  2. cross-env - 跨平台设置环境变量
  3. npm-run-all - 按顺序或并行运行多个脚本

跨平台脚本示例:

"scripts": {
  "clean": "rimraf dist",
  "copy": "copyfiles -u 1 src/**/*.html dist",
  "dev": "cross-env NODE_ENV=development npm-run-all clean copy --parallel watch:*"
}

实际案例:完整的前端工作流程

以下是现代前端项目的一套完整脚本:

{
  "scripts": {
    "clean": "rimraf dist",
    "lint:js": "eslint src/**/*.js --fix",
    "lint:css": "stylelint src/**/*.scss --fix",
    "lint": "npm-run-all --parallel lint:*",
    "test": "jest",
    "test:watch": "jest --watch",
    "format": "prettier --write \"src/**/*.{js,jsx,scss,json,md}\"",
    "validate": "npm-run-all --parallel lint test",
    "build:css": "sass src/styles:dist/styles --style compressed",
    "build:js": "webpack --mode production",
    "build": "npm-run-all clean lint --parallel build:*",
    "watch:css": "sass --watch src/styles:dist/styles",
    "watch:js": "webpack --watch",
    "serve": "browser-sync start --server dist --files dist",
    "dev": "npm-run-all clean --parallel watch:* serve",
    "prepublish": "npm run build",
    "version": "npm run format && git add -A src",
    "postversion": "git push && git push --tags"
  }
}

这个设置提供了:

  • 通过代码检查和测试进行代码质量检查
  • 自动格式化
  • 生产环境优化构建
  • 带热重载的开发服务器
  • 版本管理和发布工作流程

总结

通过实施这些实用的 NPM scripts,你将简化开发流程、提高代码质量,让项目更易于维护。从添加你最常执行任务的脚本开始,然后逐步扩展你的自动化工具包。

常见问题

NPM scripts 与 Gulp 等任务运行器相比如何?

NPM scripts 更简单,不需要插件,零配置。它们适合直接的任务,而 Gulp 可能更适合需要细粒度控制的复杂构建过程。

我可以调试 NPM scripts 吗?

可以,添加 --loglevel verbose 来查看详细输出,或使用 debug 包的 'npm run debug' 获取更多信息。

如何并行运行多个脚本?

使用 npm-run-all 包配合 --parallel 标志:npm-run-all --parallel script1 script2。

在 NPM scripts 中包含通配符的最佳方式是什么?

为了在 NPM scripts 中安全使用通配符,将模式用引号包围以防止 shell 扩展。这确保脚本在不同环境和 shell 配置中都能可靠工作。

如何在脚本中访问 package.json 的值?

NPM 将它们作为环境变量暴露:$npm_package_name、$npm_package_version 等。

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers

We use cookies to improve your experience. By using our site, you accept cookies.