背景
有时候老是会想,我们可以在命令行中可以使用node,npm等命令。他是怎么找到他们的呢!在项目中,package.json文件中存在这样的脚本:
{"scripts": {"serve": "vue-cli-service serve"}}
为什么我们可以通过npm run serve 执行这行命令来启动这个项目,但是我们直接在命令行上执行vue-cli-service serve会报错呢!
环境变量PATH
首先,我们一定绕不开的一个概念就是环境变量,在windows系统中,环境变量是一组非常重要的变量。其中有一个更为重要的变量为PATH变量,这个变量的作用就是给操作系统指明默认的搜索路径。
比如在命令行中输入某个可执行文件,如果在当前目录中没有找到的话,就会在PATH变量提供的路径中逐个搜索。
环境变量
环境变量如图所示:
:::info
如图可知,环境变量分为系统变量和用户变量。他们都存在Path变量。Path变量是一组路径组成,由;进行分隔。
:::
:::info
注意,启动cmd命令行的时候,会自动加载环境变量。所以如果对环境变量进行了修改,需要重新启动cmd命令行。
:::
我们可以在cmd中,输入echo %PATH%,查询系统环境变量PATH。
可执行文件的查询逻辑
比如我在任意路径下,打开命令行工具输入:work。他会怎么寻找这个名叫work的可执行文件呢?
- 先在执行该命令的当前目录中,找寻该可执行文件。没有找到,进行下一步。
- 从系统环境变量PATH中,逐个查找。没有找到进行下一步。
- 从用户环境变量PATH中,逐个查找。如果还是没有找到就报错。
一旦找到就停止查询。
所以背景中为什么会报错的小问题,就迎刃而解了:因为当前目录下,压根不存在vue-cli-service这个可执行文件,这个可执行文件是位于node_modules/.bin/下。至于为什么npm run serve命令为什么可以准确的找到这个可执行文件就涉及到scripts脚本的知识了。
