从使用角度理解什么是脚手架?

脚手架在我们创建目录时经常用到过,但却很少探究它的原理,本篇文章呢就和大家一起来探究脚手架的原理,执行命令的背后到底做了什么事。

脚手架的简介

举一个例子🌰,我们创建项目时经常用到的一个命令;

js 复制代码
vue create vue-test

上面这条命令由3部分组成:

  1. 主命令:vue
  2. command:create
  3. command的param:vue-test

它表示创建一个vue的项目,这个项目的名称是vue-test,这是一个简单的脚手架命令,还有更加复杂的场景; 比如说:当前的目录下已经有文件了,我们需要覆盖掉当前目录的文件,强制进行安装vue的项目,此时我们可以用:

js 复制代码
vue create vue-test --force

这里的--force叫做option,用来辅助脚手架确定在特定场景下用户的选择(可以理解为配置),还有一种场景:

通过vue create创建项目时,会自动执行npm install帮用户安装以来,如果我们希望用淘宝源来安装可以使用如下命令:

js 复制代码
vue create vue-test --force -r https://registry.npm.taobao.org

上面的-r也叫做option,这里的-r也可以替换成--registry;有这么多的命令,我们怎么知道怎么用呢?这时我们就可以用到下面这个命令,输入这个命令就可以看到vue create支持的所有的options;

js 复制代码
vue create --help

-r https://registry.npm.taobao.org后面的https://registry.npm.taobao.org成为option的param,其实--force也可以理解为--force true,简写成:--force或者-f;

脚手架的执行原理

我们在终端输入vue create vue-test命令时,它到底是怎么处理的呢?

1.输入vue create vue-test命令;

2.终端会在环境变量中找到vue指令;

如何在环境变量中找到vue指令呢?

在终端中输入which vue,我们可以看到node安装目录下的bin目录下的vue这个命令;

我们可以进入node的目录看一下cd /Users/Minjie/.nvm/versions/node/v19.9.0/,在node目录下它是有如下一些文件夹:

这里我们重点看的是binlib目录,它们和脚手架的执行原理有关;在这个bin的目录下面,有一个vue的命令;

我们直接输入vue,其实执行的是node下bin目录下的vue; 这里的vue是一个超链接,我看一下它指向了哪里;首先进入lib/node_modules目录;我们通过npm -g安装的包都会放到这个目录来;在这里可以查询出我们所有全局安装的包;

接着我们进入@vue/cli目录下,我们可以看到vue-cli的源码,它有一个bin目录,bin目录下有一个vue.js,上文所讲的vue超链接就是指向这里的vue.js

它的过程可参考下图,vue超链接实际执行的是lib/node_modules下的vue.js文件:

脚手架执行的原理如下:

  1. 在终端输入vue create vue-test;
  2. 终端解析出vue命令;
  3. 终端在环境变量中找到vue命令;
  4. 终端根据vue命令链接到实际文件vue.js
  5. 终端利用node执行vue.js
  6. vue.js解析command/options
  7. vue.js执行command;
  8. 执行完毕,退出执行;

从应用的角度看如何开发一个脚手架?

这里以vue-cli为例:

  • 开发npm项目,该项目中应包含一个bin/vue.js文件,并将这个项目发布到npm;
  • 将npm项目安装到node的lib/node_modules
  • 在node的bin目录下配置的vue的软链接指向lib/node_modules/@vue/cli/bin/vue.js
    这样我们在执行vue命令时就可以找到vue.js执行;
相关推荐
熊的猫32 分钟前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
别拿曾经看以后~2 小时前
【el-form】记一例好用的el-input输入框回车调接口和el-button按钮防重点击
javascript·vue.js·elementui
川石课堂软件测试2 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
JerryXZR2 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
problc3 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
Gavin_9153 小时前
【JavaScript】模块化开发
前端·javascript·vue.js
懒大王爱吃狼4 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
待磨的钝刨5 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
前端青山10 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
从兄11 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript