熟悉vue开发的同窗确定对vue-cli不陌生,Vue-cli是一款基于模板化的开发工具,等于就是把别人的项目结构给照搬过来,全部的配置都是暴露出来的,你能够根据实际状况去作一些配置的修改,更加灵活自由一点。前段时间也学习了下cli的源码,特此来记录下。javascript
在正式开始cli源码以前,先介绍下一些经常使用的npm包vue
javascript
语义模版库。能够利用 Handlebars.registerHelper
方法注册了一些 helper
,这样就能够在模板中方便的使用这些 helper
。metalsmith
链接起来使用便可。download-git-repo
是用于 从 GitHub
, GitLab
, Bitbucket
下载一个 git
仓库。consolidate
是一个模版引擎整合库。接下去将根据源码对每一步进行说明。java
咱们来看一下run函数webpack
downloadAndGenerate
方法。
downloadAndGenerate
会先判断本地是否存在模版,若是存在则删除,在调用download方法。
download
方法主要根据选项clone来判断是调用git仍是http方法去下载模版,下载成功后执行回调
generate
函数进行模版的渲染。
generate
函数仍是比较晦涩难懂的,接下来,咱们对这个方法分块来阅读。 首先来看
getOption
方法
getOption
中会先从模版的
template
文件夹中的
meta.json
或者
meta.js
来读取配置,以后对你输入的文件名进行验证,同时添加些默认的配置。其中
meta.json
和
meta.js
是动态加载模版的关键。
Handlebars.registerHelper
注册逻辑命令,从而处理一些数据,像webpack中就注册了if_eq来判断是否相等。
meta.js
中的before函数,webpack中的方法为
addTestAnswers
metalsmith.before
结果就是将
metalsmith metadata
数据和
isNotTest
合并,若是
isTest
为 ture,还会自动设置 name,description等字段。它的做用就是为模版添加自动测试脚本,它会将 isNotTest 设置为 false,而经过 inquirer 来提问又会是在 isNotTest 为 true 的状况下才会发生,所以设置了VUE_TEMPL_TEST的值会省略 inquirer 提问过程,而且会根据你设置的值来生成对应的模板,有如下三种值能够设置:
minimal
:这种不会设置 router,eslint 和 testsfull
: 会带有 router,eslint (standard) 和 tests (jest & e2e)full-airbnb-karma
:带有 router eslint(airbnb) 和 tests(karma) 具体的使用方式:VUE_TEMPL_TEST=full vue init webpack demo
复制代码
metalsmith.use
来使用
askQuestion
、
filterFiles
、
renderTemplateFiles
这三个插件。下面逐个来看这三个插件是干啥的。
askQuestion
调用了
ask
函数。
ask
函数就是经过
inquirer.prompt
来实现命令行交互,并将交互的值经过
metalsmith.metadata()
存到全局,而后在渲染模板的时候直接获取这些值。
filterFiles
则是经过用户的回答将一些须要过滤调的文件删除
renderTemplateFiles
的主要功能就是利用
consolidate.handlebars.render
将
~/.vue-templates
下面的
handlebars
模板文件渲染成正式的文件。
after
和
build
函数完成整个渲染流程。
至此,vue-init的整个流程及源码就结束了,其实总体流程仍是比较清晰的,经过对次源码的学习咱们在往后能够构建本身的脚手架和模版。毕竟懒惰是第一辈子产力!git