这是系列文章 [前端脚手架实现]]() 的第二篇,本文将介绍脚手架中`Yue-cli create xxx`命令来初始化项目时内部的处理过程和实现方案。

安装axios模块,该模块用来发送网络请求获取模板和对应的版本列表,该模板用来初始化 Vue 项目。

npm install axios

安装ora模块,该模块的主要作用是在终端中显示提示消息。

npm install ora

安装inquirer询问者模块,该模块展示根据拉取的模板和版本号列表,并让用户选择。

npm install inquirer

先修改 main.js 文件中action中的实现方式,这样的话当执行Yue-cli create xx指令的时候会加载并执行对应文件中的代码。

/* 列出 main.js 文件对命令执行的映射处理 */
const program = require("commander") /* 组织映射结构 */
const actions = {
create: { // 项目创建(初始化)指令
description: 'create project with Yue-cli',
alias: 'c',
examples: [
'Yue-cli create <project-name>',
],
},
config: { // 设置项目配置文件指令
description: 'config info',
alias: 'conf',
examples: [
'Yue-cli config get <k>',
'Yue-cli config set <k> <v>',
],
},
'*': {
description: 'command not found',
alias: '',
examples: [],
},
}; Object.keys(actions).forEach((action) => {
program
/* 命名的名称 */
.command(action)
/* 命名的别名 */
.alias(actions[action].alias)
/* 命令的描述信息 */
.description(actions[action].description)
/* 命令的任务(功能) */
.action(() => { // 动作
console.log(`执行 action->`, action);
console.log(process.argv); /* 示例:Yue-cli create xxx */
/* 命令的参数分布如下
[ '/usr/local/bin/node',
'/usr/local/bin/Yue-cli',
'create',
'xxx'
] */
require(path.resolve(__dirname, action))(...process.argv.slice(3));
});
});

在项目的src目录中新创建 create.js 文件,这样当执行Yue-cli create xxx指令的时候会自动加载并执行create.js文件中的代码,当执行config xxx指令的时候会自动加载并执行config.js文件中的代码。这里主要讨论当执行create指令的时候,命令行工具的内部应该处理哪些任务,下面列出代码的主要处理过程。

/* 列出 create.js 文件中的主要代码 */

/* 1.导入模块 */
const axios = require('axios');
const ora = require('ora');
const fs = require('fs');
const inquirer = require('inquirer'); /* 2.封装函数获取存放模板信息的数据 */
async function getRepositoryList() {
const { data } = await axios.get("https://api.github.com/orgs/Yong-template/repos");
return data;
} /* 3.封装函数获取对比仓库模板文件的版本列表 */
const getTagList = async(repo) => {
const {data} =await axios.get(`https://api.github.com/repos/Yong-template/${repo}/tags`);
return data;
}; /* 4.封装函数显示提示信息... */
const loading = (fn, message) => async(...args) => {
const spinner = ora(message);
spinner.start();
const result = await fn(...args);
spinner.succeed();
return result;
}; module.exports = async(projectName) => { /* 处理模板信息 */
let repoList = await loading(getRepositoryList, "fetching template ...")(); /* 选择模板 */
const { repo } = await inquirer.prompt({
name: "repo",
type: "list",
message: "please choice a template to create project !",
choices: repoList.map(item => item.name)
}) /* 处理版本信息 */
let tagList = await loading(getTagList, "fetching tags ...")(repo); /* 选择对应的版本 */
const { tag } = await inquirer.prompt({
name: 'tag',
type: 'list',
message: 'please choices tags to create project',
choices: tagList.map(item => item.name),
}); /* 打印选定的模板和版本信息 */
console.log("repo->",repo,"tag->",tag);
};

列出简单列出脚手架指令Yue-cli create app 的执行情况。

wendingding$ Yue-cli create app
执行 action-> create
[ '/usr/local/bin/node',
'/usr/local/bin/Yue-cli',
'create',
'app' ]
fetching template ...
? please choice a template to create project ! vue-simple-template
fetching tags ...
? please choices tags to create project (Use arrow keys)
❯ v2.0.0

前端开发系列133-进阶篇之脚手架Yue-cli的实现02-inquirer模块的更多相关文章

  1. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  2. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  3. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  4. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  5. 【webpack 系列】进阶篇

    本文将继续引入更多的 webpack 配置,建议先阅读[webpack 系列]基础篇的内容.如果发现文中有任何错误,请在评论区指正.本文所有代码都可在 github 找到. 打包多页应用 之前我们配置 ...

  6. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  7. 旨在脱离后端环境的前端开发套件 - IDT Server篇

    IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...

  8. 前端开发【第2篇:CSS】

    鸡血 样式的属性多达几千个,但别担心,按照80-20原则,常用的也就几十个,你完全可以掌握它. Css初识 HTML的诞生 早期只有HTML的时候为了让HTML更美观一点,当时页面的开发者会把颜色写到 ...

  9. [置顶]【实用 .NET Core开发系列】- 导航篇

    前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...

  10. openlayers4 入门开发系列之风场图篇

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

随机推荐

  1. 🎀idea import配置

    简介 本文记录idea中import相关配置:自动导入依赖.自动删除无用依赖.避免自动导入*包 自动导入依赖 在编辑代码时,当只有一个具有匹配名称的可导入声明时,会自动添加导入 File -> ...

  2. python爬虫,beatifulsop获取标签属性值(取值)案例

    前面的案例里,均采用正则匹配的方式取值 title = re.findall('">(.*?)</a>', i, re.S)[0]#标题 url = re.findall( ...

  3. 从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)

    从 MySQL 获取数据,是从磁盘读取的吗?(Buffer Pool) 在 MySQL 中,数据是否从磁盘读取取决于数据是否已经被加载到内存中.MySQL 使用 InnoDB 存储引擎 中的 Buff ...

  4. 如何在 MySQL 中避免单点故障?

    如何在 MySQL 中避免单点故障? 在 MySQL 中避免单点故障(SPOF, Single Point of Failure)是确保数据库高可用性和系统稳定性的关键.通过采取以下几种策略,可以最大 ...

  5. MySQL 的乐观锁和悲观锁是什么?

    MySQL 的乐观锁和悲观锁是什么? 在并发环境下,为了避免数据竞争和保证数据一致性,可以使用不同的锁策略.乐观锁和悲观锁是两种常见的并发控制机制,它们在锁定数据时的理念和实现方式上有显著区别. 1. ...

  6. Asp.net core 少走弯路系列教程(五)HTTP 协议学习

    前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...

  7. 异步IO与Tortoise-ORM的数据库

    title: 异步IO与Tortoise-ORM的数据库 date: 2025/04/29 13:21:47 updated: 2025/04/29 13:21:47 author: cmdragon ...

  8. 【SQL周周练】:利用行车轨迹分析犯罪分子作案地点

    大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 7 篇,也是[SQL 周周练]系列的第 6 篇.该系列是挑选或 ...

  9. 单服务器高性能模式:Reactor 与Proactor

    极客时间:<从 0 开始学架构>:单服务器高性能模式:Reactor 与Proactor 1.引言 单服务器高性能的 PPC 和 TPC 模式,它们的优点是实现简单,缺点是都无法支撑高并发 ...

  10. 实战:Dify智能体+Java=自动化运营工具!

    我们在运营某个圈子的时候,可能每天都要将这个圈子的"热门新闻"发送到朋友圈或聊天群里,但依靠传统的实现手段非常耗时耗力,我们通常要先收集热门新闻,再组装要新闻内容,再根据内容设计海 ...