【译】npm create vue@lastest 是如何工作的?

699 阅读4分钟

原文链接: How 'npm create vue@latest' works

介绍

我想我不是唯一对 Vue 快速入门文档中介绍的该命令功能感兴趣的人。

npm create vue@lastest

执行该命令后,我们会碰到一些魔法,我们可以为未来的 Vue 应用程序选择偏好设置。但是它实际上是如何工作的呢?

npm create

该命令的工作原理非常简单。大家都习惯使用 npm init 命令,所以我们来看看这些日志:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_5nyv1lobcqlwmjb5r9d1.avif

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w1qvbo6xygbyscjibfto.avif

两者都是一样的。npm create 仅是 npm init 的别名。我们使用 init 替换掉 create 看看效果:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_8fsiw7nfnqfmiuj3vvwj.avif

@lastest 就是简单地指向一个 npm 包的最新版本。你可以将它用在任何 npm 包上。

既然知道这点,我们可以阅读关于 npm init 的文档。在终端执行 npm help init:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_qczxwdvlrfdxuqq6fef9.avif

可以看到,我们也可以使用 npx 来代替 npm init,但是需要 create- 前缀:

npm init <package-spec> (same as `npx <package-spec>`)
npm init <@scope> (same as `npx <@scope>/create`)

尝试 npx 来执行之前的例子,然后我们会看到:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_pu1w7er5bj2sczqzjoz2.avif

我们回到 npm init 文档:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_2bdl6hj9zymt2ug5a9u2.avif

npxnpm exec 命令是非常相似的,但是也有一个不同之处,你可以在这里了解到 这里。使用 create-vue 时,我们不需要了解这点。

现在,我将调用所有已知命令,并演示它们都会产生相同的结果。当我们使用 npm create vue@latest 时,它与 npm init create-vue@latest 本质上是一样的 —— 只是一个别名而已。

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_a3ikgm0alktrto6ux8ay.avif

现在,我希望你了解了 npm create 的功能。那么,让我们进入下一个问题。

bin

这里你可以看到我们的测试项目:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_ridpmqr492u1x2wamyc8.avif

给示例项目安装 prettier:

npm i -D prettier

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_qr7y11tf07y64pf7kzgj.avif

现在如果你打开 node_modules 目录,你会看到一个 .bin 目录和一个名为 prettier 的软连接。它有什么用?你可以使用 npm 脚本和 npx 等命令从 .bin 资源库中执行已安装的可执行文件包。

例如,运行 npx prettier . --check:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_w10l7664od56izrc38sr.avif

它是起作用的。

我们打开 node_modules/.bin/prettier 文件看看它的代码:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_nqwb5q2pxsa5chfibfsv.avif

但软链接究竟是什么?它来自编程,我经常将软链接比作基本的重定向,但具有更高的稳定性。然而,并不是每个包都需要在 .bin 中占有一席之地。像 nodemon、webpack、gulp、eslint 和 create-vue 这样的包可以在 .bin 中找到,因为它们需要被执行。另一方面,像animate.css、swiper 和 express 这样的包在应用层运行,所以安装后你不会在 .bin 中找到它们。 npm 如何判断一个包是否可执行?很简单:通过使用 package.json 中的 bin 属性来指定可执行路径。如果你的包是可执行的,你可以进行相应的设置。我们看一下prettier 的 package.json 文件:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_uruzz5j878s23rnfu0wk.avif

可以看到:

"bin": "./bin/prettier.cjs"

让我们沿着 prettier 包中的路径 ./bin/prettier.cjs。不要将此路径与 node_modules/.bin 混淆。

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_0iesx4ugbltlaiaqec29.avif

我们之前在某个地方见过这个,不是吗?打开 node_modules 根目录下的 .bin/prettier,你会看到同样的代码。

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_nr1a2aul6i7h25ewpwue.avif

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 的软链接:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_y16ewt76uxii6ikx573s.avif

让我们转到 node_modules/create-vue 中的 package.json:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_p1j6eeojxo80pknmk95p.avif

可以看到,bin 字段的 create-vue 运行了 outfile.cjs 文件:

"bin": {
   "create-vue": "outfile.cjs"
},

如果我们打开它,会发现代码与 node_modules/.bin/create-vue(软链接)中的代码相同。

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_ie5o0bwbeoqllrsi7lxw.avif

这是否意味着我们可以简单地从终端执行 create-vue? 就像我们可以执行 outfile.cjs 一样。让我们试试看:

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_c3905mkg2x9qa9pxjib4.avif

当使用这个包提供的 npm init 或它的别名 npm create 时,npm 会在初始化的过程中去执行带有这个包名的二进制文件(bin)。

结论

我想指出另一个潜在的困惑之处。 Vue文档 提供了 create-vue GitHub 仓库的链接。但是,如果你访问该仓库,你将找不到 outfile.js 或与我们刚刚探索的 create-vue 包有任何直接相似之处。这是因为 GitHub 主要存储用于贡献和开发目的的开源代码。相反,npm 存储了你安装的实际捆绑包代码。因此,重要的是不要将 GitHub 仓库和通过 npm 安装的包混淆。

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_4trh4rpwl1ngo6zii7a8.avif

https___dev-to-uploads.s3.amazonaws.com_uploads_articles_gqenspgflxze2h87ncz5.avif

希望我的介绍对你有所帮助,现在你可以使用本指南了解和探索类似的软件包,如 create-react-appcreate svelte@latest