首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

搭建公司前端脚手架

  • 25-04-25 15:00
  • 2851
  • 10991
juejin.cn

前言

公司的项目使用的都是 react + ts + mobx + antd 的技术栈,每次搞新组件或者重构组件的时候都要重复新建文件夹,比较麻烦,而且每个人的代码风格、习惯也有差异。所以搭建一个快速创建业务组件的脚手架方便开发。

初始化

项目根目录运行命令

js
代码解读
复制代码
npm init -y

然后安装依赖包

js
代码解读
复制代码
npm i await-to-js fs-extra inquirer@7.0.4

然后在 package.json 里面配置 添加 bin 节点 txCli 命令,配置脚手架的入口文件为根目录下 index.js

js
代码解读
复制代码
//package.json { "bin": { "txCli": "./index.js" }, }

创建项目目录如下

js
代码解读
复制代码
|-- 根目录 |-- template //模板 |--web //web端模块 |--组件模板1 |--组件模板2 |--index.js //web端模块的入口文件 |--h5 //h5模块 |--组件模板1 |--组件模板2 |--index.js //h5端模块的入口文件 |--wx //微信小程序模块 |--组件模板1 |--组件模板2 |--index.js //微信小程序的入口文件 |-- index.js //脚手架入口文件 |-- tool.js //工具函数模块 |-- package.json

组件模板的目录结构如下

js
代码解读
复制代码
|--组件模板 |--dom //写好的组件模板配置 |--index.js //组件模板配置的入口文件

脚手架编写

以web端组件模块为例子

脚手架入口文件

在根目录下的 index.js 文件,顶部写上 #!/usr/bin/env node

js
代码解读
复制代码
#!/usr/bin/env node const args = process.argv.slice(2); // type 可以拿到脚手架命令后的参数 比如 txCli --webComp 拿到的就是 --webComp const type = args[0]; const { createWeb } = require("./template/web"); switch (type) { case "--webComp": { createWeb(); } break; default: { console.log("无效操作参数"); } }

当我们运行 txCli --webComp 命令的时候,就会走到 createWeb() 里面

模块入口文件

在 template/web/index.js 中,这是创建 web端组件模块的入口文件

js
代码解读
复制代码
const inquirer = require('inquirer'); const { to } = require("await-to-js"); const { createModal } = require("./Modal/index"); async function createWeb() { const [err, res] = await to( inquirer.prompt([ { type: "list", name: "type", message: "请选择web组件模块", choices: [{ value: 1, name: "1-弹窗" }], default: 0, }, ]) ); switch (res.type) { case 1: { createModal(); } break; } } module.exports = { createWeb };

因为 web 端会有很多业务组件,这里拿创建一个 Modal 为例子,当我们选择 1-弹窗的时候,就会走到 createModal() 里面

1745464870545.png

组件模板配置

首先在 template/web/modal/dom 里面,写好组件的模板

1745465132797.png

比如这儿咱们用的 react + ts + mobx 来搞组件模板

比如 web 端 Modal 组件的编写如下:

tsx
代码解读
复制代码
import { observer, useSyncProps } from "@quarkunlimit/qu-mobx"; import { Modal } from "antd"; import { forwardRef, useImperativeHandle } from "react"; import { IXXXProps, IXXXRef } from "./interface"; import { Provider, useStore } from "./store/RootStore"; const XXX = observer( forwardRef<IXXXRef, IXXXProps>(function XXX_(props, ref) { const root = useStore(); useSyncProps(root, Object.keys(props), props); const { logic, PropsStore } = root; useImperativeHandle(ref, () => { return { openModal: logic.openModal, closeModal: logic.closeModal, }; }); return ( <Modal open={logic.open} width={800} destroyOnClose onCancel={logic.closeModal} { ...PropsStore.props } > XXX Modal> ); }) ); export default observer( forwardRef<IXXXRef, IXXXProps>(function XXXPage(props, ref) { return ( <Provider> <XXX {...props} ref={ref} /> Provider> ); }) );

在 template/web/Modal/index.js 中,就是 web端 Modal 组件的入口创建文件了

js
代码解读
复制代码
const { to } = require("await-to-js"); const { existsSync } = require("fs"); const fse = require("fs-extra"); const inquirer = require("inquirer"); const path = require("path"); const { replaceFileInfo } = require("../../../tool"); async function createModal() { const [err, res] = await to( inquirer.prompt([ { type: "input", name: "page", message: "请输入页面文件夹名(首字母大写e.g:EditModal)", }, ]) ); const Page = res.page?.trim?.(); if (!Page) { console.log("请输入正确的页面名"); return; } const workPath = process.cwd(); const dirPath = path.join(workPath, Page); if (existsSync(dirPath)) { console.log("该页面已存在"); return; } console.log("组件路径:", workPath); console.log("组件名称:", Page); try { await fse.copy(path.resolve(__dirname, "./dom"), dirPath); } catch (error) { console.log("发生了异常:"); console.log(error); return; } // 替换页面名称 replaceFileInfo(path.join(dirPath, "index.tsx"), "XXX", Page); // 替换interface名称 replaceFileInfo(path.join(dirPath, "interface.ts"), "XXX", Page); // 替换store相关内容 replaceFileInfo(path.join(dirPath, "store/RootStore/index.ts"), "XXX", Page); replaceFileInfo( path.join(dirPath, "store/RootStore/interface.ts"), "XXX", Page ); console.log("web组件创建完成"); } module.exports = { createModal };

上面做的事情就是

  • 用户输入这个组件的名称
  • 判断当前路径下有没有重复组件
  • 复制模板到指定路径下
  • 然后把模板里面的 XXX 替换成输入的组件名称

这里的 replaceFileInfo 就是一个文件内容替换的方法,在根目录下的 tool.js 中

js
代码解读
复制代码
// tool.js const fs = require("fs"); const fileConfig = { encoding: "utf-8", }; const replaceFileInfo = (filePath, oldInfo, newInfo) => { //读取指定目录的文件内容 let content = fs.readFileSync(filePath, fileConfig); //替换内容 content = content.replaceAll(oldInfo, newInfo); //覆盖旧内容 fs.writeFileSync(filePath, content, fileConfig); }; module.exports = { replaceFileInfo, };

脚手架实践

写好脚手架后,把代码推到 gitlab,然后本地执行 npm link

然后在项目里面执行命令即可

image.png

1745465677693.png

这样就可以去配置不同端的各种业务组件了

注:本文转载自juejin.cn的Jolyne_的文章"https://juejin.cn/post/7496406295005167616"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top