如何开发一个极简的前端脚手架

简介: 如何开发一个极简的前端脚手架

背景

虎妞同学,在工作中,遇到了重构旧运营系统的技术需求,旧系统都是前后端不分离的项目

因此对于前端需要一套整体的后台管理框架。

功能上,要满足登录,权限管理,菜单配置,用户管理,字典管理,角色管理等后台管理系统的常规功能,

技术上,要使用vue3,element-ui等主流框架。

很快虎妞同学,就确定了技术框架的选型,并创建了项目仓库,作为项目模版。

开发中遇到的问题

在具体业务中,虎妞在创建新项目时,每次手动去克隆项目模版,然后再修改相关参数。

比如env中的系统名称,package.json中的名字,描述和作者。

很快,同事们就发现这种方式的几个问题

  • 手动修改配置容易出现漏改
  • 每次克隆项目太过麻烦
  • 模版项目的优化无法同步

解决方案

虎妞计划,建立一个简单的脚手架,打包成一个npm包,发布到公司私有库中,其他同事只要在全局安装了这个包,就只可以执行命令创建项目,然后输入需要配置的参数,就可以拉下来一个新的项目。

想到这里,思路清晰之后,虎妞说干就干。

首先在掘金上搜索了相关的文章,大同小异,但是需要接入公司的业务中,还需要修改一些内容。

相关依赖库

用到的三方依赖库有这些:

  • chalk: 用于在控制台输出彩色的文本,使输出信息更加清晰易读。
  • commander: 是一个命令行接口工具,可以轻松地创建命令行应用程序,并解析命令行参数。
  • dotenv: 用于加载环境变量,从而避免将配置敏感信息硬编码到代码中。
  • download-git-repo: 用于从 Git 仓库下载文件或整个仓库,支持多种协议(如 HTTP、SSH)和分支。
  • fs-extra: 扩展了 Node.js 原生的文件系统模块(fs),提供了更多的方法,如复制、移动、删除等,方便文件的操作。
  • inquirer: 提供了一个交互式命令行界面,可以方便地与用户进行交互,获取输入数据。
  • ora: 用于在控制台显示进度条或者一些符号,表示正在进行某个耗时的操作,提高用户体验。
"chalk": "4.0.0",
"commander": "10.0.0",
"dotenv": "^16.1.4",
"download-git-repo": "3.0.2",
"fs-extra": "11.1.0",
"handlebars": "^4.7.7",
"inquirer": "8.0.0",
"ora": "6.1.2"

流程

1.新增help 指令和 create指令

  • help 意思为查看帮助,
  • create 为创建项目命令,接受一个参数,该参数为要新建的项目名字。
  • -f 为强制覆盖命令
import { program } from 'commander'
program
    .name("cf-cli")
    .usage(`<command> [option]`)
    .version(`cf-cli ${packageInfo.version}`);
program
    .command("create <project-name>") // 增加创建指令
    .description("创建新项目") // 添加描述信息
    .option("-f, --force", "强制覆盖") // 强制覆盖
    .action(async (projectName, cmd) => {
        // 处理用户输入create 指令附加的参数
        await create(projectName, cmd);
    });
program.parse(process.argv);

2.当用户执行cf-cli create aaa 时,就会在开始当前目录下新建一个aaa 的项目。

3.优先判断当前目录下是否存在同名目录,

  • 若存在执行第4条,
  • 若不存在走第7条,请求项目模版。

此处使用fs.existsSync 方法判断

4.判断指令中是否使用了-f 参数

  • 如果使用-f 或者--force 则直接删除重命目录
  • 若没有使用强制覆盖命令,则继续执行第5条,走下一步判断

此处使用fs.remove 实现

5.询问当前用户是否要覆盖当前目录

  • 若覆盖,则删除原有重名目录后,执行第6步。
  • 若选择取消,则中断流程

此处主要使用Inquirer 库实现

