vue-创建自己的CLI脚手架

news2024/9/23 8:23:39

1.自定义命令和入口配置

首先创建一个文件夹,然后npm init -y生成package.json文件

添加bin命令配置入口文件

新建lib/index.js文件

然后在控制台npm link 建立软连接 、然后执行felix-cli 就可以输出代码

2.查看当前版本号命令

安装 commander

npm i commander

lib/index.js

#!/usr/bin/env node

const {program} = require('commander')

// 处理--version的操作
const version = require('../package.json').version
program.version(version,'-v --version')

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

3.增加options选项和封装

新建lib/core/help-options.js文件

 help-options.js

const { program } = require('commander')

function helpOptions() {
  // 1.处理--version的操作
  const version = require('../../package.json').version
  program.version(version, '-v --version')

  // 2.增强其他的options的操作
  program.option('-w --why', "a why cli program~")
  program.option('-d --dest <dest>', 'a destination folder, 例如: -d src/components')

  program.on('--help', () => {
    console.log("")
    console.log("others:")
    console.log("  xxx")
    console.log("  yyy")
  })
}

module.exports = helpOptions

lib/index.js

#!/usr/bin/env node

const {program} = require('commander')

const helpOptions = require('./core/help-options')

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


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

4.create命令创建项目过程

安装download-git-repo,主要用于从远程仓库下载模板

npm i download-git-repo

lib/index.js 

const { createProjectAction } = require('./core/actions')


// 2.增加具体的一些功能操作
program
  .command("create <project> [...others]")
  .description("create vue project into a folder, 比如: felix-cli create vue3-template")
  .action(createProjectAction)

lib/core/actions

const { promisify } = require('util')
const download = promisify(require('download-git-repo'))
const { VUE_REPO } = require('../config/repo')


async function createProjectAction(project) {
  try {
    // 1.从编写的项目模板中clone下来项目
    await download(VUE_REPO, project, { clone: true })

  } catch (error) {
    console.log("github连接失败, 请稍后重试")
  }
}


module.exports = {
  createProjectAction,
}

lib/config/repo.js

const VUE_REPO = "direct:https://gitee.com/hktklifusheng/vue3-template#master"

module.exports = {
  VUE_REPO
}

然后可以新建一个文件夹,在控制台输出以下命令  就可以新建模板

felix create template

5.脚手架执行安装与运行命令 

在下载完模板后自动执行安装包和运行项目

lib/core/actions.js

const { promisify } = require('util')
const download = promisify(require('download-git-repo'))
const { VUE_REPO } = require('../config/repo')
const execCommand = require('../utils/exec-command')


async function createProjectAction(project) {
  try {
    // 1.从编写的项目模板中clone下来项目
    await download(VUE_REPO, project, { clone: true })

    // 2.很多的脚手架, 都是在这里给予提示
    // console.log(`cd ${project}`)
    // console.log(`npm install`)
    // console.log(`npm run dev`)

    // 3.帮助执行npm install
    console.log(process.platform)
    const commandName = process.platform === 'win32' ? 'npm.cmd' : 'npm'
    await execCommand(commandName, ["install"], { cwd: `./${project}` })

    // 4.帮助执行npm run dev
    await execCommand(commandName, ["run", "dev"], { cwd: `./${project}` })

  } catch (error) {
    console.log("github连接失败, 请稍后重试")
  }
}


module.exports = {
  createProjectAction,
}

utils/exec-command

const { spawn } = require('child_process')

function execCommand(...args) {
  return new Promise((resolve) => {
    // npm install/npm run dev
    // 1.开启子进程执行命令
    const childProcess = spawn(...args)
    // 2.获取子进程的输出和错误信息
    childProcess.stdout.pipe(process.stdout)
    childProcess.stderr.pipe(process.stderr)

    // 3.监听子进程执行结束, 关闭掉
    childProcess.on('close', () => {
      resolve()
    })
  })
}

module.exports = execCommand

6.脚手架创建添加组件的过程

要安装ejs  js的模板引擎

npm i ejs

lib/index.js

 const { addComponentAction} = require('./core/actions')

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

lib/core/actions.js

const compileEjs = require('../utils/compile-ejs')
const writeFile = require('../utils/write-file')
const { program } = require('commander')

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 = {
  addComponentAction
}

