通过四个问题去掌握脚手架的实现原理

date
Jul 13, 2022
slug
22
status
Published
tags
Javascript
summary
通过思考四个问题去掌握脚手架的原理
type
Post
Book

1. 为什么全局安装@vue/cli后会添加的命令为vue?

npm instal -g @vue/cli
通过wich vue可以查看命令的位置
~ which vue
/Users/luxi/.nvm/versions/node/v17.7.2/bin/vue
进入/Users/luxi/.nvm/versions/node/v17.7.2/bin路径,通过ll查看文件属性
notion image
进入/Users/luxi/.nvm/versions/node/v17.7.2/lib/node_modules/@vue/cli/ 路径,查看package.json
{
	...

	"bin": {
		"vue": "bin/vue.js"
	}

	...
}
说明安装@vue/cli会在bin路径创建一个命名为vue的文件指向bin/vue.js

2. 全局安装@vue/cli时会发生什么?

  1. 首先在node的全局依赖路径/Users/luxi/.nvm/versions/node/v17.7.2/lib/node_modules安装@vue/cli。(也有可能在/usr/lib/路径下)
  1. 解析@vue/cli包内的package.json文件下bin的配置。如果发现bin有配置。会在nodebin目录(/Users/luxi/.nvm/versions/node/v17.7.2/bin)下创建一个相应的软链接,在这里是vue → bin/vue.js
{
	...

	"bin": {
		"vue": "bin/vue.js"
	}

	...
}

3. 执行vue命令时发生了什么?

在问题1中已经说明了当我们执行vue命令时,操作系统会在环境变量中查找vue命令对应的可执行文件。我们通过which vue也可以找到vue所指向的可执行文件。

4. 为什么vue指向一个js文件,我们却可以直接用vue命令去执行它?

一般情况下我们是无法直接执行js文件。
➜  Desktop ./test.js
zsh: permission denied: ./test.js
提示权限拒绝,通过ll指令可以查看test.js文件的权限
➜  Desktop ll | grep test.js
-rw-r--r--   1 luxi  staff    30B Jul 13 22:07 test.js
可以看到test.js文件不是一个可执行文件,我们通过chmod指令来修改它的权限。
➜  Desktop chmod 777 test.js
➜  Desktop ll | grep test.js
-rwxrwxrwx   1 luxi  staff    30B Jul 13 22:07 test.js
这时候我们执行一下test.js文件
➜  Desktop ./test.js
./test.js: line 1: syntax error near unexpected token `'hello, world!!''
./test.js: line 1: `console.log('hello, world!!')'
同样是无法执行,为什么呢?因为平时我们执行js文件都是通过js的解释器去执行。例如node就是一个js的解释器。
那么为什么vue命令指向一个js文件却可以直接执行?
我们通过查看一下vue.js文件。
notion image
在Unix中,凡是被#!注释的,统统是加载器(解释器)的路径。
而在vue.js文件的首行就是#!/usr/bin/env node。它的意思就是在系统环境变量中找node这个程序作为文件的解释器。所以我们执行vue命令时,其实就相当于执行node vue.js

扩展

两者有什么区别?
#!/usr/bin/env node
#!/usr/nin/node
  • 第一种是在环境变量中查找node
  • 第二种是直接执行/usr/bin目录下的node,将解释器的路径写死了。实际上不能保证路径的有效性,所以强烈不推荐用这种写法。
 

© LewisWong 2021 - 2025