创建自己的脚手架(二)

news2024/12/29 10:39:11

创建自己的脚手架(二)

接着之前的功能继续开发

脚手架创建组件功能

pnpm add ejs
修改index.js中的文件内容 增加addcpn功能

#!/usr/bin/env node
const { program } = require("commander");
const { addComponentAction, createProjectAction } = require("./core/actions");
const helpOptions = require("./core/help-options");

//1.配置所有的options
helpOptions();

//2.增加具体的一些功能
program
	.command("create <project> [...others]")
	.description("Create vue project into a folder 比如gucli create xxxx")
	.action(createProjectAction);

program
	.command("addcpn <cpnname> [...others]")
	.description("add vue component into a folder 比如gucli addcpn NavBar -d src/components")
	.action(addComponentAction);

//让commander解析process.argv参数
program.parse(process.argv);

//获取额外传递的参数
console.log(program.opts().dest);

具体实行方案写在addComponentAction函数内实现
修改actions.js文件

//promisify将普通函数转换为promise形式
const { promisify } = require("util");
const download = promisify(require("download-git-repo"));
const { VUE_REPO } = require("../config/repo");
const execCommand = require("../utils/exec-command");
const compileEjs = require("../utils/compile-ejs");
const writeFile = require("../utils/write-file");
const { program } = require("commander");

async function createProjectAction(project) {
	try {
		await download(VUE_REPO, project, { clone: true });

		//很多的脚手架 都是在这里提示
		//帮助执行npm install
		const commandName = process.platform === "win32" ? "npm.cmd" : "npm";
		await execCommand(commandName, ["install"], { cwd: `./${project}` });
		//帮助执行npm run dev
		await execCommand(commandName, ["run", "dev"], { cwd: `./${project}` });
	} catch (error) {
		console.log("github连接失败");
	}
}

async function addComponentAction(cpnname) {
	//1.创建一个组件:先编写组件的模板 根据内容给模板添加内容
	const result = await compileEjs("component.vue.ejs", {
		name: cpnname,
		lowername: cpnname.toLowerCase(),
	});

	//2.将result写入到对应的文件夹中
	const dest = program.opts().dest || "src/components";
	await writeFile(`${dest}/${cpnname}.vue`, result);
	console.log("创建组件成功", cpnname + ".vue");
}

module.exports = {
	createProjectAction,
	addComponentAction,
};

编写vue组件模板
新建component.vue.ejs文件

<template>
	<div class="<%= lowername %>">
		<h2><%= name %>:{{ message }}</h2>
	</div>
</template>
<script setup>
	import { ref } from "vue";
	const message = ref("哈哈哈哈");
</script>
<style>
	.<%= lowername %> {
		color: red;
	}
</style>

新建模板编译工具文件compile-ejs.js

const path = require("path");
const ejs = require("ejs");

function compileEjs(tempName, data) {
	return new Promise((resolve, reject) => {
		//1.获取当前模板的绝对路径
		const tempPath = `../template/${tempName}`;
		const absolutePath = path.resolve(__dirname, tempPath);

		//2.使用ejs引擎编译模板
		ejs.renderFile(absolutePath, data, (err, result) => {
			if (err) {
				console.log("编译模板失败", err);
				reject(err);
				return;
			}
			resolve(result);
		});
	});
}

module.exports = compileEjs;

新建文件流写入文件write-file.js

const fs = require("fs");

function writeFile(path, content) {
	return fs.promises.writeFile(path, content);
}

module.exports = writeFile;

然后在终端中输入
gucli addcpn TarBar --dest src/compponents
就会自动创建TarBar.vue组件
在这里插入图片描述
整体文件目录
在这里插入图片描述

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

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

相关文章

mybatis 第一章 mybatis简介

1.mybatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来源于“internet”和…

【智能算法】遗传算法原理及示例

目录&#xff1a;遗传算法一、流程图二、遗传编码三、适应度函数3.1 常见的适应度函数3.1.1 原始适应度函数3.1.2 标准适应度函数四、基本遗传操作4.1 选择操作4.1.1 比例选择4.1.2 轮盘赌选择4.2 交叉操作4.2.1 二进制交叉4.2.2 单点交叉4.2.3 两点交叉4.2.4 多点交叉4.3 变异…

Twitter被封号了?最详细的申诉教程在此

由于Twitter检测系统是十分敏感的&#xff0c;所以在运营的时候很容易莫名就出现“此账号被封禁”或者“此账号被冻结”的情况。出现这种情况大多是因为账号发送了垃圾信息、面临安全风险、发太多广告或者太久没上线被判为机器人这几个原因。被封号后&#xff0c;我们可以通过向…

Android DataStore Proto存储接入流程详解与使用

一、介绍 通过前面的文字&#xff0c;我们已掌握了DataStore 的存储&#xff0c;但是留下一个尾巴&#xff0c;那就是Proto的接入。 Proto是什么&#xff1f; Protobuf&#xff0c;类似于json和xml&#xff0c;是一种序列化结构数据机制&#xff0c;可以用于数据通讯等场景&a…

【taichi】在Window10上从源码编译太极(用于AOT)

准备工作 Visual studio 2022 建议勾选以下几个&#xff1a; 建议取消中文语言包&#xff0c;只选英文的&#xff08;因为中文有几率会出现BUG&#xff09; 说明&#xff1a;C游戏开发是为了UE AOT用的。 vulkan也是UE AOT要用的。 vulkan貌似不需要显示安装&#xff0c;只…

使用docker-compose部署RocketMQ5.0

简介&#xff1a;使用docker-compose部署rocketmq5.0。文中会介绍docker-compose版本以及需要注意的项第一步&#xff1a;进入hub.docker.com搜索rocketmq我们选择第一个&#xff0c;因为第一个是7个月前更新的&#xff0c;&#xff08;我看有很多博客使用的依旧是最下面的那种…

