什么事脚手架

随着前端的快速发展,现在前端开发越来越工程化,高效,稳定,可维护成为开发者更加关注的重点,脚手架在这期间应运而生。这个概念特别贴切,简单来说“前端脚手架”就是通过简单的几个选项快速搭建出项目的基本结构代码,这里面以命令行方式为主要方式。 当然脚手架不只是前端才有,大量的Nodejs工程也有许多优秀的脚手架。

背景

当我们准备开发一个新项目的时候,开始的第一步就是要搭建好项目的基本结构代码, 以Vue项目为例,用的最多的命令应该就是它的官方脚手架:

Vue Create xx

官方的脚手架只为你搭建了最基础的代码结构,创建好之后,你可能需要自己添加更多,例如更多的依赖包,prettier,eslintrc,.env, 或者一些常用的目录结构,api,store,router 等等,那么下一个项目开始又要重做一遍上面的事情,获者从第一个项目中复制, 那么这时我们就可以通过自制脚手架把这些重复的工作一次性解决。

关键步骤

1、首选我们要有一个适合你们团队的标准的项目项目模版

package.json中项目名称修改成{{name}}, 后面脚手架创建项目时可以动态修改

......
"name": "{{name}}",
......
2、一个Github账号或者Gitee账号,将你的项目上传上去,设置成public

操作略

3、创建脚手架项目

创建一个空文件夹 x-cli 这是一个Nodejs项目, 进入目录,通过npm init 初始化项目,产生一个package.json配置文件

npm init

package.json

{
  "name": "x-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

在package.json中添加脚手架命令

......
"bin": {
    "x-cli": "index.js"
  },
......

在package.json中添加项目依赖,并安装(npm install)

......
"dependencies": {
    // 控制台会有彩色的字体
    "chalk": "^3.0.0",
    // 命令行辅助
    "commander": "^4.1.1",
    // 下载github项目
    "download-git-repo": "^3.0.2",
    // 模版工具
    "handlebars": "^4.7.3",
    // 命令行交互
    "inquirer": "^7.0.4",
    // 日志内的符号
    "log-symbols": "^3.0.0",
    // 命令行中加载状态标识
    "ora": "^4.0.3",
  },
  ......

编写核心代码index.js, 基本逻辑:

  • 通过commander创建一个create命令
  • 输入项目名称,
  • 选择模版(如果只有一个模版可以跳过此步骤),下载模版,
  • 修改项目(package.json)名称
const program = require('commander'); //设计命令行
const download = require('download-git-repo'); //github仓库下载
const inquirer = require('inquirer'); //命令行答询
const handlebars = require('handlebars'); //修改字符
const ora = require('ora'); //命令行中加载状态标识
const chalk = require('chalk'); //命令行输出字符颜色
const logSymbols = require('log-symbols'); //命令行输出符号

const fs = require('fs');
const package = require('./package.json');

const version = `x-cli cli v${package.version}`;

const templates = {
  'v3e': {
    downloadUrl: 'github:username/v3e#main'
  },
  'v3a': {
    downloadUrl: 'github:username/v3a#main'
  }
};

// create <project>
program
  .command('create <project>')
  .description('创建项目')
  .action((projectName) => {
    //命令行答询
    console.clear();
    console.log(chalk.blue(version));
    console.log('');

    inquirer.prompt([{
        type: 'input',
        name: 'name',
        message: '请输入项目名称',
        default: projectName
      }, {
        type: 'list',
        name: 'templateName',
        message: '请选择项目模版',
        choices: [
          `v3e (${chalk.yellow('Vue3 Element-Plus Admin')})`,
          `v3a (${chalk.yellow('Vue3 Antd Admin')})`
        ],
        filter: function (val) {
          return val.substr(0, 3);
        }
      }
    ]).then(answers => {

      let downloadUrl = templates[answers.templateName].downloadUrl;
      //下载github项目,下载墙loading提示
      console.log('');
      const spinner = ora('正在下载模板...').start();

      //第一个参数是github仓库地址,第二个参数是创建的项目目录名,第三个参数是clone
      download(downloadUrl, projectName, { clone: true }, err => {
        if (err) {
          console.log(logSymbols.error, chalk.red(err));
        } else {
          spinner.succeed('项目模板下载成功');
          console.log('');
          //根据命令行答询结果修改package.json文件
          let packageContent = fs.readFileSync(`${projectName}/package.json`, 'utf8');
          let packageResult = handlebars.compile(packageContent)(answers);
          fs.writeFileSync(`${projectName}/package.json`, packageResult);

          console.log(' ', chalk.gray('$'), chalk.yellow(`cd ${projectName}`));
          console.log(' ', chalk.gray('$'), chalk.magentaBright('git init'));
          console.log(' ', chalk.gray('$'), chalk.cyan('yarn'));
          console.log(' ', chalk.gray('$'), chalk.green('yarn serve'));
          console.log('');
        }
      })
    })
  });
4、发布到NPM

首先,在npm (npmjs.com)创建一个账号,然后在本地通过npm login登录, 这里需要注意你的npm源不能用第三方源,否则会登录403错误

npm login


//登录成功后执行发布
npm publish

这里还有一点注意,你要发布的项目要在npm官网查一下是否有重复,如果重复是发布不成功,此时你要修改一下你的项目名称和bin名称(xtt-cli)

// package.json
......
 "name": "xtt-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "bin": {
    "xtt-cli": "index.js"
  },
 ......
6、安装使用

发布之后就可以在nodejs环境下安装使用了

// 全局安装
npm install  xtt-cli -g
// 创建测试项目
xtt-cli create test

总结

本项目仅对脚手架的核心开发做简单的介绍,在此基础上可以丰富更多的功能,比如项目构建好之后,直接初始化git,直接安装依赖包,当然准备好一个最合适的项目模版才是最重要的。