Nodejs 第五章 Npm run 原理

npm run

  • npm run是npm的一个命令,其中run的英文意思是跑(运行),也就是说使用npm运行一个什么内容
  • 那在这个跑的过程,到底发生了什么?我们今天就以项目启动命令npm run dev来举例一探究竟
  1. 读取 package.json:

    • npm 会读取项目根目录下的 package.json 文件,特别是它的 scripts 对象。
  2. 解析脚本命令:

    • 在 scripts 对象中,查找 dev 属性对应的值,这通常是一条可执行的命令。在我们的例子中,这个值是 dev:vite,其中 vite 是一个可执行的脚本。
  3. 查找 vite 可执行命令:

    • npm 会首先在当前项目的 node_modules/.bin 目录中查找名为 vite 的可执行命令。

    • 如果在项目的 node_modules/.bin 中没有找到,它会尝试在全局的 node_modules 目录中查找 vite。

      • 使用npm安装第三方包的时候只有我们加上-g才会在全局里面,这样在所有地方都能用(这是因为 -g 存放的位置配置过环境变量了),通常只有非常常用的第三方包我们才会这么做
      • 那要怎么验证?我们只需要像上一集一样打开终端输入npm config list就可以看到prefix了,我们的全局命令都在这里了

* 如果全局目录中也没有,npm 会继续在系统的环境变量中查找。

markdown 复制代码
*   如果这些位置都没有找到,`npm` 会报错,指出无法找到命令。
  1. 不同平台的可执行文件:
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 命令的时候 :

  1. predev 会自动执行 他的生命周期是在dev之前执行
  2. 然后执行dev命令
  3. 再然后执行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 会自动按顺序查找并执行:

  1. predev:如果定义了,它会在 dev 脚本之前执行。
  2. dev:主命令。
  3. postdev:如果定义了,它会在 dev 脚本之后执行。

还有其他类似的命令吗?

几乎所有的 npm 脚本都可以有前置(pre)和后置(post)脚本。这包括常用的脚本如:

  • prestart / start / poststart
  • pretest / test / posttest
  • prebuild / build / postbuild
  • prepublish / publish / postpublish
  • 等等。

这些生命周期脚本在CI/CD流程、项目构建、测试和部署等方面非常有用。它们可以用来执行各种各样的任务,比如启动或清理环境、迁移数据库、压缩文件、部署到服务器等。通过这些脚本,开发者可以大大简化和自动化他们的工作流程。

相关推荐
jktantan14 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么14 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
只睡四小时14 小时前
MCP 弃用 SSE?Node 分帧漏 81.7% 事件
node.js·webassembly·实时通信·mcp·streamable http
2601_9628857215 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel15 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓15 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人16 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every16 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad16 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新17 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能