【前端脚手架开发】实战

113 阅读2分钟

理解脚手架

  1. 脚手架是什么?

答:脚手架只是一个工具,类似webpack、rollup等,只是为了实现或者解决某个、某些问题而出现

  1. 为什么会有脚手架,它的出现解决了什么痛点、难点?

答:提升效率、减少复制粘贴可能带来的一些问题、降低前端开发人员搭建项目框架的成本等

cli.png

脚手架核心逻辑的三个阶段

  1. 创建拉取代码的命令选项配置
  2. 定义问题,获取到答案后,修改package.json文件
  3. 下载代码到目标目录

第一阶段-主要核心包 commander 辅助包 path

import { program } from "commander";
import path from "path";
program.command("create <name>").description("创建项目存放的目录名称").action((name) => {
    const downloadPath = path.join(process.cwd(), name); // 得到目标目录路径
})

第二阶段-主要核心包 inquirer

import inquirer from "inquirer";
inquirer.prompt([
    {
      name: "author",
      message: "作者名字: ",
    },
    {
      name: "version",
      message: "版本号: ",
      default: "0.0.1",
    },
    {
      name: "description",
      message: "工程描述: ",
    }
]).then((res) => {
    const { author, version, description } = res; // 拿到用户输入或者默认值
})

第三阶段-主要核心包 download-git-repo 辅助包 path、fs-extra

import path from "path";
import fs from "fs-extra";
import download from "download-git-repo";
// downloadPath 在第一阶段获取  
download("direct:https://gitee.com/luocheng-fu/view-mobile.git", downloadPath, { clone: true }, (err) => {
  if (!err) {
    const packagePath = path.join(downloadPath, "package.json");
    const packageJson = JSON.parse(fs.readFileSync(packagePath).toString());
    fs.writeFileSync(
      packagePath,
      JSON.stringify(packageJson, (k, v) => {
          if (["author", "version", "description"].include(k)) {
              return 对应的用户输入或者默认值;
          }
          return true;
      }, "\t")
    );
    // 下载成功
  } else {
    // 下载失败
  }
});

完整代码

#! /usr/bin/env node

import path from "path";
import fs from "fs-extra";
import { program } from "commander";
import inquirer from "inquirer";
import download from "download-git-repo";

program.version("0.0.1", "-v, --version", "定义脚手架版本号");

program.command("create <name>").action((name) => {
  const downloadPath = path.join(process.cwd(), name);
  inquirer.prompt([
    {
      name: "author",
      message: "作者名字: ",
    },
    {
      name: "version",
      message: "版本号: ",
      default: "0.0.1",
    },
    {
      name: "description",
      message: "工程描述: ",
    }
]).then((res) => {
    const { author, version, description } = res;
    const mergeObj = {
      author,
      name,
      version,
      description,
    };
    download("direct:https://gitee.com/luocheng-fu/view-mobile.git", downloadPath, { clone: true }, (err) => {
      if (!err) {
        const packagePath = path.join(downloadPath, "package.json");
        const packageJson = JSON.parse(fs.readFileSync(packagePath).toString());
        fs.writeFileSync(
          packagePath,
          JSON.stringify(packageJson, (k, v) => mergeObj[k] || v, "\t")
        );
         // 下载成功
      } else {
        // 下载失败
      }
    });
  });
});

program.parse(process.argv);

主要核心包

  • commander 创建命令、选项等
  • inquirer 定义问题,让用户可以和终端一问一答的交互
  • download-git-repo 远程下载代码到目标目录

其他辅助包

  • path 获取路径
  • fs-extra 操作文件以及目录,写入、删除、读取功能
  • ora loading效果,下载模版时给出loading效果,提升用户体验
  • chalk 美化终端输出

以上就是个人理解整理出的脚手架开发流程,还有命令绑定等一些小功能这里未涉及,有兴趣的小伙伴可以npm官网搜索vrw-cli 试用下(目前仅支持webpack、react),也可以查看源码