import fs from "fs-extra"
import Inquirer from "inquirer"
const cwd = process.cwd();
    const targetDirectory = path.join(cwd, projectName);
    if (fs.existsSync(targetDirectory)) {
        // 判断是否使用 --force 参数
        if (options.force) {
            // 删除重名目录(remove是个异步方法)
            await fs.remove(targetDirectory);
        } else {
            let {isOverwrite} = await new Inquirer.prompt([
                // 返回值为promise
                {
                    name: "isOverwrite", // 与返回值对应
                    type: "list", // list 类型
                    message: "项目已经存在,请选择",
                    choices: [
                        {name: "覆盖", value: true},
                        {name: "取消", value: false},
                    ],
                },
            ]);
            // 选择 Cancel
            if (!isOverwrite) {
                console.log("\r\n已取消");
                return;
            } else {
                // 选择 Overwirte ,先删除掉原有重名目录
                await fs.remove(targetDirectory);
                console.log("\r\n已经删除原项目");
            }
        }
    }

6.从gitlab 仓库拉取需要代码

此处使用了download-git-repo库

7.拉取成功后,询问用户,要求输入系统的中文标题。

此处主要使用Inquirer 库实现

8.获取到中文标题后,注入项目模版的env和package.json

修改env

这段代码定义了一个名为generateEnv的函数,它接受三个参数:

projectName表示项目名称,name表示要生成的.env文件的名称(例如.env.production),title表示应用的标题。

该函数的主要功能是读取指定的.env文件(路径由projectName和name组成),并将其中的VITE_APP_TITLE变量的值设置为传入的title,最后将修改后的内容覆盖原文件中的内容。

具体来说,它通过使用dotenv.parse解析.env文件的内容,然后将VITE_APP_TITLE的值替换为传入的title,接着将其余变量的键值对格式化为字符串,并写入到文件中。

generateEnv(projectName, '.env.production', '后台管理系统')
function generateEnv(projectName, name, title) {
    const envFilePath = `${projectName}/${name}`;
    const envConfig = dotenv.parse(fs.readFileSync(envFilePath));
    envConfig.VITE_APP_TITLE = title;
    const newEnvContent = Object.entries(envConfig)
        .map(([key, value]) => `${key}=${value}`)
        .join('\n');
    fs.writeFileSync(envFilePath, newEnvContent);
}

修改package.json

主要修改三个字段

  • name 取创建项目时的名字
  • description 取系统的中文名字
  • author 取当前git 的用户名
  • 这里使用了child_process库
import {execSync} from "child_process"
packageContent.author = execSync('git config user.name').toString().trim() || ''

9.打印成功的消息

这里使用了chalk 库来实现打印日志

export function Log(msg, color = 'blue') {
    console.log(chalk[color](msg))
}

10.输出提示,结束流程。

Log(`\r\n${projectName}项目已成功创建`, 'white');
Log(`\r\ncd  ${projectName}`, 'green')
Log(`npm install`, 'green')
Log(`npm run dev`, 'green')

流程图示意

1686901056915.jpg

1686901066002.jpg

最后

在开发完这个脚手架之后,其实发现开发一个脚手架很简单,都是调用的三方库,难点在于怎么接入公司业务。对公司的统一模版如何管理和配置。

有脚手架的前提是有一个统一的项目模版。

现有的项目模版是一次性的,如果拉下来,就无法继续更新了,如果能够把整个项目模版打成一个安装包在项目中安装,这样我们唯一统一的项目模版,有新功能的更新,只需要改一次,其他平台更新依赖就可以了。

相关文章
|
8天前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
102 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
1月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
175 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
21天前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
60 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
1月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
97 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
1月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
64 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
1月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
55 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
14天前
|
JSON 前端开发 数据可视化
前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学。Layui 是一款开源前端 UI 组件库,具有极简设计、强大功能和卓越性能,支持布局、表单、表格、弹层等六大模块,组件高度可定制。它无需复杂构建工具,直接面向浏览器开发,极大提升开发效率与界面美观度。适合新手和老手,快来试试吧!
|
5月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
379 14
|
5月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
89 0
|
5月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
129 6

热门文章

最新文章

  • 1
    前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
  • 2
    从前端视角聊聊通义灵码使用经验,如何更好地提升研发效率
  • 3
    VSCode AI提效工具,通义灵码前端开发体验
  • 4
    【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
  • 5
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 6
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
  • 7
    【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
  • 8
    无前端经验如何快速搭建游戏站:使用 windsurf 从零到上线的详细指南
  • 9
    AI程序员:通义灵码 2.0应用VScode前端开发深度体验
  • 10
    构建高效Java后端与前端交互的定时任务调度系统