创建自己的脚手架(二)

创建自己的脚手架(二)

接着之前的功能继续开发

脚手架创建组件功能

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组件
在这里插入图片描述
整体文件目录
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_聪明勇敢有力气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值