从0搭建Vue3组件库(十):如何搭建一个 Cli 脚手架

news2024/11/29 10:38:38

本篇文章将实现一个名为create-easyest脚手架的开发,只需一个命令npm init easyest就可以将整个组件库开发框架拉到本地。

创建 Cli 包

首先,我们在 packages 目录下新建 cli 目录,同执行pnpm init进行初始化,然后将包名改为create-easyest

这里需要知道的是当我们执行npm init xxx或者npm create xxx的时候,实际上是执行npx create-xxx,所以当我们执行npm init easyest的时候实际上就是执行npx create-easyest

当我们执行create-easyest时会执行 package.json 下的 bin 对应的路径,因此我们将package.json修改为

{
  "name": "create-easyest",
  "version": "1.0.0",
  "description": "",
  "bin": "index.js",
  "keywords": [],
  "author": "",
  "license": "MIT"
}


同时新建 index.js 作为入口文件,注意开头要加上#! /usr/bin/env node

#! /usr/bin/env node

使用 command-line-args 处理用户输入命令

其实处理用户输入参数的插件有很多,比如 CAC,Yargs,Commander.js,command-line-args 等,但是就我看来 command-line-args 使用起来是最简单的,所以这里使用 command-line-args 进行用户参数解析

pnpm add command-line-args

新建一个 cli.js 用于处理我们脚手架的逻辑,这里简单写一个-v 版本命令

import commandLineArgs from "command-line-args";
import { readFile } from "fs/promises";

const pkg = JSON.parse(
  await readFile(new URL("./package.json", import.meta.url))
);
//配置命令参数
const optionDefinitions = [{ name: "version", alias: "v", type: Boolean }];
const options = commandLineArgs(optionDefinitions);
if (options.version) {
  console.log(`v${pkg.version}`);
}

在这里插入图片描述
我们还可以使用 command-line-usage 插件让它为我们提供帮助命令

pnpm add command-line-usage

这里只贴了相关代码

import commandLineArgs from "command-line-args"
import commandLineUsage from "command-line-usage"
...

//帮助命令
const helpSections = [
  {
    header: 'create-easyest',
    content: '一个快速生成组件库搭建环境的脚手架',
  },
  {
    header: 'Options',
    optionList: [
      {
        name: 'version',
        alias: 'v',
        typeLabel: '{underline boolean}',
        description: '版本号',
      },
      {
        name: 'help',
        alias: 'h',
        typeLabel: '{underline boolean}',
        description: '帮助',
      }
    ],
  },
];


if (options.help) {
  console.log(commandLineUsage(helpSections))
  return
}

在这里插入图片描述

交互式命令

当我们使用一些脚手架的时候,比如 create-vite,它会让我们一些选项让我们选择

在这里插入图片描述
所以我们的脚手架也要有这个功能,但是这个应该怎么实现呢?

其实很简单,我们只需要 prompts 插件即可,它可以配置用户输入哪些东西以及单选还是多选等,首先安装 prompts

pnpm add prompts

然后在 cli.js 中

import prompts from "prompts";
const promptsOptions = [
  {
    type: "text",
    name: "user",
    message: "用户",
  },
  {
    type: "password",
    name: "password",
    message: "密码",
  },
  {
    type: "select", //单选
    name: "gender",
    message: "性别",
    choices: [
      { title: "男", value: 0 },
      { title: "女", value: 1 },
    ],
  },
  {
    type: "multiselect", //多选
    name: "study",
    message: "选择学习框架",
    choices: [
      { title: "Vue", value: 0 },
      { title: "React", value: 1 },
      { title: "Angular", value: 2 },
    ],
  },
];

const getUserInfo = async () => {
  const res = await prompts(promptsOptions);
  console.log(res);
};
getUserInfo();

然后我们就可以根据对应的值处理不同的逻辑了,当然我们的脚手架不需要这么多参数,我们改成下面选项即可

const promptsOptions = [
  {
    type: "text",
    name: "project-name",
    message: "请输入项目名称",
  },
  {
    type: "select", //单选
    name: "template",
    message: "请选择一个模板",
    choices: [
      { title: "kitty-ui", value: 0 },
      { title: "easyest", value: 1 },
    ],
  },
];

然后我们就可以根据用户的选择来拉取不同的仓库了

拉取远程仓库模板

拉取远程仓库我们可以使用 download-git-repo 工具,然后使用它的 clone 方法即可,同时我们需要安装一个 loading 插件 ora 以及 log 颜色插件 chalk