lib/utils/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

lib/utils/write-file.js

const fs = require('fs')

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

module.exports = writeFile

然后就可以在模板的控制台中输入felix addcpn navbar,就能新建组件了

或者指定目录elix addcpn navbar --dest src/views/home/c-cpns

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

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

相关文章

系统架构设计师 - 企业信息化战略与实施

企业信息化战略与实施 企业信息化战略与实施信息与信息化的概念信息的定义信息的特点信息化的概念信息化对组织的意义 信息系统生命周期 ★立项阶段开发阶段运维阶段消亡阶段 信息系统战略规划 ★ ★ ★政府信息化与电子政务 ★企业信息化与电子商务 ★ ★ ★企业资源计划企业资…

2024年让短片制作不再难,4款剪辑软件助你一臂之力!

在这个短视频流行的时代&#xff0c;每一个创意都值得被展现&#xff0c;每一份热情都值得被激发。你是不是也曾经想过&#xff0c;用镜头来讲述你的故事&#xff0c;用剪辑来展示你的才华&#xff1f;今天&#xff0c;我们一起来探索2024年制作高质量短片的秘密武器——4款强大…

gitignore文件设置,git提交时忽略部分文件

在git提交时&#xff0c;出现了非常多无用的文件&#xff0c;包括.idea、.iml文件等等&#xff0c;使得commit变得麻烦&#xff0c;要自己在勾选框中点击半天。 右键单击项目名&#xff0c;选择New 选择File,命名为.gitignore&#xff08;注意&#xff1a;开头符号是英文.&…

文件描述符(fileno)及文件系统

fileno: #include <stdio.h> main() {FILE *fp;int fd;fp fopen("/etc/passwd", "r");fd fileno(fp);printf("fd %d\n", fd);fclose(fp); } 一&#xff0e;fileno()函数-CSDN博客https://blog.csdn.net/TuxedoLinux/article/detai…

利用开源可视化报表工具进入流程化办公!

很多客户朋友都希望能实现流程化办公&#xff0c;因为只有这样才能帮助企业顺利降本、增效、提质&#xff0c;利用好企业内部数据资源&#xff0c;打破信息孤岛壁垒&#xff0c;实现高效发展。低代码技术平台、开源可视化报表工具优势功能特点多&#xff0c;是提质高效的办公利…

日本软文发稿:日本主流发稿媒体有哪些?

日本软文发稿&#xff1a;日本主流发稿媒体有哪些 在日本发布软文时&#xff0c;选择合适的主流媒体进行推广是非常关键的。以下是一些在日本广受欢迎、影响力较大的媒体推荐&#xff08;排列不区分媒体排名顺序&#xff09;&#xff1a; 1. 朝日新闻 (Asahi Shimbun) 朝日新…

ChildLife童年时光创始人Murray Clarke亮相CBME并解析技术创新

2024年7月17日至19日&#xff0c;全球知名的孕婴童产品展览会——CBME国际孕婴童展在上海盛大开幕。作为这一领域最具影响力的展会之一&#xff0c;CBME吸引了众多国际知名品牌前来参展。美国知名儿童营养品牌ChildLife童年时光也携其重磅新品“液体钙小绿钙”亮相本次展会。Ch…

【测试架构师修炼之道】读书笔记

六大质量属性 效率性能 测试类型&#xff1a;六种-XX属性转化为XX测试 产品测试车轮图 一个软件测试者要从哪些方面(测试类型)用哪些方法(测试方法)去测试产品(质量属性)的关系图 全面性与深度 稳定性测试&#xff1a;多并复异 性能测试&#xff1a; 系统能够正确处理新业…

格式化的硬盘怎么恢复数据?格式化数据恢复的7个小妙招,助你快速恢复文件

硬盘格式化不仅可以提升计算机性能、释放空间&#xff0c;还可修复部分错误。通常&#xff0c;在进行硬盘格式化前&#xff0c;系统会发出数据将被删除的警告。然而&#xff0c;有时即使有警告&#xff0c;也可能不慎格式化硬盘导致重要文件丢失。在这种情况下&#xff0c;您需…

微软GraphRAG,开启智能检索新篇章

