常规
正常来说我们运行脚手架一般都是这样:
npm install -g @vue/cli
vue create hello-world
安装在全局,然后利用脚手架中的指定 bin
字段运行具体脚本。
目前的方案
npm create vue@latest
npm init vue@latest
npx create-wujie@latest
运行后就会下载这个包进入交互式命令行,然后根据交互式命令行进行操作。跟传统步骤好像不一样。
在原来可能会考虑说脚手架是更新了,但是本地还是旧版本
但是现在都是增加 @latest
字段,这样就可以保证每次使用都是最新版本。
原理
npm exec
npm x
npm
官方文档中指出 x
,其实就是 exec
的别名,通俗来讲意思就是 npm exec、npm x
,两个命令是完全等价的。
npm exec <pkg>
的执行流程 - 在本地查找是否有<pkg>
对应的npm
包 - 若找到,则运行这个包的package.json
中bin
字段对应的可执行文件 - 若未找到,在远程npm
仓库查找是否有<pkg>
对应的 npm 包 - 若找到,则提示是否下载到本地 - 下载完成后,再运行这个包package.json
中bin
字段对应的可执行文件
同时,在执行bin
字段有几点注意的 - 如果bin
只有一个入口,那么可以执行 - 如果bin
有多个入口,则寻找和包名一样的那个入口 - 如果没找到,则npm exec <pkg>
报错。
举个栗子 🌰
// 这是package.json中的字段,简单列举,省略很多
{
"name": "create-vue"
"bin": {
"create-vue": "index.js",
"cva": "index.js"
}
...
}
执行npm exec crate-vue
这条命令后 - 首先本地查找是否有create-vue
这个npm
包 - 找到,则运行create-vue
这个npm
包中的package.json
中bin
字段对应的可执行文件,即index.js
这个文件 - 若未找到,在远程 npm 仓库查找是否有create-vue
这个包 - 若找到,则提示是否下载到本地 - 下载完成后,再运行这个包package.json
中bin
字段对应的可执行文件,即index.js
这个文件
看了bin
字段的内容,我们不妨在执行一下npm exec cva
这条命令,执行流程和上面的npm exec crate-vue
也是一样的
那么我们来分析一下:执行npm exec cva
这条命令后 - 首先本地查找是否有cva
这个 npm 包 - 找到,则运行cva
这个npm
包中的package.json
中bin
字段对应的可执行文件 - 若未找到,在远程npm
仓库查找是否有cva
这个包 - 若找到,则提示是否下载到本地 - 下载完成后,再运行这个包package.json
中bin
字段对应的可执行文件
这样我们应该就明白了,执行npm exec cva
这条命令后,我们其实是需要执行cva
这个包中package.json
文件中的bin
字段,而不是create-vue
这个包中的package.json
文件中的bin
字段。
但是执行后我们会发现,这个命令报错了,那么为什么呢?
因为 npm
包源中刚好含有这个包,但是没有bin
字段,所以报错了。
npx
可以简单理解成 npx
就是npm exec
的快捷方式,执行npx <pkg>
命令,就是执行npm exec <pkg>
命令。
npm exec create-vue
# 等同于
npx create-vue
npm init
npm create
npm innit
npm
官方文档中指出 create,innit
其实就是 init
的别名,通俗来讲意思就是,其实 npm init
,npm create
,npm innit
三个命令是完全等价的。
npm init/ npm create/ npm innit
这种后面没有<initializer>
是用来创建 package.json
文件的
npm init <initializer>/ npm create <initializer>/ npm innit <initializer>
这里的 npm init <initializer>
实际会调用 npm exec create-<initializer>
, 也相当于 npx create-<initializer>
。 我们可以把这个<initializer>
理解为 有特殊格式包名的包 的简称,它真正的包名为 create-<initializer>
,也只有符合这种特殊格式(create-<xxxx>
)的包才可以执行这样的命令。
总结
综上,对于举例的 create-vue 这个包我们可以有多种方法使用:
npm init vue/ npm create vue/ npm innit vue
npm exec create-vue/ npm x create-vue
npx create-vue