前言
Mpx是一款致力于提高小程序开发体验的增强型小程序框架,通过Mpx,我们能够以最先进的web开发体验(Vue +
Webpack)来开发生产性能深度优化的小程序。
下面说说mpx脚手架的源码:
源码地址:https://github.com/didi/mpx/tree/master/packages/cli
目录结构:
.
├── README.md
├── bin
│ ├── mpx-init.js // init命令开始执行的内容
│ └── mpx.js // 命令入口文件
├── lib
│ ├── ask.js // 自定义工具-用于询问开发者
│ ├── check-version.js // 检查本地node和npm包版本
│ ├── eval.js // 在data的作用域执行exp表达式并返回其执行得到的值
│ ├── filter.js // 配合metalsmith删除过滤多余的文件
│ ├── generate.js // 模板下载后根据用户选择生成指定模板
│ ├── git-user.js // 用于获取本地的git配置的用户名和邮件,并返回格式 姓名<邮箱> 的字符串
│ ├── local-path.js // 判断本地文件是否存在
│ ├── logger.js // 记录日志
│ └── options.js // 获取模板的选项配置信息并初始化默认值
├── package-lock.json
└── package.json
文件分析
package.json
{
"name": "@mpxjs/cli",
"version": "2.1.0",
"description": "mpx脚手架",
"bin": {
"mpx": "bin/mpx.js",
"mpx-init": "bin/mpx-init.js"
},
"dependencies": {
"async": "^2.4.0",
"chalk": "^2.1.0",
"commander": "^2.9.0",
"download-git-repo": "^1.0.1",
"inquirer": "6.3.1",
"metalsmith": "^2.1.0",
"minimatch": "^3.0.0",
"multimatch": "^2.1.0",
"nunjucks": "^3.1.2",
"ora": "^1.3.0",
"read-metadata": "^1.0.0",
"request": "^2.67.0",
"rimraf": "^2.5.0",
"semver": "^5.1.0",
"tildify": "^1.2.0",
"update-notifier": "^2.5.0",
"user-home": "^2.0.0",
"validate-npm-package-name": "^3.0.0"
},
"keywords": [
"mpx",
"cli"
],
"author": "donghongping",
"license": "Apache",
"main": "bin/mpx-init.js",
"directories": {
"bin": "bin",
"lib": "lib"
},
"files": [
"bin",
"lib"
],
"publishConfig": {
"registry": "https://registry.npmjs.org"
},
"repository": {
"type": "git",
"url": "git@github.com:didi/mpx.git"
},
"homepage": "https://didi.github.io/mpx/",
"bugs": {
"url": "https://github.com/didi/mpx/issues"
},
"engines": {
"node": ">=8.0.0"
},
"scripts": {
"test": "echo \"Error: run tests from root\" && exit 1"
}
}
安装依赖包
- async:异步处理工具
- chalk :用于高亮终端打印出来的信息
- commander: 命令行处理工具
- download-git-repo: 用于下载远程仓库至本地 支持GitHub、GitLab、Bitbucket
- inquirer:用于命令行与开发者交互
- metalsmith:静态网站生成器
- minimatch:字符匹配工具
- multimatch:可以支持多个条件的匹配
- nunjucks:js模板引擎
- ora:用于命令行上的加载效果
- read-metadata:用于读取json或者yaml元数据文件并返回一个对象
- request :发送http请求的工具
- rimraf:相当于UNIX的“rm -rf”命令
- semver:版本号处理工具
- tildify:将绝对路径转换成带波浪符的路径
- update-notifier:更新node和npm包
- user-home: 用于获取用户的根目录
- validate-npm-package-name:用于npm包的名字是否是合法的
入口文件
mpx.js
#!/usr/bin/env node
require('commander')
.version(require('../package').version)
.usage('<command> [options]')
.command('init', 'generate a new project from a template')
.parse(process.argv)
主要是根据init命令执行max-init.js文件内容;
mpx-init.js
引入依赖包:忽略
指令引导提示:
// 指令引导
program
.usage('[project-name]')
.option('-c, --clone', 'use git clone')
.option('--offline [value]&