很容易忽略的npm run 、yarn run、pnpm run 的细节

708 阅读2分钟

我们可以通过 npm start 执行package.json 文件中scripts字段定义的start 命令, 但是我们执行 npm build 却发现报错了(package.json 中已定义build命令) 。 如果我们执行 yarn build又可以执行到package.json 中scripts定义的 build 命令。 但是我们如果运行 yarn update 发现没有执行到package.json 中定义的 update 命令, 这是为什么呢? 下面我们一起来研究研究。

npm run <script_name>

npm run <script_name> 执行 package.json 文件中 scripts 定义的命, 比如

// package.json
{
  "scripts": {
    "start": "echo \">>>>start\""
  }
}


// 命令终端运行一下命令,就会执行scripts 中的 start 命令
npm run start  // >>>>start

npm run 简写

npm run <script_name> , 如果 script_name 为 start 、stop 、test、restart 这几个命令, 可以支持简写,省略 run

npm run start
npm start # 简写

npm run stop
npm stop # 简写

npm run test
npm test # 简写

npm run restart
npm restart # 简写

npm run build
npm build # 错误, 不能简写, 这里是执行npm 内置命令 build,因为npm没有build的内置命令所以报错

注意: 只有上面列出的几个命令支持简写, 其他的自定义script命令不支持。

有点窍门的 restart

运行 npm restart 或者 npm run restart , 如果 package.json 文件中 scripts 定义了 restart 命令, 则运行对应的restart 命令, 如果package.json 文件中 没有定义 restart,那么执行步骤:

  1. 运行 npm stop (package.json 文件中没定义则跳过)
  2. 运行 npm start (package.json 文件中没定义start 报错)

yarn run <script_name>

yarn run <script_name> 执行 package.json 文件中 scripts 定义的命, 和 npm run <script_name> 都是干的同一个事情, 但是在简写规则上有些不同。

yarn run 简写

pakcage.json 文件中 scripts字段定义的所有命令都可以简写,但是不能和yarn 本身内置的命令重名。


yarn run start
yarn start # 简写

yarn run build
yarn build # 简写

yarn run upgrade
yarn upgrade # 错误,不能简写, 因为 upgrade 是yarn内部命令, 这里执行的是yarn 内部命令, 不是scripts 对应的 upgrade 命令

如何查看 yarn 内置了哪些命令 yarn --help

pnpm run

pnpm run <script_name> 执行 package.json 文件中 scripts 定义的命, 和 npm run <script_name> 也是干的同一个事情,简写规则上和yarn差不多, restart 命令的执行上和npm有点类似。

pnpm run 简写

pakcage.json 文件中 scripts字段定义的所有命令都可以简写,但是不能和pnpm 本身内置的命令重名。

pnpm run start
pnpm start # 简写

pnpm run build
pnpm build # 简写

pnpm run update
pnpm update # 错误,不能简写, 因为 update 是pnpm内部命令, 这里执行的是pnpm 内部命令, 不是scripts 对应的 update 命令

有点窍门的 restart

pnpm run restart , 如果 package.json 文件中 scripts 定义了 restart 命令, 则运行对应的restart 命令,

pnpm restart 执行步骤

  1. 运行 pnpm run stop (package.json 文件的 scripts中没定义 stop 报错)
  2. 运行 pnpm run restart (package.json 文件的 scripts中没定义 restart 报错)
  3. 运行 pnpm run start (package.json 文件的 scripts中没定义 start, 会执行默认的start: node server.js)