vue-cli@2的原理解析

作为一个菜鸟,我有一颗好奇的心,每当vue init 的时候,看到那流畅的进度和神奇的结果,心里都充满一窥其本质的期望……

以下就是我不断的console,大致理出来的一个流程心得,纪录在此,以作备忘。

1、which vue,定位vue命令的实际位置

 

2、去往命令vue的目录,查看代码

这里的commander包是用来创建命令行的工具,其npm官网粗略了解,了解到其中的init、list命令会在当前目录寻找执行vue-init、vue-list文件

The commander will try to search the executables in the directory of the entry script (like ./examples/pm) with the name program-command, like pm-installpm-search.

 

3、查看vue-init文件及其代码

通过ls命令我们可以看到,命令文件的真实位置是在全局node_modules下的vue-cli里面,所以代码里的require包都是从vue-cli包下找的

这个文件就是init命令的主体了,里面主要有

download-git-repo、inquirer等包 和 cli/lib下的功能函数 check-version、generate等

 

3.1、check-version 的作用

首先其会比对vue-cli的package.json里的node版本和当前process.version的环境版本,如果环境版本低就会报错。

其次其会请求线上vue-cli的最新版本,来告诉用户是否有新的vue-cli版本可以更新,只是给用户一个提示

const request = require('request')
const semver = require('semver')
const chalk = require('chalk')
const packageConfig = require('../package.json')module.exports = done => {// Ensure minimum supported node version is usedif (!semver.satisfies(process.version, packageConfig.engines.node)) {return console.log(chalk.red('  You must upgrade node to >=' + packageConfig.engines.node + '.x to use vue-cli'))}request({url: 'https://registry.npmjs.org/vue-cli',timeout: 1000}, (err, res, body) => {if (!err && res.statusCode === 200) {const latestVersion = JSON.parse(body)['dist-tags'].latestconst localVersion = packageConfig.versionif (semver.lt(localVersion, latestVersion)) {console.log(chalk.yellow('  A newer version of vue-cli is available.'))console.log()console.log('  latest:    ' + chalk.green(latestVersion))console.log('  installed: ' + chalk.red(localVersion))console.log()}}done()})
}

  

3.2 、download-git-repo的作用

用来通过git clone 或者  http下载的方式,从github、gitlab等平台下载仓库代码,具体可去官网查看,

默认,我们没有指定clone参数,程序会从 https://github.com/vuejs-templates/webpack/archive/master.zip 下载模版

如果用 vue init webpack -c 则会通过 git clone git@github.com:vuejs-templates/webpack.git 来下载(本地配置sshkey,可以下载私有库)

tmp变量是临时存放模版的目录,默认在 ~/.vue-templates/

 

const tmp = path.join(home, '.vue-templates', template.replace(/[\/:]/g, '-'))
……
download(template, tmp, { clone }, err => {spinner.stop()if (err) logger.fatal('Failed to download repo ' + template + ': ' + err.message.trim())generate(name, tmp, to, err => {if (err) logger.fatal(err)logger.success('Generated "%s".', name)})
})

  

如果我们要配置自己项目的模版目录,就好好看看vue-init文件里的run函数吧 ^_^,祝你成功^_^。

3.3、inquirer的作用

起到一个prompt confirm的作用

Generate project in current directory?

Target directory exists. Continue?

 

3.4、generate函数的作用

主要代码

 

  metalsmith.clean(false).source('.') // start from template root instead of `./src` which is Metalsmith's default for `source`.destination(dest).build((err, files) => {done(err)if (typeof opts.complete === 'function') {const helpers = { chalk, logger, files }opts.complete(data, helpers)} else {logMessage(opts.completeMessage, data)}})

  

下载完模版后的处理逻辑都在这里面了,函数文件位于 vue-cli/lib/generate.js,这里面主要用了

metalsmith、handlebars等包 和 lib/options.js 

options.js 会去 ~/.vue-templates/模版 目录下获取 meta.js 或者 meta.json 中的配置。

这个配置就是用来配置图中的东西。

 

3.4.1、metalsmith 的作用

类似于gulp,是一个流程工具,英文不好,我看它看的头疼,只知道它干了什么,但不知道它是怎么做的。

它会配置options.js里获取的配置数据,对模版文件进行过滤

 