家政服务小程序实战教程14-立即预约功能开发

上一篇我们开发了客服功能&#xff0c;本篇我们开始开发预约功能。 1 创建数据源 功能开发之前先需要考虑数据源的规划问题&#xff0c;顾客预约某项服务时&#xff0c;需要告知上门时间、联系地址、联系电话&#xff0c;如果需要注明的事项&#xff0c;还需要标明备注。 先…

Vue 双向绑定原理

Vue2 双向绑定原理 mvvm 双向绑定&#xff0c;采用数据劫持结合发布者-订阅者模式的方式&#xff0c;通过 Object.defineProperty() 来 劫持各个属性的 setter、getter&#xff0c;在数据变动时发布消息给订阅者&#xff0c;触发相应的监听回调。 几个要点&#xff1a; 1&#…

分享82个HTML电脑主机模板,总有一款适合您

分享82个HTML电脑主机模板&#xff0c;总有一款适合您 82个HTML电脑主机模板下载链接&#xff1a;https://pan.baidu.com/s/13DGOCgvbxSksMPwJzi2z0g?pwdl0mi 提取码&#xff1a;l0mi Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 云虚拟主机运营商网站模板…

C语言返回类型为指针的一些经典题目(下)

续上一篇文章&#xff0c;上一篇文章题目都很经典&#xff0c;这一篇也不例外。一.返回类型为指针经典题目(下)1.代码(第六题)char *GetMemory3(int num) {char *p (char *)malloc(sizeof(char) * num);return p; } void Test3(void) {char *str NULL;str GetMemory3(100…

应用部署初探:6个保障安全的最佳实践

在之前的文章中&#xff0c;我们了解了应用部署的阶段以及常见的部署模式&#xff0c;包括微服务架构的应用应该如何部署等基本内容。本篇文章将介绍如何安全地部署应用程序。 安全是软件开发生命周期&#xff08;SDLC&#xff09;中的关键部分&#xff0c;同时也需要成为 S…

Java反序列化——CommonsCollections中基础知识

一、CC链总结图二、常见类1、Map类 --> TransformedMapMap类是存储键值对的数据结构。 Apache Commons Collections中实现了TransformedMap &#xff0c;该类可以在一个元素被添加/删除/或是被修改时(即key或value&#xff1a;集合中的数据存储形式即是一个索引对应一个值&a…

2022年Q4业绩超预期,被严重低估的Roku迎来反弹

在资本市场上&#xff0c;Roku应该是流媒体领域最具戏剧性的公司。它曾经被突发的疫情推向股价顶峰&#xff0c;但很快又随着疫情结束跌入谷底。 2022年对于Roku来说&#xff0c;仍然是继续探底的一年。随着股价跌回疫情发生前的水平&#xff0c;争论也开始越来越激烈&#xf…

spring-web HandlerMethodArgumentResolver 源码分析

HandlerMethodArgumentResolver 的使用处&#xff0c;解析参数 org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues HandlerMethodArgumentResolver 在解析参数时使用&#xff0c;以下是使用处 InvocableHandlerMethod#getMethodArgume…

面试题----集合

概述 从上图可以看出&#xff0c;在Java 中除了以 Map 结尾的类之外&#xff0c; 其他类都实现了 Collection 接⼝。 并且&#xff0c;以 Map 结尾的类都实现了 Map 接⼝List,Set,Map List (对付顺序的好帮⼿)&#xff1a; 存储的元素是有序的、可重复的。 Set (注重独⼀⽆⼆…

2.Telegraf简介

Telegraf简介 Telegraf是Influx公司一款基于插件化的开源指标收集工具.主要结合时序性数据库进行使用,用于性能监控.通常Telegraf会每间隔一段时间抓取一批指标数据并将数据发送给时序性数据库或其他自定义的Output. 官方文档 https://docs.influxdata.com/telegraf/v1.24 与…

分享7个比B站更刺激的老司机网站,别轻易点开

俗话说摸鱼一时爽&#xff0c;一直摸一直爽&#xff0c;作为一个程序员老司机了&#xff0c;一头乌黑浓密的头发还时不时被同事调侃&#xff0c;就靠这10个网站让我健康生活&#xff0c;不建议经常性使用&#xff0c;因为还有一句俗话&#xff0c;那就是“摸鱼一时爽&#xff0…

22- 隐马尔科夫HMM (NLP自然语言算法) (算法)

HMM模型 : from hmmlearn.hmm import GaussianHMM model GaussianHMM(n_components3,n_iter100000, covariance_type diag) model.fit(X) 1、马尔科夫链 有向图模型&#xff08;贝叶斯网络&#xff09;&#xff1a;用有向图表示变量间的依赖关系&#xff1b; 无向图模型&…

【GlobalMapper精品教程】051:融合Dissolve操作详解

本节讲解globalmapper中融合Dissolve工具的使用。 文章目录 一、工具介绍1. 工具位置2. 融合工具二、案例实战1. 加载实验数据2. 根据字段分组融合案例一:根据地类名称分组,将相同的类型融合到一起。案例二:根据权属地类名称分组,将相同的类型融合到一起。一、工具介绍 1.…

UE4 手把手教你做插件(1) 从代码引用插件

0&#xff0c;前言 我看的是 技术宅阿棍儿 的视频&#xff0c;B站有。 系列视频&#xff1a;从代码引用插件_哔哩哔哩_bilibili 看不懂&#xff0c;只能边查资料边看&#xff0c;讲的顺序有点乱 1&#xff0c;根据视频提示创建第三方插件 注意&#xff1a;如果只有空白插件的情…