npm run xxx

npm run xxx后发生了什么

去 package.json 的 scripts 里找对应的 xxx,然后执行 xxx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "",
"private": ,
"version": "",
"type": "",
"scripts": {
"dev": "vite",
"build": "vue-tsc --noEmit && vite build",
"preview": "vite preview"
},
"dependencies": {
},
"devDependencies": {
}
}

所以 npm run dev 时,实际会执行 vite

为什么不直接执行 vite,而要执行 npm run dev?

因为 vite 指令不存在操作系统里

为什么执行 npm run dev 就能成功?

因为npm 会去找同名可执行文件

我们在 npm i vite 安装依赖时,就会在 node_modules/.bin/ 目录中创建 好 vite 为名的几个可执行文件,这些文件都是软链接。

vite - shell脚本

vite.cmd - cmd脚本

vite.ps1 - shell 脚本

以 vite.cmd 为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0

IF EXIST "%dp0%\node.exe" (
SET "_prog=%dp0%\node.exe"
) ELSE (
SET "_prog=node"
SET PATHEXT=%PATHEXT:;.JS;=;%
)

endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\vite\bin\vite.js" %*

主要就是在判断环境、拼接路径,然后指向运行 路径下的 /vite/bin/vite.js 脚本

实际脚本位置就在 node_modules/vite/bin/vite.js

之后会用 node 去执行这个 js 脚本

软连接是在哪形成的?

包中源代码的 package.json 中

1
2
3
4
5
6
7
// node_modules/vite/package.json
{
"version": "3.1.0",
"bin": {
"vite": "bin/vite.js"
}
}

在 npm install 时,npm 读到该配置(bin)后,就将 bin/vite.js 文件软链接到 ./node_modules/.bin 目录下

而 npm 还会自动把 node_modules/.bin 加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了。

总结

1.npm run xxx 时,会到 package.json 的 scripts 里找映射,执行对应的指令

2.指令实际是无法执行的,但 npm 会从全局的 node_modules/.bin 中查找指令同名的可执行文件,他们都是软链接。

3.软链接是写在 包的源代码的 package.json 中的,在 npm install 时会配置好,一般软链接的指向我们可以在 node_modules 下找到包,bin 里面有一个 js 文件,最后将在 node 中执行这个 js 文件。


npm run xxx
http://example.com/2022/09/24/npm-run-xxx/
Author
John Doe
Posted on
September 24, 2022
Licensed under