介绍
我想我不是唯一对 Vue 快速入门文档中介绍的该命令功能感兴趣的人。
npm create vue@lastest
执行该命令后,我们会碰到一些魔法,我们可以为未来的 Vue 应用程序选择偏好设置。但是它实际上是如何工作的呢?
npm create
该命令的工作原理非常简单。大家都习惯使用 npm init
命令,所以我们来看看这些日志:
两者都是一样的。npm create
仅是 npm init
的别名。我们使用 init
替换掉 create
看看效果:
@lastest 就是简单地指向一个 npm 包的最新版本。你可以将它用在任何 npm 包上。
既然知道这点,我们可以阅读关于 npm init
的文档。在终端执行 npm help init
:
可以看到,我们也可以使用 npx
来代替 npm init
,但是需要 create-
前缀:
npm init <package-spec> (same as `npx <package-spec>`)
npm init <@scope> (same as `npx <@scope>/create`)
尝试 npx
来执行之前的例子,然后我们会看到:
我们回到 npm init
文档:
npx
和 npm exec
命令是非常相似的,但是也有一个不同之处,你可以在这里了解到 这里。使用 create-vue
时,我们不需要了解这点。
现在,我将调用所有已知命令,并演示它们都会产生相同的结果。当我们使用 npm create vue@latest
时,它与 npm init create-vue@latest
本质上是一样的 —— 只是一个别名而已。
现在,我希望你了解了 npm create
的功能。那么,让我们进入下一个问题。
bin
这里你可以看到我们的测试项目:
给示例项目安装 prettier:
npm i -D prettier
现在如果你打开 node_modules
目录,你会看到一个 .bin
目录和一个名为 prettier
的软连接。它有什么用?你可以使用 npm 脚本和 npx
等命令从 .bin
资源库中执行已安装的可执行文件包。
例如,运行 npx prettier . --check
:
它是起作用的。
我们打开 node_modules/.bin/prettier
文件看看它的代码:
但软链接究竟是什么?它来自编程,我经常将软链接比作基本的重定向,但具有更高的稳定性。然而,并不是每个包都需要在 .bin
中占有一席之地。像 nodemon、webpack、gulp、eslint 和 create-vue 这样的包可以在 .bin
中找到,因为它们需要被执行。另一方面,像animate.css、swiper 和 express 这样的包在应用层运行,所以安装后你不会在 .bin
中找到它们。 npm 如何判断一个包是否可执行?很简单:通过使用 package.json
中的 bin
属性来指定可执行路径。如果你的包是可执行的,你可以进行相应的设置。我们看一下prettier 的 package.json
文件:
可以看到:
"bin": "./bin/prettier.cjs"
让我们沿着 prettier 包中的路径 ./bin/prettier.cjs
。不要将此路径与 node_modules/.bin
混淆。
我们之前在某个地方见过这个,不是吗?打开 node_modules
根目录下的 .bin/prettier
,你会看到同样的代码。
prettier
有:
"bin": "./bin/prettier.cjs"
因此,npm 创建 bin 存储库并在其中插入一个软链接,该链接引用 bin/prettier.cjs
内的 Prettier 包文件。现在你了解了软链接在实践中是如何工作的:)
如果从
node_modules
中移除.bin
目录,并尝试运行npx prettier .
,它会抛出一个错误 sh: 1: prettier: not found,不管你是否安装了prettier
包。
create-vue
现在让我们使用 npm rm prettier
来移除 prettier 包和 npm i -D create-vue
来安装 create-vue。在 .bin
目录中,我们可以看到 create-vue
的软链接:
让我们转到 node_modules/create-vue
中的 package.json
:
可以看到,bin 字段的 create-vue
运行了 outfile.cjs
文件:
"bin": {
"create-vue": "outfile.cjs"
},
如果我们打开它,会发现代码与 node_modules/.bin/create-vue
(软链接)中的代码相同。
这是否意味着我们可以简单地从终端执行 create-vue
? 就像我们可以执行 outfile.cjs 一样。让我们试试看:
当使用这个包提供的 npm init
或它的别名 npm create
时,npm 会在初始化的过程中去执行带有这个包名的二进制文件(bin)。
结论
我想指出另一个潜在的困惑之处。 Vue文档 提供了 create-vue GitHub 仓库的链接。但是,如果你访问该仓库,你将找不到 outfile.js
或与我们刚刚探索的 create-vue
包有任何直接相似之处。这是因为 GitHub 主要存储用于贡献和开发目的的开源代码。相反,npm 存储了你安装的实际捆绑包代码。因此,重要的是不要将 GitHub 仓库和通过 npm 安装的包混淆。
希望我的介绍对你有所帮助,现在你可以使用本指南了解和探索类似的软件包,如 create-react-app
或 create svelte@latest
。