当我们 npm install -g @vue/cli 之后,为什么就可以使用 vue 命令了 🤔

大家好,我是哈默。今天我们来简单说一下为什么当我们 npm install -g @vue/cli 之后,我们便可以直接使用 vue 命令来创建项目了。

一个小疑问 ❔

我们来到 Vue CLI 官网,可以看到使用 Vue CLI 的方式非常简单:

  1. npm install -g @vue/cli
  2. vue xxx

大家有没有曾经对这里有过这样的一个疑问:为什么我们安装完 @vue/cli,我们就可以在终端里输入 vue 命令来执行一系列的事情了呢?为什么不是 @vue/cli 命令?

原理揭秘 🪄

我们先直接上结论,再根据结论倒推着自己实现一下,可能会更好理解一点。

其实在 npm install -g @vue/cli 的时候,主要就做了 2 件事情:

  1. 将 @vue/cli 包下载到 node 安装位置/lib/node_modules 中:
  1. 根据 @vue/cli 的 package.json 中的 bin 属性,创建一个名为 vue 的软链接,指向实际执行的文件。

对于这个 bin 属性,我们再简单的剖析一下:

bin 属性的值是一个对象。

这个对象的 key 指的是我们软链接的名字,也就是我们在命令行中敲的命令的名字,这里的 key 为 vue

这也就意味着:如果我们将这个 key 写成 vuehamo,也就是:

js 复制代码
// package.json
{
  "bin": {
->  "vuehamo": "bin/vue.js"
  }
}

那么,我们就需要使用 vuehamo create vue-demo 来创建项目了。

这个对象的 value 是我们软链接指向的实际文件的路径,这里的 value 为 bin/vue.js

我们发现,在 @vue/cli 包的 bin 文件夹底下,确实有一个 vue.js 文件:

那么这个 vue.js 文件,就是我们在执行 vue create xxx 的时候,实际执行的文件,哈默之前也写过一篇文章分析了一下执行 vue create xxx 时候的原理。

自己实现一个命令 💁‍♂️

明确了原理之后,我们自己实现起来就会容易很多了,比如我们实现一个 hamovue 命令。

首先,我们创建一个项目 hamovue,通过 npm init 进行初始化:

它就是一个 npm 的包,只要我们完成了开发,就可以把它推送到 npm 仓库上去,供大家 npm install 进行安装使用。

然后,我们创建一个 bin 目录,里面创建一个 hamovue.js 文件,里面打印一句话:

注意 ⚠️,第一行需要加上 #!/usr/bin/env node,原因可以看上面提到的那篇文章

接下来,我们知道,我们还需要在 package.json 中添加 bin 属性:

这里我们可以简化一下步骤,不必将我们的 hamovue 发布到 npm 仓库上去,而是在本地执行 npm link 命令,将 hamovue 变成一个全局命令:

这个时候,当我们在命令行中执行 hamovue 的时候,就会执行 hamovue/bin/hamovue.js 里面的代码了:

总结 😇

我们在 npm install -g @vue/cli 的时候,会发生如下 2 件事情:

  1. 将 @vue/cli 包下载到 node 安装位置/lib/node_modules 中:

  2. 根据 @vue/cli 的 package.json 中的 bin 属性,创建一个名为 vue 的软链接,指向实际执行的文件。

这样我们便可以在 npm install 完后,使用我们的 vue 命令了。

相关推荐
玫城1 小时前
[ VUE ] 封装通用数组校验组件,el-input内使用
前端·javascript·vue.js
我是一只小青蛙8882 小时前
AVL树:平衡二叉搜索树原理与C++实战
java·jvm·面试
弓.长.5 小时前
React Native 鸿蒙跨平台开发:实现一个多功能单位转换器
javascript·react native·react.js
南半球与北海道#5 小时前
前端打印(三联纸票据打印)
前端·vue.js·打印
摘星编程6 小时前
React Native for OpenHarmony 实战:ToggleSwitch 切换开关详解
javascript·react native·react.js
董世昌416 小时前
深入浅出 JavaScript 常用事件:从原理到实战的全维度解析
前端
满栀5856 小时前
分页插件制作
开发语言·前端·javascript·jquery
qq_406176146 小时前
深入剖析JavaScript原型与原型链:从底层机制到实战应用
开发语言·前端·javascript·原型模式
弓.长.7 小时前
React Native 鸿蒙跨平台开发:BottomSheet 底部面板详解
javascript·react native·react.js
开开心心_Every7 小时前
免费窗口置顶小工具:支持多窗口置顶操作
服务器·前端·学习·macos·edge·powerpoint·phpstorm