pnpm add download-git-repo ora chalk
//gitClone.js

import download from "download-git-repo";
import chalk from "chalk";
import ora from "ora";

export default (remote, name, option) => {
  const downSpinner = ora("正在下载模板...").start();
  return new Promise((resolve, reject) => {
    download(remote, name, option, (err) => {
      if (err) {
        downSpinner.fail();
        console.log("err", chalk.red(err));
        reject(err);
        return;
      }
      downSpinner.succeed(chalk.green("模板下载成功!"));
      resolve();
    });
  });
};

//cli.js
const remoteList = {
  1: "https://gitee.com/geeksdidi/kittyui.git",
  2: "https://github.com/qddidi/easyest.git",
};
const getUserInfo = async () => {
  const res = await prompts(promptsOptions);
  if (!res.name || !res.template) return;
  gitClone(`direct:${remoteList[res.template]}`, res.name, {
    clone: true,
  });
};

然后执行完成后目录下就有我们的模板啦

在这里插入图片描述
最后将我们的create-easyest发布即可,发布这里前面已经介绍过,就不多赘述了。这里我已经发布过了,我们随便找个文件夹执行npm create easyest试一下,同时我们发现了easyest项目也被克隆了下来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

layui框架实战案例(21):layui上传的哪些事(layui.upload组件、 file文件域、php后台上传)

