写一个自己的vue-cli脚手架

4,558 阅读3分钟

通过vue-cli我们可以快速的,无配置的创建我们的项目,vue-cli为我们写好了webpack配置,在创建项目时又可以根据命令行交互集成vue-router,post-css,less或者sass,babel,eslint等等,还有非常友好的图形化界面帮助我们完成自己的项目配置。

但是我们的项目总有需要定制化的配置,比如,我们需要引入我们想要的UI框架,比如,我们想要引入axios完成http请求等;平时项目开发中,往往与后台的http交互都是约定好的,项目配置只需写一次就好,但是通过vue-cli一键生成项目之后,相关的配置我们还得再写一次,比较麻烦,所以我们可以完成一个个性化配置好的脚手架,平时创建项目时通过该脚手架一键生成,并同时完成所有需要的配置,以快速开发。

该脚手架完成的前提是将自己配置好的模板项目上传到github仓库,以自己配置好的vue项目为模板,创建新的项目;

1,脚手架的工作原理

(1)通过命令行交互询问用户问题;

(2)根据用户回答的结果生成文件;

2,创建cli准备工作

(1)新建cli文件夹,通过npm init 生成package.json文件,并删除不必要的scripts字段;

(2)在项目根目录下创建bin.js文件,在package.json文件中增加一个bin字段并指向bin.js,用于指定模块的入口文件:

"bin": "bin.js",

(3)需要特别注意的一点是:我们要在bin.js文件头部需要添加#!/usr/bin/env node,用于指定该文件需要使用node来运行,让系统动态的去查找node,以解决不同机器不同用户设置不一致问题;

(4)在终端中通过npm link将我们的包映射到全局,这样就可以通过运行模块名来运行我们的模块,以方便我们在本地测试。

至此装备工作已完成,现在就可以在bin.js文件中写我们模块的逻辑啦。

3,创建cli所需要的依赖模块

commander实现控制台命令行问题交互;

chalk为控制台输出的文字着色;

download-git-repo拉去github项目代码;

ora实现控制台进度条样式;

4,实现脚手架代码

1,引入所需依赖

#!/usr/bin/env node

const program = require('commander');//cmd控制台交互
const ora = require('ora');//进度条
const chalk = require('chalk');//给提示文案着色
const download = require('download-git-repo');//拉取github项目
const fs = require('fs');

2,配置错误文案和成功文案的样式

// 提示样式
const success = chalk.blueBright;
const error = chalk.bold.red;

3,设置github模板项目的地址链接

const templateUrl = 'direct:https://github.com/chang229/vue.git';//github项目地址

4,创建命令

program.version('0.1.0')
  .option('-i, init [name]', '初始化项目')
  .parse(process.argv);

通过运行init命令快速创建项目,通过pargram.init可以拿到init之后的项目名称; 5,运行init命令之后开始拉去代码

// 拉取项目代码
if (program.init && typeof program.init === "string") {
    const spinner = ora('正在拉取模板...').start();//开启进度条
    download(templateUrl, program.init, { clone: true }, function (err) {
        if (!err) {
            spinner.succeed(success('拉取成功'));
            // 更改 package.json 中的 name 和版本号
            changePackage()
        } else {
            console.log(err);
            spinner.fail('拉取失败');
        }
    });
} else {
    console.error(error('请在init后输入目录名'));
}

6,替换模板文件中package.json文件中的name字段

// 替换模板package.json文件的name字段
const changePackage = () => {
    fs.readFile(`${process.cwd()}/${program.init}/package.json`, (err, data) => {
        if (err) throw err;
        let _data = JSON.parse(data.toString());
        _data.name = program.init;
        _data.version = '1.0.0';
        let str = JSON.stringify(_data, null, 4);
        fs.writeFile(`${process.cwd()}/${program.init}/package.json`, str, function (err) {
            if (err) throw err;
        })
    });
};

5,完成

等控制台进度完成之后,就可以cd进入创建好的项目,执行npm install安装所有依赖,然后就可以开心的开发项目啦.