npm run
- npm run是npm的一个命令,其中run的英文意思是跑(运行),也就是说使用npm运行一个什么内容
- 那在这个跑的过程,到底发生了什么?我们今天就以项目启动命令npm run dev来举例一探究竟
-
读取
package.json
:npm
会读取项目根目录下的package.json
文件,特别是它的scripts
对象。
-
解析脚本命令:
- 在
scripts
对象中,查找dev
属性对应的值,这通常是一条可执行的命令。在我们的例子中,这个值是dev:vite
,其中vite
是一个可执行的脚本。
- 在
-
查找
vite
可执行命令:-
npm
会首先在当前项目的node_modules/.bin
目录中查找名为vite
的可执行命令。 -
如果在项目的
node_modules/.bin
中没有找到,它会尝试在全局的node_modules
目录中查找vite
。- 使用npm安装第三方包的时候只有我们加上-g才会在全局里面,这样在所有地方都能用(这是因为 -g 存放的位置配置过环境变量了),通常只有非常常用的第三方包我们才会这么做
- 那要怎么验证?我们只需要像上一集一样打开终端输入
npm config list
就可以看到prefix
了,我们的全局命令都在这里了
-
* 如果全局目录中也没有,npm
会继续在系统的环境变量中查找。
markdown
* 如果这些位置都没有找到,`npm` 会报错,指出无法找到命令。
- 不同平台的可执行文件:
markdown
* 成功找到
```js
vite
```
命令后,它会有不同的文件供不同的操作系统使用:
* `.sh` 文件用于 Linux、Unix 和 MacOS。
* `.cmd` 文件用于 Windows 的 CMD。
* `.ps1` 文件用于 Windows 的 PowerShell。
* 所以能够看出Node是一个跨平台运行的
npm 生命周期
npm执行命令也有生命周期
js
"predev": "node prev.js",
"dev": "node index.js",
"postdev": "node post.js"
//这三个命令分别能够执行下面圈出来的三个文件,npm run dev在这里就等于在终端敲入node index.js。他们是一个映射关系
执行 npm run dev 命令的时候 :
- predev 会自动执行 他的生命周期是在dev之前执行
- 然后执行dev命令
- 再然后执行postdev,也就是dev之后执行
-
运用场景例如我输入npm run build 进行打包前就先将dist目录删掉(dist是打包出来的东西,这里想表达的是我在打包之前,会将之前打包的东西清掉)等等
-
post例如你编写完一个工具发布npm,那就可以在之后写一个ci脚本顺便帮你推送到git等等
npm
的生命周期脚本是 npm
工具的一个功能,它允许开发者在主命令(如 start
, test
, build
, dev
等)的前后附加自定义脚本。这些生命周期脚本由 npm
预先定义,允许开发者挂钩在主要脚本执行的前后执行额外的任务。
为什么有这样的生命周期?
这些生命周期脚本使得自动化任务成为可能。例如,我希望在启动开发服务器之前(dev
命令)运行某些检查(predev
命令),或者在开发服务器启动之后立即执行某些任务(postdev
命令)。这种模式类似于编程中的"钩子",允许在关键事件发生时插入自定义逻辑。
他们之间的联系是什么?
联系是通过命名约定来实现的。npm
会查看 package.json
中的 scripts
对象,根据命名识别哪些脚本是主命令的前置(pre
)或后置(post
)脚本。因此,当我们执行 npm run dev
时,npm
会自动按顺序查找并执行:
predev
:如果定义了,它会在dev
脚本之前执行。dev
:主命令。postdev
:如果定义了,它会在dev
脚本之后执行。
还有其他类似的命令吗?
几乎所有的 npm
脚本都可以有前置(pre
)和后置(post
)脚本。这包括常用的脚本如:
prestart
/start
/poststart
pretest
/test
/posttest
prebuild
/build
/postbuild
prepublish
/publish
/postpublish
- 等等。
这些生命周期脚本在CI/CD流程、项目构建、测试和部署等方面非常有用。它们可以用来执行各种各样的任务,比如启动或清理环境、迁移数据库、压缩文件、部署到服务器等。通过这些脚本,开发者可以大大简化和自动化他们的工作流程。