天天命令中输入 npm run xxx,倒底 npm run 做了什么,为什么就能开启一个服务?

2022-10-28 18:45:54 浏览数 (1)

人生的意义在于修炼灵魂,首先要有纯洁美丽的心灵,这是思考人生要具备的,拥有什么样的心灵,就会选择什么样的人生,实现什么样的人生价值

--出自《稻盛和夫给年轻人的忠告》

01

什么是npm

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

出自《菜鸟教程》

其实说白了 npm 就是一个基于 node 下的包管理工具,做过 java 开发的同学肯定 maven,作用都差不多。但是今天我们重点介绍的不是 npm 是什么,而且是基于我们平时在开发的过程中都会在命令中行中输入:

代码语言:javascript复制
//开发阶段
npm run dev
或者
npm run serve
// 打包阶段
npm run build

到底是怎么样的一个原理。

02

基于webpack打包工具下的npm

其实npm和webpack两者没有必然的联系,并不是说我的npm命令只能运行在webpack中。 当我们用 npm init 初始化一个项目之后,我们就可用 npm 命令了,这里也不需要webpack。 但是众所周知我们在开发Vue项止的时候,都少不了和 webpack 和 vite 这样的工具打交道。下面我就介绍一下基于webpack打包工具下的npm是怎么样的运行过程。

首先我们创建一个vue项目项目:

代码语言:javascript复制
vue create test-vue

我的vue-cli版本是4.4.6,所以要通过这行命令创建。其它版本的可以查一下官方文档。这里不过多解释。

当创建好之后出现以下提示,说明项目已经创建好了

用vscode打开项目,看一下文件目录:

这里面有一个比较重要的文件就是 package.json。

下篇文章我们重点介绍一下 package.json 倒底是怎么个东西。

03

原理分析

我们在命令行中输入命令:

代码语言:javascript复制
npm run serve

看一下运行成功之后的提示信息:

有没有小伙伴想过这样的问题:为什么是运行npm run serve命令呢,这些命令在哪里呢,我该怎么记住这些命令。

其实这个命令不需要记这个命令,我们只要记住 npm run就好,当我们创建完项目之后可以看到一个package.json文件。看一下主要的内容:文件内容过多,我们主要看一下 script标签的内容

代码语言:javascript复制
{
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  }
}

聪明的小朋友可能已经明白了,会不会我们 npm run serve 就是执行的的第一行吧。其实是对的,当我们输入 npm run 之后,就是相当于运行 vue-cli-service serve 这行指令。这个名称可以改,我们改成 dev 之后,就是 npm run dev。不知小伙伴是否明白了。

是谁帮我们做的这些事

那么又是谁帮我们把项目运行起来的呢?

  • 输入 npm run serve回车,
  • npm会在项目的目录下找到 node_modules文件夹下的 .bin目录
  • 把此目录添到系统的path环境变量下,执行完之后再把环境变量下的目录删除。
  • 打开这个文件夹可以看到一个文件:vue-cli-service 这其实是一个 link 快捷方式,它指向 @ vue/cli-service/bin/vue-cli-service.js这个文件。

npm run serve 就是在运行这个vue-cli-service.js脚本文件。看一下里面的一些代码:

代码语言:javascript复制
const Service = require('../lib/Service')
const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())
// ....省略了一些代码
const command = args._[0]
service.run(command, args, rawArgv).catch(err => {
  error(err)
  process.exit(1)
})

这个文件中的源码是非常多的,我们只是取了比较重要和直观的源码进行分析了一下,让大家明白,这里其实就是开启了一个node服务。

最重要的是上面的那几个步骤,大家要做到心中有数,要尽量:知其然,知其所以然。这样才能对自己的内功有更好的帮助和提升。

0 人点赞