3.4.2、handlebars 的作用

一个js模版工具,类似服务端的smarty、前端的artemplate、es6的字符串模版等。

它会在metalsmith的流程里处理模版里的变量,把我们填写的项目名等数据渲染成最终的文件,写进当前项目目录里。《完》


 

很久没写博客,写着好别扭啊,不支持markdown,只能凭感觉来写了,估计预览起来会很难看,希望大家见谅。

最后吟诗一首:

“众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。”

 

转载于:https://www.cnblogs.com/wshiqtb/p/10697804.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么用计算机直接截图,电脑截图快捷键怎么使用,电脑怎么快捷键截图

我们对电脑快捷键都不陌生,有快捷键的帮助,我们可以加快电脑操作速度。那不知道大家对电脑截图快捷键有了解吗?下面小编就跟大家分享下电脑截图快捷键的几种使用方法。1. 首先使用电脑自带的截图。我们只需要使用快捷键【PrtScn】即可。在需要…

c语言数组指定位置插入和删除_Apache POI在指定位置插入表格

接到的需求是在模板表格的指定位置再插入表格。比如在模板的${proTable}处插入表格。依赖的包org.apache.poi poi 3.15org.apache.poi poi-ooxml 3.15插入表格由于是在表格里的指定地方插入表格,所以要遍历表格的每个单元格,查找到要插入点的占位符。// …

学习URLRewriter.dll的使用

1.添加引用 2.配置webconfig webconfig1<?xml version"1.0" encoding"utf-8"?> 2<configuration> 3 4 <configSections> 5 <section name"RewriterConfig" type"URLRewriter.Config.RewriterConfigSerializer…

高斯消元

高斯消元 高斯消元可真是复杂啊。。。。。 高斯消元求解n元一次线性方程组的板子题&#xff1a; P3389 【模板】高斯消元法 举个栗子&#xff1a; 2x y - z 8 -3x - y 2z -11-2x y 2z -3先将它存到矩阵中&#xff1a;②①* (2/3) ③① 接着对①变…

原子微型结构信息应用到局部图形信息存储的猜想

昨天想着看一些图形学方面的知识&#xff0c;在CSDN上看到说Gabor函数可以精确是被图形细微处。于是从网上找了下面这么一篇文章看看&#xff1a; 二、Gabor函数 Gabor变换属于加窗傅立叶变换&#xff0c;Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数…

西北大学计算机科学排名,西北大学计算机科学与信息系统Computer Science and Information Systems世界排名2020年最新排名第151-200位(QS世界排名)...

2020年QS计算机科学与信息系统Computer Science and Information Systems专业世界排名公布&#xff0c;西北大学计算机科学与信息系统世界排名第151-200位&#xff0c;西北大学计算机科学与信息系统专业实力怎么样呢&#xff1f;下面美英港新留学介绍西北大学计算机科学与信息系…

Hadoop 集群的三种方式