©作者|YXFFF 来源|神州问学 1. 引言 检索增强生成&#xff08;RAG&#xff09;是一种根据用户的查询语句搜索信息&#xff0c;并以搜索结果为 AI 参考从而生成回答。这项技术是多数基于 LLM 工具的重要组成部分&#xff0c;而多数的 RAG 都采用向量相似性作为搜索的技术。…

【过题记录】 8.2 hddx

飞行棋 关于这一题 我在考场上手莫了n2和n3的情况 发现一点规律&#xff0c;大力猜想蒙了一个结论 结果蒙对了… 关于正确做法&#xff0c;发现零号点和其他几个点是不一样的。 因为对于0而言&#xff0c;他没有赠送的情况(只要摇到n就直接胜利) 因此0和其他点要分开讨论 对于…

1.大语言模型如何从专才走向通才2.GPT4的核心是可以写并执行代码,还可以接受文件读取并应用于代码中(比如中文字资料包),完全是个工程师了

1.大语言模型如何从专才&#xff08;机器翻译&#xff09;走向通才2.GPT4的核心是可以写并执行代码,还可以接受文件读取并应用于代码中&#xff08;比如中文字资料包&#xff09;&#xff0c;完全是个工程师了 总纲&#xff1a;大语言模型就是做文字接龙游戏! 大模型为了得到…

Linux 应急响应靶场练习 1

靶场在知攻善防实验室公众号中可以获取 前景需要&#xff1a;小王急匆匆地找到小张&#xff0c;小王说"李哥&#xff0c;我dev服务器被黑了",快救救我&#xff01;&#xff01; 挑战内容&#xff1a; &#xff08;1&#xff09;黑客的IP地址 &#xff08;2&#xff0…

【香橙派系列教程】(六)嵌入式SQLite数据库

【六】嵌入式SQLite数据库 文章目录 【六】嵌入式SQLite数据库1.简介2.SQLite数据库安装3.SQLite命令用法1.创建数据库2.创建和查看表格3.插入查看数据&#xff08;记录&#xff09;4.删除更改数据&#xff08;记录&#xff09; 4.SQLite编程操作1.打开/创建数据库的C接口2.创建…

C# Unity 面向对象补全计划 之 接口

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 1.接口 在 C# 中&#xff0c;接口&#xff08;interface&#xff09;是一种定义…

高效PPT制作,一键完成——四大AIPPT工具推荐

在现代社会&#xff0c;PPT已经成为职场人士必备的技能之一。如今&#xff0c;随着人工智能技术的发展&#xff0c;AI制作PPT的工具应运而生。今天&#xff0c;就为大家推荐四款实用的AIPPT工具&#xff0c;让你轻松提升工作效率。 一、笔灵AIPPT 链接&#xff1a;https://ib…

Deep Updated Subspace Networks for Few-Shot RSSC

这篇文章介绍了子空间的概念&#xff0c;然后将query set的特征和预测概率与Support set的特征混合到一起来减少遥感场景图像背景复杂的影响。我觉得主要的创新点还是在特征混合这一块&#xff0c;下图是总体框架图&#xff1a; 特征混合的公式为&#xff1a; 其中的表示第C个类…

什么是图像噪声

" 声明&#xff1a;此文档中的大部分内容来源于网络&#xff0c;经校对和整理后分享给大家&#xff0c;仅供学习参考使用。" 1、什么是图像噪声 维基百科的定义&#xff1a;图像噪声&#xff08;image noise&#xff09;是图像中一种亮度或颜色信息的随机变化(被拍摄…

Error “[object Object]“ when using LangChain‘s AzureChatOpenAI in Node.js

题意&#xff1a;在Node.js中使用LangChain库的AzureChatOpenAI功能时遇到错误“Error [object Object]” 问题背景&#xff1a; Im attempting to use LangChains AzureChatOpenAI with the gpt-35-turbo-16k model in a Node.js application to create an OpenAI Function A…

c++ - 模拟实现set、map

文章目录 前言一、set模拟实现二、map模拟实现 前言 在C标准库中&#xff0c;std::set 和 std::map都是非常常用的容器&#xff0c;它们提供了基于键值对的存储和快速查找能力。然而&#xff0c;关于它们的底层实现&#xff0c;C标准并没有强制规定具体的数据结构&#xff0c;只…