上传的哪些事 一、核心方法与基础参数选项二、使用upload组件1.调用layui.upload2.文件上传进度条3.弹出进度条4.完整核心代码5.效果预览6.后台上传代码7.附带参数data 一、核心方法与基础参数选项 upload.render({elem: #uploadlicense//指向容器选择器, url: ?mIndex&ai…

Python每日一练(20230429)

目录 1. 地下城游戏 🌟🌟🌟 2. 杨辉三角 II 🌟 3. 旋转数组 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

HCIA-RS实验-路由配置-静态路由缺省路由(2)

接上文HCIA-RS实验-路由配置-静态路由&缺省路由 继续完成缺省路由;其他原截图就不再一一截图,有需要往回看一篇。 关闭上一篇的接口shutdown(重新启动) 上一篇在R2关闭的接口2 需要重新启动,输入 undo shutdown…

React--》Redux Toolkit的使用讲解

目录 Redux Toolkit redux toolkit的基本使用 RTK代码模块化 RTK QUERY的使用 useQuery参数 Redux Toolkit Redux Toolkit是Redux的工具包,简称RTK,可以帮助我们处理使用Redux过程中的重复性工作,简化Redux中的各种操作,当然…

< 每日小技巧: 基于Vue状态的过渡动画 - Transition 和 TransitionGroup>

》基于Vue状态的过渡动画 - Transition 和 TransitionGroup &#x1f449; 一、Vue Transition 简介> Transition 和 TransitionGroup 之间的区别 &#x1f449; 二、<Transition> 组件> 触发 <Transition> 组件的场景&#xff1a;> 基于 CSS 的过渡效果&…

LeetCode:面试题 02.07. 链表相交

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[面试题 02.07. 链表相交](https://leetcode.cn/problems/in…

Python可视化学习——使用JSON进行数据转换、pyecharts模块调用以及可视化案例的介绍(可视化案例数据暂无),柱状图及动态柱状图的构建

数据可视化 可视化效果一&#xff1a;2020年印美日新冠累计确诊人数 2020年是新冠疫情爆发的一年&#xff0c;随着疫情的爆发&#xff0c;国内外确诊人数成了大家关心的热点&#xff0c;相信大家都有看过类似的疫情报告.本案例对印度美国日本三个国家确诊人数的进行了可视化处…

术数基础背诵口诀整理

物象对应 五行方位天干神兽季节气候星宿生成数脏器木东甲乙青龙春风岁八肝火南丙丁朱雀夏热荧惑七心土中戊己&#xff1f;长夏湿镇五脾金西庚辛白虎秋燥太白九肺水北壬癸玄武冬寒辰六肾 口诀&#xff1a;东方甲乙青龙木&#xff0c;南方丙丁朱雀火&#xff0c;戊己勾陈腾蛇土&…

第一章 Java基础 50 道面试题

文章目录 前言匿名内部类访问的局部变量为什么必须要用final修饰? Java基础1、jdk和jre有什么区别&#xff1f;2、final在Java中有什么作用&#xff1f;3、有常量类了为什么还要使用枚举类&#xff1f;4、为什么使用包装类&#xff1f;5、和equals的区别是什么&#xff1f;6、…

Mysql-最左前缀法则以及索引失效情况

最左前缀法则 如果索引了多列&#xff08;联合索引&#xff09;&#xff0c;要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列。如果跳跃某一列&#xff0c;索引将会部分失效(后面的字段索引失效)。 以 tb_user 表为例&#xff…

前端面试题(持续更新中)

【1】null和undefined的区别 同&#xff1a; 1.都是js的基本类型&#xff0c;保存在栈中&#xff0c;表示“无、没有”的意思。 2.if语句中的null和undefined都是false。 var a undefined var b null if (!a) {console.log(undefined is false); } if (!b) {console.log(null…

YOLOv7如何提高目标检测的速度和精度,基于模型结构、数据增强提高目标检测速度

目录 一、基于模型结构的方法1、多尺度训练和测试2、更细的特征图3、重新设计的损失函数 二、基于数据增强的方法1、随机缩放和裁剪2、随机旋转和翻转3、随机亮度和对比度调整4、随机噪声和模糊处理 三、实验结果与分析1、数据集和实验设置2、实验结果的分析和比较 大家好&…

【VM服务管家】VM4.0软件使用_1.1 环境配置类

目录 1.1.1 驱动配置&#xff1a;图像后台切换但前端界面不变的解决方法1.1.2 驱动缺失&#xff1a;格式化工具打开后消失的解决方法1.1.3 环境配置&#xff1a;VM试用版本激活报错的解决方法1.1.4 模块数限制&#xff1a;修改VM最大模块数量1.1.5 开机自启动&#xff1a;VM运行…

【VM服务管家】VM4.0平台SDK_2.3 控件嵌入类

目录 2.3.1 渲染结果&#xff1a;通过绑定流程或模块获取渲染结果的方法2.3.2 渲染控件&#xff1a;渲染控件加载本地图像的方法2.3.3 渲染控件&#xff1a;渲染控件上自定义图形的方法2.3.4 参数控件&#xff1a;参数配置控件绑定模块的方法2.3.5 控件颜色&#xff1a;控件颜色…

【AGC】质量服务数据分析问题

【关键字】 AGC、质量、数据分析 【问题描述】 开发者反馈在应用中集成了AGC的相关服务&#xff0c;在查看平台数据时遇到了一些问题。具体如下所述&#xff1a; 我发现平台的App卸载量每个月都非常高&#xff0c;卸载量/新下载量近80%&#xff0c;很异常&#xff0c;所以想…

【VM服务管家】VM4.x算子SDK开发_3.2 公用工具类

目录 3.2.1 图像载入&#xff1a;本地图像的载入方法3.2.2 相机取流&#xff1a;相机SDK取流的方法3.2.3 输入图像&#xff1a;给算子模块输入图像数据的方法3.2.4 实时取流&#xff1a;实时取流的实现方法3.2.5 卡尺ROI&#xff1a;卡尺型ROI的生成方法3.2.6 DL算子耗时&#…

【VM服务管家】VM4.2软件使用_5.3 环境配置类

目录 1.1.1 用户权限&#xff1a;普通用户权限使用VM的方法1.1.2 脚本环境&#xff1a;联合OpenCV开发的环境配置方法1.1.3 环境配置&#xff1a;规避流程运行时卡死的方法 1.1.1 用户权限&#xff1a;普通用户权限使用VM的方法 描述 环境&#xff1a;VM4.2 现象&#xff1a;生…

JPA实战

常见 ORM 框架 **Mybatis(ibatis)&#xff1a;**一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 …

【深圳】IBM V3500存储维修 更换控制器故障

冠峰科技-爱科技爱分享 今天给大家分享的是深圳.福田区一个电商客户公司一台IBM Storwize v3500存储控制器故障从远程诊断 收集日志 分析结果的实际案例&#xff0c;如图所示通过存储管理口登陆进去后直接看到少了一个控制器&#xff0c; 按照惯例&#xff0c;还是得登陆到服…

linux智能网关4G离散数据采集分析HDMI广告牌

数字城市的4G边缘计算网关是一种具有强大处理能力、智能控制和现场数据采集能力的计算设备。其主要特点包括以下方面&#xff1a; 系统平台&#xff1a;基于Linux或Debian系统&#xff0c;可灵活开发各种应用程序。IO接口&#xff1a;2DI、2DO数字输入输出接口&#xff0c;可以…