1,Local(Standalone) Mode 单机模式 $ mkdir input$ cp etc/hadoop/*.xml input$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar grep input output dfs[a-z.]$ cat output/* 解析$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-ex…

三阶矩阵的lu分解详细步骤_快速入门矩阵运算——开源库Eigen

矩阵是数学中一个重要的工具&#xff0c;广泛应用于各种场景下的数值分析&#xff0c;例如&#xff0c;数字信号处理&#xff0c;图像处理等。我们如何在程序中使用矩阵进行运算呢&#xff1f;本文将为大家介绍一个开源的矩阵运算工具——Eigen。Eigen is a C template library…

birt报表表格边框_Python 快速设置 Excel 表格边框

1. 安装 xlwings直接安装用 pip install xlwings2. 导入 xlwingsimport xlwings as xw3. 打开 Excel 文件# 打开存好的 Excelapp xw.App() # 设置应用wb xw.Book(data/小蜜蜂超市销售报表.xlsx) # 打开文件ws wb.sheets[Sheet1] # 选择表格4. 获取表格行列last_column ws.…

矢量合成和分解的法则_力的合成与分解

1力的合成一、合力与分力当一个物体受到几个力的共同作用时&#xff0c;我们常常可以求出这样一个力&#xff0c;这个力产生的效果跟原来几个力的共同效果相同&#xff0c;这个力就叫做那几个力的合力&#xff0c;原来的几个力叫做分力&#xff0e;二、合力与分力的关系1.合力与…

[导入]相片: 53787515.jpg

文章来源:http://img.blog.163.com/photo/5VZ9bIclg8NWuT90ExHHmQ/1697575584542151534.jpg转载于:https://www.cnblogs.com/baiyirui/archive/2008/04/27/1173122.html

超导量子计算机速度多快,我国量子计算机实现量子霸权,计算速度比谷歌快了100亿倍...

12月4日&#xff0c;中国科学技术大学宣布&#xff0c;我国新构建的76个光子的量子计算机实现了量子霸权。在5000万个样本的高斯玻色取样实验中&#xff0c;“九章”量子计算机仅用了200秒就完成了&#xff0c;如果使用世界第三的超级计算机进行实验&#xff0c;它也要将近20亿…

初一辍学学php能行吗_《夺冠》破7亿,辍学的农村姑娘成排球女王,朱婷:百炼才能成钢...

分享职场故事&#xff0c;交流职场经验&#xff0c;欢迎关注“闫湘”。《夺冠》累计票房7亿&#xff0c;让大家再一次领略了女排精神&#xff0c;而“2019-2020年中国运动员传播影响力榜第1名&#xff0c;朱婷&#xff01;”朱婷这个名字又一次响彻全中国。与今天的风光不同&am…

关于eclipse项目的x号报错的一些问题

有些时候项目中并未有什么问题 但项目前会有一个X号报错且无法运行项目 我们不妨从jre和Tomcat的一些配置中找原因 1&#xff0c;首先查看jre的安装是否正确&#xff0c;可以看见并未出错 &#xff0c;如果有问题&#xff0c;重新导入一下即可 2&#xff0c;打开项目的Java bui…

iWindowsMobile Launches Updated ZoomBoard

今天发现一个好东西&#xff0c;发上来和大家分享&#xff01;它来自iwindowsmobile.com(模拟iphone嫌疑)&#xff0c;因为在这里我发现了很多Windows Mobile用户梦寐以求的软件&#xff0c;我想应该叫这个站点为iheartwindowsmobile.com更为贴切&#xff0c;不管它叫什么&…

idea和搜狗输入法快捷键冲突_ubuntu18.04安装搜狗输入法

1. 必要时可获取root权限ubuntu在我们安装时并不是root权限,而是我们自己建立的用户,虽然可以使用sudo 命令,但是有时候还是不方便,毕竟root就是一切.输入 su即可切换root卸载ibusubuntu默认使用ibus管理输入法,官方推荐使用fcitx.我们先卸载ibussudo apt-getremove ibus清除ib…

同方专转本计算机视频,同方2011专转本计算机

同方2011专转本计算机 (3页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分namespace W_{ public partial class Form1 : Form { bool isDotpressed false; decimal dOpDaTa1, dOpDaTa2, dre…

wps流程图怎么不能添加文字_windows不能访问共享文件夹,不能添加共享打印机时,怎么解决呢...

遇到文件夹共享不能访问或者打印机共享添加不了的问题&#xff0c;可以按照下面的方法来操作了。适用于windows7windows8、windows10操作系统。在同一个局域网中&#xff0c;你通过192.168.1.1200或网上邻居不能访问对方主机共享文件夹时&#xff0c;按下面的方法操作&#xff…

cad中线段求和lisp_cad中连续线段变更圆滑弧形

下面我们就来看看如何在CAD中怎么把JPG图片插入页面中&#xff0c;并把图片中的图形做出线描的效果呢&#xff1f;这里我们用到CAD编辑工具来对此项功能以演示。方法/步骤首先我们要在电脑中安装CAD编辑工具来实现此操作。打开CAD软件。在菜单栏里找到插入命令&#xff0c;并在…

CF1142C U2(计算几何,凸包)

题目大意&#xff1a;平面上有 $n$ 个点&#xff0c;第 $i$ 个点是 $(x_i,y_i)$。问有多少条抛物线&#xff08;二次项系数为 $1$&#xff09;&#xff0c;经过这些点中不同的两个点&#xff0c;并且内部&#xff08;不含边界&#xff09;没有任何这些点。重合的抛物线只算一次…