背景

有时候老是会想,我们可以在命令行中可以使用nodenpm等命令。他是怎么找到他们的呢!在项目中,package.json文件中存在这样的脚本:

  1. {
  2. "scripts": {
  3. "serve": "vue-cli-service serve"
  4. }
  5. }

为什么我们可以通过npm run serve 执行这行命令来启动这个项目,但是我们直接在命令行上执行vue-cli-service serve会报错呢!

环境变量PATH

首先,我们一定绕不开的一个概念就是环境变量,在windows系统中,环境变量是一组非常重要的变量。其中有一个更为重要的变量为PATH变量,这个变量的作用就是给操作系统指明默认的搜索路径。
比如在命令行中输入某个可执行文件,如果在当前目录中没有找到的话,就会在PATH变量提供的路径中逐个搜索。

环境变量

环境变量如图所示:
image.png :::info 如图可知,环境变量分为系统变量和用户变量。他们都存在Path变量。Path变量是一组路径组成,由;进行分隔。 ::: :::info 注意,启动cmd命令行的时候,会自动加载环境变量。所以如果对环境变量进行了修改,需要重新启动cmd命令行。 ::: 我们可以在cmd中,输入echo %PATH%,查询系统环境变量PATH。

可执行文件的查询逻辑

比如我在任意路径下,打开命令行工具输入:work。他会怎么寻找这个名叫work的可执行文件呢?

  1. 先在执行该命令的当前目录中,找寻该可执行文件。没有找到,进行下一步。
  2. 从系统环境变量PATH中,逐个查找。没有找到进行下一步。
  3. 从用户环境变量PATH中,逐个查找。如果还是没有找到就报错。

一旦找到就停止查询。
所以背景中为什么会报错的小问题,就迎刃而解了:因为当前目录下,压根不存在vue-cli-service这个可执行文件,这个可执行文件是位于node_modules/.bin/下。至于为什么npm run serve命令为什么可以准确的找到这个可执行文件就涉及到scripts脚本的知识了。