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插入表格由于是在表格里的指定地方插入表格,所以要遍历表格的每个单元格,查找到要插入点的占位符。// …

[jQuery] jQuery与jQuery UI有啥区别?

[jQuery] jQuery与jQuery UI有啥区别? 1)jQuery是一个js库,主要提供的功能是选择器、属性修改和事件绑定等 2)jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。提供了一些常用的界面元素&a…

学习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) ③① 接着对①变…

uoni扫地机器人好用吗_扫地机器人好用吗?了解性能看这篇

扫地机器人这类智能家电已经逐渐渗透到大众家庭中,尽管大家对这一品类不再陌生,但对它的性能了解并不全面。况且,市场上扫地机器人产品多不胜数,可实际使用效果和宣称效果存在较大差异。因此建议大家在选购和使用产品时要关注以下几个方面:本文引用地址&#xff1a;http://www.…

[jQuery] jQuery和Zepto的区别?各自的使用场景?

[jQuery] jQuery和Zepto的区别&#xff1f;各自的使用场景&#xff1f; 创建$的方式不同。前者略微要大&#xff0c;后者略微小点。场景....emmmm个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目…

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

昨天想着看一些图形学方面的知识&#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…

apache phoenix 入门_实现Phoenix入门

快速入门Phoenix是一个开源的HBASE SQL层。Phoeinx可以用标准的JDBC API替代HBASE client API来创建表&#xff0c;插入和查询查询HBASE中的数据。Phoenix作为应用层和HBASE之间的中间件,以下特性使它在大数据量的简单查询场景有着独有的优势1. 二级索引支持(global index loc…

腾讯与微软合作,准备应用Silverlight技术

腾讯和微软计划在Silverlight技术上展开深入合作&#xff0c;腾讯后续会在多项业务中应用Silverlight技术&#xff0c;这个视频展示了腾讯使用Silverlight可能应用的场景。查看详情:http://labs.qq.com/e/51/ 转载于:https://www.cnblogs.com/nasa/archive/2008/04/22/1165464.…

如何增强台式计算机无线网络,台式机无线网信号差怎么解决

台式机无线网信号非常的差&#xff0c;玩什么都卡&#xff0c;那么我要怎么样解决呢?下面由小编给你做出详细的台式机无线网信号差解决方法介绍!希望对你有帮助!台式机无线网信号差解决方法一&#xff1a;在确保无线网卡的驱动程序都正确安装的前提下&#xff0c;给出如下建议…

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

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

【转】接口 与 抽象类

本文转自&#xff1a;http://blog.***/article.asp?id89介绍&#xff1a;在本文中&#xff0c;我将借一个DEMO讨论下接口和抽象类。抽象类和接口的的概念对初学面向对象编程的人来说&#xff0c;总容易迷惑。所以&#xff0c;我试着讨论下两者的理论并比较他们的使用。最后我将…

第十三届东北师范大学程序设计竞赛热身赛 C(exgcd+欧拉函数)

题目链接 思路 对于答案&#xff0c;我们考虑对于每个可行的$c$会和多少$d$产生合法序偶。首先证明$c$和$b$必然互质。 假设$c$和$b$不互质&#xff0c;那么设$t_{1}gcd(c, b),(t_{1} > 1)$对于 $(c*d)\%ba$ 等价于 $(k_{1}*t_{1})\%ba,(k_1\in Z)$ $(k_{1}*t_{1})\%(k_{2}*…

[jQuery] Zepto的点透问题如何解决?

[jQuery] Zepto的点透问题如何解决&#xff1f; 1、“点透”是什么你可能碰到过在列表页面上创建一个弹出层&#xff0c;弹出层有个关闭的按钮&#xff0c;你点了这个按钮关闭弹出层后后&#xff0c;这个按钮正下方的内容也会执行点击事件&#xff08;或打开链接&#xff09;。…

确认要从桌面删除计算机,确定要从界面上删除 我的电脑 ...

桌面所有图标消失应该是系统外壳程序explorer.exe没有正常启动或被关闭造成的,可以在任务管理器(CTRLALTDEL)中手动运行explorer.exe找回桌面.造成该问题的主要原因有:1.恶意程序/病毒破坏你可以重启系统并按F8进入安全模式,选择专业的杀毒软件对系统分区进行全面扫描,如果是恶…

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.…

[jQuery] jQuery UI怎样自定义组件?

[jQuery] jQuery UI怎样自定义组件&#xff1f; 又是第一次&#xff0c;现在的感受是jQueryUI Widget能让你代码组织得更好,风格更一致。 如何开始使用首先用$.widget()方法开始定义你的组件&#xff0c;它只接收三个参数&#xff1a;第一个是组件名称&#xff0c;第二个是可选…