Usage: vue-init <template-name> [project-name]
Options:
-c, --clone use git clone
--offline use cached template
-h, --help output usage information
Examples:
# create a new project with an official template
$ vue init webpack my-project
# create a new project straight from a github template
$ vue init username/repo my-project
背景
在平时工作中会有遇到许多以相同模板定制的小程序,因此想自己建立一个生成模板的脚手架工具,以模板为基础构建对应的小程序,而平时的小程序都是用mpvue框架来写的,因此首先先参考一下Vue-cli的原理。知道原理之后,再定制自己的模板脚手架肯定是事半功倍的。
在说代码之前我们首先回顾一下Vue-cli的使用,我们通常使用的是webpack模板包,输入的是以下代码。
在执行这段代码之后,系统会自动下载模板包,随后会询问我们一些问题,比如模板名称,作者,是否需要使用eslint,使用npm或者yarn进行构建等等,当所有问题我们回答之后,就开始生成脚手架项目。
我们将源码下载下来,源码仓库点击这里,平时用的脚手架还是2.0版本,要注意,默认的分支是在dev上,dev上是3.0版本。
我们首先看一下package.json,在文件当中有这么一段话
由此可见,我们使用的命令
vue init
,应该是来自bin/vue-init
这个文件,我们接下来看一下这个文件中的内容bin/vue-init
download-git-repo 一个用于下载git仓库的项目的模块 commander 可以将文字输出到终端当中 fs 是node的文件读写的模块 path 模块提供了一些工具函数,用于处理文件与目录的路径 ora 这个模块用于在终端里有显示载入动画 user-home 获取用户主目录的路径 tildify 将绝对路径转换为波形路径 比如
/Users/sindresorhus/dev → ~/dev
inquirer 是一个命令行的回答的模块,你可以自己设定终端的问题,然后对这些回答给出相应的处理 rimraf 是一个可以使用 UNIX 命令rm -rf
的模块 剩下的本地路径的模块其实都是一些工具类,等用到的时候我们再来讲这部分代码声明了
vue init
用法,如果在终端当中 输入vue init --help
或者跟在vue init
后面的参数长度小于1,也会输出下面的描述接下来是一些变量的获取
接下来主要是根据模板名称,来下载并生产模板,如果是本地的模板路径,就直接生成。
我们来看下
downloadAndGenerate
这个方法到这里为止,
bin/vue-init
就讲完了,该文件做的最主要的一件事情,就是根据模板名称,来下载生成模板,但是具体下载和生成的模板的方法并不在里面。下载模板
下载模板用的download方法是属于download-git-repo模块的。
最基础的用法为如下用法,这里的参数很好理解,第一个参数为仓库地址,第二个为输出地址,第三个是否需要
git clone
,带四个为回调参数在上面的
run
方法中有提到一个#
的字符串实际就是这个模块下载分支模块的用法生成模板
模板生成
generate
方法在generate.js
当中,我们继续来看一下generate.js
chalk 是一个可以让终端输出内容变色的模块 Metalsmith是一个静态网站(博客,项目)的生成库 handlerbars 是一个模板编译器,通过
template
和json
,输出一个html async 异步处理模块,有点类似让方法变成一个线程 consolidate 模板引擎整合库 multimatch 一个字符串数组匹配的库 options 是一个自己定义的配置项文件随后注册了2个渲染器,类似于vue中的 vif velse的条件渲染
接下来看关键的
generate
方法meta.js
接下来看以下complete方法
构建自定义模板
在看完
vue-init
命令的原理之后,其实定制自定义的模板是很简单的事情,我们只要做2件事meta.js
当中定制由于下载模块使用的是
download-git-repo
模块,它本身是支持在github,gitlab,bitucket上下载的,到时候我们只需要将定制好的模板项目放到git远程仓库上即可。由于我需要定义的是小程序的开发模板,mpvue本身也有一个quickstart的模板,那么我们就在它的基础上进行定制,首先我们将它fork下来,新建一个custom分支,在这个分支上进行定制。
我们需要定制的地方有用到的依赖库,需要额外用到less以及wxparse 因此我们在
template/package.json
当中进行添加除此之外,我们还需要定制一下eslint规则,由于只用到standard,因此我们在
meta.js
当中 可以将 airbnb风格的提问删除.eslinttrc.js
最后我们在构建时的提问当中,再设置一个小程序名称的提问,而这个名称会设置到导航的标题当中。 提问是在
meta.js
当中添加main.json
最后我们来尝试一下我们自己的模板
总结
以上模板的定制是十分简单的,在实际项目上肯定更为复杂,但是按照这个思路应该都是可行的。比如说将一些自行封装的组件也放置到项目当中等等,这里就不再细说。原理解析都是基于vue-cli 2.0的,但实际上 3.0也已经整装待发,如果后续有机会,深入了解之后,再和大家分享,谢谢大家。
参考文章
广而告之
本文发布于薄荷前端周刊,欢迎Watch & Star ★,转载请注明出处。
欢迎讨论,点个赞再走吧 。◕‿◕。 ~