<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>脚手架 on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/%E8%84%9A%E6%89%8B%E6%9E%B6/</link><description>Recent content in 脚手架 on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 15 Sep 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/%E8%84%9A%E6%89%8B%E6%9E%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>国内开源 Java 脚手架生态全景：Dromara 组织与低代码平台横评</title><link>https://liangweidonggood.github.io/p/guonei-kaiyuan-java-jiaoshoujia-shengtai-quanjing/</link><pubDate>Sun, 15 Sep 2024 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/guonei-kaiyuan-java-jiaoshoujia-shengtai-quanjing/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/guonei-kaiyuan-java-jiaoshoujia-shengtai-quanjing/image/cover.jpg" alt="Featured image of post 国内开源 Java 脚手架生态全景：Dromara 组织与低代码平台横评" /&gt;&lt;p&gt;2024 年的今天，国内 Java 生态的&amp;quot;脚手架&amp;quot;赛道已经从单点竞争演化为&amp;quot;组织化运营&amp;quot;——Dromara 组织 200+ 仓库、jeecg 团队 30+ 项目、个人作者（芋道/青苗/小傅哥）百花齐放。&lt;strong&gt;对于一个想快速搭建后台系统的团队，从 22 款主流脚手架中选型是必经之路&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本文写于 2024 年 9 月&lt;/strong&gt;——Dromara 组织成立 6 年，已成为国内 Java 生态最具影响力的非营利组织。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一dromara-组织概览"&gt;一、Dromara 组织概览
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://dromara.org/zh/about/" target="_blank" rel="noopener"
 &gt;Dromara&lt;/a&gt; 是由国内 Java 开发者共同创建的&lt;strong&gt;非营利开源组织&lt;/strong&gt;，目标是&amp;quot;让每一个 Java 工程师都能用上优秀的脚手架&amp;quot;。截至 2024-09：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;仓库数&lt;/strong&gt;：200+ 个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心项目&lt;/strong&gt;：50+ 个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表作品&lt;/strong&gt;：RuoYi-Vue-Plus、Sa-Token、Hutool、Forest、TLog、Cube、Raincat、Sureness&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二22-款主流脚手架全景"&gt;二、22 款主流脚手架全景
&lt;/h2&gt;&lt;h3 id="21-脚手架横向对比"&gt;2.1 脚手架横向对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;地址&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;jeecg-boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/jeecgboot/jeecg-boot&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;低代码后台&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeecgboot-vue3&lt;/td&gt;
					&lt;td&gt;github.com/jeecgboot/jeecgboot-vue3&lt;/td&gt;
					&lt;td&gt;jeecg-boot Vue 3 前端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeecg-uniapp&lt;/td&gt;
					&lt;td&gt;github.com/jeecgboot/jeecg-uniapp&lt;/td&gt;
					&lt;td&gt;jeecg-boot 移动端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeesite&lt;/td&gt;
					&lt;td&gt;github.com/thinkgem/jeesite&lt;/td&gt;
					&lt;td&gt;老牌 Java 脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;tianti&lt;/td&gt;
					&lt;td&gt;github.com/xujeff/tianti&lt;/td&gt;
					&lt;td&gt;CMS 解决方案&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;e&lt;/td&gt;
					&lt;td&gt;github.com/fuhoujun/e&lt;/td&gt;
					&lt;td&gt;微服务脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jeesite (JeeSite)&lt;/td&gt;
					&lt;td&gt;github.com/thinkgem/jeesite&lt;/td&gt;
					&lt;td&gt;Java 脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PublicCMS&lt;/td&gt;
					&lt;td&gt;github.com/sanluan/PublicCMS&lt;/td&gt;
					&lt;td&gt;CMS 管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;pig&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/pig-mesh/pig&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;微服务脚手架&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Heeexy/SpringBoot-Shiro-Vue&lt;/td&gt;
					&lt;td&gt;github.com/Heeexy/SpringBoot-Shiro-Vue&lt;/td&gt;
					&lt;td&gt;简单权限&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Springboot_v2&lt;/td&gt;
					&lt;td&gt;github.com/fuce1314/Springboot_v2&lt;/td&gt;
					&lt;td&gt;小架子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;COLA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/alibaba/COLA&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;阿里分层架构&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SpringBlade&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/chillzhuang/SpringBlade&lt;/td&gt;
					&lt;td&gt;微服务脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Saber&lt;/td&gt;
					&lt;td&gt;gitee.com/smallc/Saber&lt;/td&gt;
					&lt;td&gt;SpringBlade 前端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;eladmin&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/elunez/eladmin&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;后台管理&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;eladmin-web&lt;/td&gt;
					&lt;td&gt;github.com/elunez/eladmin-web&lt;/td&gt;
					&lt;td&gt;eladmin 前端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;dokit&lt;/td&gt;
					&lt;td&gt;github.com/perye/dokit&lt;/td&gt;
					&lt;td&gt;工具型脚手架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;lamp-cloud&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/zuihou/lamp-cloud&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringCloud&lt;/td&gt;
					&lt;td&gt;github.com/zhoutaoo/SpringCloud&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Groza&lt;/td&gt;
					&lt;td&gt;github.com/IoT-Technology/Groza&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;物联网平台&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;thingsboard&lt;/td&gt;
					&lt;td&gt;github.com/thingsboard/thingsboard&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;物联网平台&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring-Cloud-Platform&lt;/td&gt;
					&lt;td&gt;github.com/wxiaoqi/Spring-Cloud-Platform&lt;/td&gt;
					&lt;td&gt;微服务&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-分类总结"&gt;2.2 分类总结
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类别&lt;/th&gt;
					&lt;th&gt;代表项目&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;低代码&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;jeecg-boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;微服务&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;pig、SpringBlade、lamp-cloud、e、Spring-Cloud-Platform、zhoutaoo/SpringCloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;后台管理&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;eladmin、Heeexy/SpringBoot-Shiro-Vue、Springboot_v2&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;架构规范&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;alibaba/COLA（分层架构）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;工具/集成&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;perye/dokit、dromara 各项目&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;CMS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;tianti、PublicCMS、jeesite&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;物联网&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Groza、thingsboard&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="三四大明星项目深度对比"&gt;三、四大明星项目深度对比
&lt;/h2&gt;&lt;h3 id="31-jeecg-boot低代码之王"&gt;3.1 jeecg-boot：低代码之王
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在线表单设计器（拖拽生成）&lt;/li&gt;
&lt;li&gt;代码生成器（数据库表 → 前后端代码）&lt;/li&gt;
&lt;li&gt;工作流引擎（Activiti/Camunda）&lt;/li&gt;
&lt;li&gt;报表引擎（积木报表 + JimuReport）&lt;/li&gt;
&lt;li&gt;大屏设计（拖拽式大屏）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;后端：Spring Boot 2.6.6 + MyBatis-Plus + Shiro + JWT&lt;/li&gt;
&lt;li&gt;前端：Vue 3 + Ant Design Vue&lt;/li&gt;
&lt;li&gt;移动端：UniApp&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;政府/国企 OA/ERP&lt;/li&gt;
&lt;li&gt;业务表单多、流程长的内部系统&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;零代码&amp;quot;完成交付&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-pig微服务--业务组件"&gt;3.2 pig：微服务 + 业务组件
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Cloud Alibaba 全家桶&lt;/li&gt;
&lt;li&gt;完善的多租户 + 权限体系&lt;/li&gt;
&lt;li&gt;代码生成器（支持自定义模板）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;avue 组件&lt;/strong&gt;（国内首个面向后台的 Vue UI 库）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pigx&lt;/strong&gt;（企业版）支持工作流 + 报表&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;后端：Spring Boot 2.7 + Spring Cloud Alibaba + MyBatis-Plus + Nacos&lt;/li&gt;
&lt;li&gt;前端：Vue 2 + avue + Element UI&lt;/li&gt;
&lt;li&gt;业务组件：30+（含 CMS、商城、CRM）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中小企业 SaaS 产品&lt;/li&gt;
&lt;li&gt;微服务架构的内部系统&lt;/li&gt;
&lt;li&gt;需要&amp;quot;业务组件即装即用&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-springblade微服务--多端"&gt;3.3 SpringBlade：微服务 + 多端
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring Cloud 全家桶（Netflix + Alibaba）&lt;/li&gt;
&lt;li&gt;前后端分离 + 多端（Web / App / 小程序）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sword&lt;/strong&gt;（Saber）前端框架&lt;/li&gt;
&lt;li&gt;完善的多租户 + 流程管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;后端：Spring Boot 2.x + Spring Cloud + MyBatis-Plus + Nacos + Sentinel&lt;/li&gt;
&lt;li&gt;前端（Web）：Vue 2 + Element UI&lt;/li&gt;
&lt;li&gt;前端（App）：UniApp&lt;/li&gt;
&lt;li&gt;网关：Spring Cloud Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中大型企业级系统&lt;/li&gt;
&lt;li&gt;需要 Web + App + 小程序多端&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;一次开发多端运行&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="34-lamp-cloud微服务--集大成"&gt;3.4 lamp-cloud：微服务 + 集大成
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 Spring Cloud Alibaba 完整微服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lamp-util&lt;/strong&gt; 工具集（30+ 工具模块）&lt;/li&gt;
&lt;li&gt;完善的多租户 + 数据权限&lt;/li&gt;
&lt;li&gt;代码生成器（增强版）&lt;/li&gt;
&lt;li&gt;工作流（Flowable）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术栈&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;后端：Spring Boot + Spring Cloud Alibaba + Nacos + Sentinel + Seata&lt;/li&gt;
&lt;li&gt;前端：Vue 3 + Vben Admin + TypeScript&lt;/li&gt;
&lt;li&gt;数据库：MyBatis-Plus + Druid + ShardingSphere&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;中大型企业级系统&lt;/li&gt;
&lt;li&gt;需要完整微服务治理&lt;/li&gt;
&lt;li&gt;团队希望&amp;quot;开箱即用&amp;quot;的全套组件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四技术栈对比"&gt;四、技术栈对比
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;jeecg-boot&lt;/th&gt;
					&lt;th&gt;pig&lt;/th&gt;
					&lt;th&gt;SpringBlade&lt;/th&gt;
					&lt;th&gt;lamp-cloud&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;前端&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Ant Design Vue&lt;/td&gt;
					&lt;td&gt;avue + Element UI&lt;/td&gt;
					&lt;td&gt;Element UI&lt;/td&gt;
					&lt;td&gt;Vben + TypeScript&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;后端&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.6&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.7&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.x&lt;/td&gt;
					&lt;td&gt;Spring Boot 2.x&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;注册中心&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
					&lt;td&gt;Nacos&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;权限&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Shiro + JWT&lt;/td&gt;
					&lt;td&gt;Spring Security&lt;/td&gt;
					&lt;td&gt;Spring Security&lt;/td&gt;
					&lt;td&gt;自研&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;代码生成&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;工作流&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;移动端&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;UniApp&lt;/td&gt;
					&lt;td&gt;独立 App&lt;/td&gt;
					&lt;td&gt;UniApp&lt;/td&gt;
					&lt;td&gt;独立&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;多租户&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;弱&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;强&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;代码质量&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;学习曲线&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
					&lt;td&gt;中等&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
					&lt;td&gt;高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="五dromara-组织明星项目盘点"&gt;五、Dromara 组织明星项目盘点
&lt;/h2&gt;&lt;h3 id="51-工具类"&gt;5.1 工具类
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
					&lt;th&gt;地位&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Hutool&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java 工具集（代替 Guava）&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;国内最流行&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sa-Token&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;轻量级权限认证&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;低代码 + 简单&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Forest&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java HTTP 客户端（声明式调用）&lt;/td&gt;
					&lt;td&gt;替代 OkHttp&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;TLog&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式日志链路追踪&lt;/td&gt;
					&lt;td&gt;轻量替代 SkyWalking&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Fast Request&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;IDEA 插件（API 调试）&lt;/td&gt;
					&lt;td&gt;Restful 替代 Postman&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Sureness&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;权限认证&lt;/td&gt;
					&lt;td&gt;替代 Spring Security&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;JPom&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自动化部署&lt;/td&gt;
					&lt;td&gt;替代 Jenkins&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="52-中间件类"&gt;5.2 中间件类
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Raincat&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式事务（强一致 TCC）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Hmily&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式事务（TCC + AT）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Myth&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式事务（基于 MQ）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Cube&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;一站式 API 网关&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Gobrs-Async&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;异步编排框架&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="53-数据类"&gt;5.3 数据类
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;DynamicTp&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;动态线程池&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Neko&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;数据库访问（轻量 ORM）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="54-测试类"&gt;5.4 测试类
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Phoenix&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自动化测试平台&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Happy-Java&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Java 进阶之路&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Dante Cloud&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;企业级微服务（Spring Authorization Server）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="六项目例子"&gt;六、项目例子
&lt;/h2&gt;&lt;h3 id="61-行业模板"&gt;6.1 行业模板
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;地址&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;IndoorPos&lt;/td&gt;
					&lt;td&gt;github.com/megagao/IndoorPos&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;室内定位&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;shardingsphere-example&lt;/td&gt;
					&lt;td&gt;github.com/apache/shardingsphere-example&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;数据库分片&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jtt1078-video-server&lt;/td&gt;
					&lt;td&gt;github.com/glaciall/jtt1078-video-server&lt;/td&gt;
					&lt;td&gt;视频转播服务器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt809-tcp-server&lt;/td&gt;
					&lt;td&gt;github.com/ch0ice/jt809-tcp-server&lt;/td&gt;
					&lt;td&gt;jt809 协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt808-netty&lt;/td&gt;
					&lt;td&gt;github.com/zpsw/jt808-netty&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt808-tcp-netty&lt;/td&gt;
					&lt;td&gt;github.com/rjli/jt808-tcp-netty&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt808-server&lt;/td&gt;
					&lt;td&gt;github.com/yezhihao/jt808-server&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JT808&lt;/td&gt;
					&lt;td&gt;github.com/SmallChi/JT808&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt-808-protocol&lt;/td&gt;
					&lt;td&gt;github.com/hylexus/jt-808-protocol&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;jt-framework&lt;/td&gt;
					&lt;td&gt;github.com/hylexus/jt-framework&lt;/td&gt;
					&lt;td&gt;车载定位&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;mybatis-plus-samples&lt;/td&gt;
					&lt;td&gt;github.com/baomidou/mybatis-plus-samples&lt;/td&gt;
					&lt;td&gt;MyBatisPlus 例子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;cjs-oauth2-sso-demo&lt;/td&gt;
					&lt;td&gt;github.com/chengjiansheng/cjs-oauth2-sso-demo&lt;/td&gt;
					&lt;td&gt;单点登录&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-boot-security-oauth2-jwt&lt;/td&gt;
					&lt;td&gt;github.com/anthonyfoulfoin/spring-boot-security-oauth2-jwt&lt;/td&gt;
					&lt;td&gt;Spring Security&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Auth-service&lt;/td&gt;
					&lt;td&gt;github.com/keets2012/Auth-service&lt;/td&gt;
					&lt;td&gt;授权服务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mybatis-PageHelper&lt;/td&gt;
					&lt;td&gt;github.com/pagehelper/Mybatis-PageHelper&lt;/td&gt;
					&lt;td&gt;分页&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-cloud-examples&lt;/td&gt;
					&lt;td&gt;github.com/ityouknow/spring-cloud-examples&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;simplemall&lt;/td&gt;
					&lt;td&gt;github.com/maventalker/simplemall&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;paascloud-master&lt;/td&gt;
					&lt;td&gt;github.com/paascloud/paascloud-master&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-cloud-microservice-examples&lt;/td&gt;
					&lt;td&gt;github.com/zpng/spring-cloud-microservice-examples&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="62-协议类车载物联网"&gt;6.2 协议类（车载/物联网）
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;重点关注&lt;/strong&gt;：国内 JT/T 808 协议（交通部车载终端通讯协议）和 JT/T 1078 协议（车载视频传输协议）是车联网行业的核心协议。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="七学习路线"&gt;七、学习路线
&lt;/h2&gt;&lt;h3 id="71-入门"&gt;7.1 入门
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;地址&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;wuyouzhuguli/SpringAll&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;github.com/wuyouzhuguli/SpringAll&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Spring 全家桶学习&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;websocketWithNetty&lt;/td&gt;
					&lt;td&gt;github.com/Siwash/websocketWithNetty&lt;/td&gt;
					&lt;td&gt;Netty + WebSocket&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;m3u8Download&lt;/td&gt;
					&lt;td&gt;github.com/qq494257084/m3u8Download&lt;/td&gt;
					&lt;td&gt;m3u8 视频下载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Netty-study&lt;/td&gt;
					&lt;td&gt;github.com/xuwujing/Netty-study&lt;/td&gt;
					&lt;td&gt;Netty&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;netty-4-user-guide-demos&lt;/td&gt;
					&lt;td&gt;github.com/waylau/netty-4-user-guide-demos&lt;/td&gt;
					&lt;td&gt;Netty 实战&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;essential-netty-in-action&lt;/td&gt;
					&lt;td&gt;github.com/waylau/essential-netty-in-action&lt;/td&gt;
					&lt;td&gt;Netty 实战&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;netty-learning-example&lt;/td&gt;
					&lt;td&gt;github.com/sanshengshui/netty-learning-example&lt;/td&gt;
					&lt;td&gt;Netty&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CookBook&lt;/td&gt;
					&lt;td&gt;github.com/Byron4j/CookBook&lt;/td&gt;
					&lt;td&gt;综合资料&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;toBeTopJavaer&lt;/td&gt;
					&lt;td&gt;github.com/hollischuang/toBeTopJavaer&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Java 成神之路&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;advanced-java&lt;/td&gt;
					&lt;td&gt;github.com/doocs/advanced-java&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;互联网 Java 进阶&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;java-design-patterns&lt;/td&gt;
					&lt;td&gt;github.com/iluwatar/java-design-patterns&lt;/td&gt;
					&lt;td&gt;设计模式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JavaGuide&lt;/td&gt;
					&lt;td&gt;github.com/Snailclimb/JavaGuide&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Java 学习+面试&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;CS-Notes&lt;/td&gt;
					&lt;td&gt;github.com/CyC2018/CS-Notes&lt;/td&gt;
					&lt;td&gt;综合资料&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Spring-Boot-In-Action&lt;/td&gt;
					&lt;td&gt;github.com/hansonwang99/Spring-Boot-In-Action&lt;/td&gt;
					&lt;td&gt;Spring Boot 实战&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringBootLearning&lt;/td&gt;
					&lt;td&gt;github.com/gf-huanchupk/SpringBootLearning&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-boot-examples&lt;/td&gt;
					&lt;td&gt;github.com/ityouknow/spring-boot-examples&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;springboot-learning-example&lt;/td&gt;
					&lt;td&gt;github.com/JeffLi1993/springboot-learning-example&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;springBoot&lt;/td&gt;
					&lt;td&gt;github.com/527515025/springBoot&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;spring-boot-student&lt;/td&gt;
					&lt;td&gt;github.com/wyh-spring-ecosystem-student/spring-boot-student&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DesignPattern&lt;/td&gt;
					&lt;td&gt;github.com/youlookwhat/DesignPattern&lt;/td&gt;
					&lt;td&gt;设计模式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringCloud-Learning&lt;/td&gt;
					&lt;td&gt;github.com/dyc87112/SpringCloud-Learning&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SpringCloudLearning&lt;/td&gt;
					&lt;td&gt;github.com/forezp/SpringCloudLearning&lt;/td&gt;
					&lt;td&gt;Spring Cloud&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="八框架"&gt;八、框架
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;quartz&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;作业调度框架&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;spring-framework&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring 框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;spring-boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;spring-cloud-alibaba&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Spring Cloud Alibaba&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;mybatis-spring-boot-starter&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;MyBatis Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;influxdb-java&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;InfluxDB 客户端&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;grpc-spring-boot-starter&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;gRPC Spring Boot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;zxing&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;二维码处理&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;netty&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Netty&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;moqui-framework&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;企业应用框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;auth0/java-jwt&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JWT&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;jwtk/jjwt&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;JWT&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="九工具"&gt;九、工具
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;名称&lt;/th&gt;
					&lt;th&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;skylot/jadx&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;反编译&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;aliyun/aliyun-openapi-java-sdk&lt;/td&gt;
					&lt;td&gt;阿里云 SDK&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;alibaba/easyexcel&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Excel 解析&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;alibaba/arthas&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;Java 诊断工具&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;apache/shardingsphere&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;分库分表&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zouzg/mybatis-generator-gui&lt;/td&gt;
					&lt;td&gt;代码生成器 GUI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;liyiorg/weixin-popular&lt;/td&gt;
					&lt;td&gt;微信公众号 SDK&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Javen205/IJPay&lt;/td&gt;
					&lt;td&gt;支付 SDK&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="十选型决策树"&gt;十、选型决策树
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[需要搭建后台] --&gt; B{业务复杂度?}
 B --&gt;|低/中等| C{需要低代码?}
 B --&gt;|高/复杂| D[微服务脚手架]

 C --&gt;|是| E[jeecg-boot]
 C --&gt;|否| F{需要微服务?}
 F --&gt;|否| G[eladmin / pig 单体版]
 F --&gt;|是| D

 D --&gt; H{组织规模?}
 H --&gt;|10-50人| I[pig / SpringBlade]
 H --&gt;|50-200人| J[lamp-cloud / Dante Cloud]
 H --&gt;|200+| K[自研 + Dromara 工具集]&lt;/pre&gt;&lt;h2 id="十一写在最后"&gt;十一、写在最后
&lt;/h2&gt;&lt;p&gt;国内 Java 脚手架生态已经非常成熟——&lt;strong&gt;对于 80% 的中小企业业务，不需要从零搭建&lt;/strong&gt;。&lt;strong&gt;关键是选对一款 + 二次开发 + 持续升级&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;个人建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;新项目起步&lt;/strong&gt;：&lt;code&gt;eladmin&lt;/code&gt;（学习成本低）/ &lt;code&gt;pig&lt;/code&gt;（微服务 + 业务组件）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;政府/国企&lt;/strong&gt;：&lt;code&gt;jeecg-boot&lt;/code&gt;（工作流 + 表单设计）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企业级 SaaS&lt;/strong&gt;：&lt;code&gt;lamp-cloud&lt;/code&gt;（完整微服务 + 工具集）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多端开发&lt;/strong&gt;：&lt;code&gt;SpringBlade&lt;/code&gt;（Web + App + 小程序）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具类需求&lt;/strong&gt;：先看 &lt;a class="link" href="https://hutool.cn" target="_blank" rel="noopener"
 &gt;Hutool&lt;/a&gt; / &lt;a class="link" href="https://sa-token.cc" target="_blank" rel="noopener"
 &gt;Sa-Token&lt;/a&gt; / &lt;a class="link" href="https://forest.dtflyx.com/" target="_blank" rel="noopener"
 &gt;Forest&lt;/a&gt; 等 Dromara 工具&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="十二2024-视角jdk-2122spring-boot-3-与-dromara-新生态"&gt;十二、2024+ 视角：JDK 21/22、Spring Boot 3 与 Dromara 新生态
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本文写于 2024 年 9 月，下面的&amp;quot;2024+ 视角&amp;quot;补全到 2025-2026 的最新状态——JDK 21 LTS、Spring Boot 3.x、Dromara 组织升级、sa-token 1.40+ 等关键变化。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="121-jdk-21-lts-改变了脚手架技术栈的地板"&gt;12.1 JDK 21 LTS 改变了脚手架技术栈的&amp;quot;地板&amp;quot;
&lt;/h3&gt;&lt;p&gt;2024 年 9 月 &lt;a class="link" href="https://openjdk.org/projects/jdk/21/" target="_blank" rel="noopener"
 &gt;JDK 21&lt;/a&gt; 是 LTS（Next LTS），对国内 Java 脚手架生态影响最直接的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Virtual Thread（虚拟线程）&lt;/strong&gt;——&lt;code&gt;pig&lt;/code&gt;、&lt;code&gt;lamp-cloud&lt;/code&gt; 这类微服务脚手架的网关层，从 Netty 切换到原生虚拟线程，&lt;strong&gt;QPS 提升 30%-50%&lt;/strong&gt; 在 2025 年成为现实&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generational ZGC&lt;/strong&gt; 成为默认 GC 选项——&lt;code&gt;eladmin&lt;/code&gt; 这类后台管理在 4C8G 机器上的 GC pause 从 50ms 降到 &amp;lt;5ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pattern Matching for switch&lt;/strong&gt; / &lt;strong&gt;Record Patterns&lt;/strong&gt;——&lt;code&gt;RuoYi-Vue-Plus&lt;/code&gt; 等脚手架的 DTO 转换代码减少 40%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;spring-boot-3.2+&lt;/code&gt;&lt;/strong&gt; 才完整支持 JDK 21，&lt;strong&gt;2024 下半年是&amp;quot;Spring Boot 2.7 + JDK 8&amp;quot; 老项目迁移的关键窗口期&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到 2025 年下半年，&lt;a class="link" href="https://dromara.org/zh/about/" target="_blank" rel="noopener"
 &gt;Dromara 官方&lt;/a&gt; 仓库里已经&lt;strong&gt;默认要求 JDK 17+&lt;/strong&gt;，完全抛弃 JDK 8 是这 12 个月内发生的。&lt;/p&gt;
&lt;h3 id="122-dromara-组织-2024-2025-关键变化"&gt;12.2 Dromara 组织 2024-2025 关键变化
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sa-Token&lt;/strong&gt;：从 1.44 升级到 1.40+ → 1.42+ → 1.44+（v1.44.0 加入了 OAuth2.0 / OIDC 完整支持），&lt;strong&gt;国内 Java 权限认证的事实标准地位进一步稳固&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hutool 5.8.x&lt;/strong&gt;：发布 5.8.27+ 版本，&lt;strong&gt;Crypto 模块支持国产 SM2/SM3/SM4 算法&lt;/strong&gt;——等保 2.0 三级合规场景刚需&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forest 1.5.x&lt;/strong&gt;：声明式 HTTP 客户端，集成 Spring Boot 3.x 与虚拟线程，&lt;strong&gt;在国内金融、政企项目的&amp;quot;自研 RPC 替代品&amp;quot;角色越来越重&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DynamicTp 1.1.x&lt;/strong&gt;：动态线程池，集成 Prometheus + Grafana 模板，&lt;strong&gt;&amp;ldquo;线程池可观测&amp;quot;成了面试标配&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cube / Gobrs-Async&lt;/strong&gt;：从&amp;quot;小众实验&amp;quot;走向&amp;quot;中等规模服务编排首选&amp;rdquo;——主要是 Dromara 官方文档在 2024 年大改版&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dante Cloud&lt;/strong&gt;：升级到 Spring Authorization Server 全家桶（替代 Shiro），&lt;strong&gt;成为 Dromara 体系里对接 OAuth2.1 / OIDC 最完整的脚手架&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：Dromara 在 2024-2025 年的本质变化是**&amp;ldquo;工具集 → 一站式企业套件&amp;rdquo;**——&lt;code&gt;pig&lt;/code&gt; + &lt;code&gt;Hutool&lt;/code&gt; + &lt;code&gt;Sa-Token&lt;/code&gt; + &lt;code&gt;Forest&lt;/code&gt; + &lt;code&gt;DynamicTp&lt;/code&gt; 这套组合在国内 90% 的中小项目里可以&amp;quot;开箱即用&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="123-spring-boot-3x-迁移脚手架的分水岭"&gt;12.3 Spring Boot 3.x 迁移：脚手架的&amp;quot;分水岭&amp;quot;
&lt;/h3&gt;&lt;p&gt;2024 年下半年到 2025 年，&lt;strong&gt;国内脚手架的&amp;quot;分水岭&amp;quot;是 Spring Boot 3.x 迁移&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;脚手架&lt;/th&gt;
					&lt;th&gt;Spring Boot 3.x 支持&lt;/th&gt;
					&lt;th&gt;状态（2025）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;jeecg-boot&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;3.7+ / 4.0（Vue3 + Ant Design Vue4）&lt;/td&gt;
					&lt;td&gt;官方主推&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;pig&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;4.x 全系列&lt;/td&gt;
					&lt;td&gt;稳定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;lamp-cloud&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5.x Vben 5&lt;/td&gt;
					&lt;td&gt;稳定&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;eladmin&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;2.7+ 社区版&lt;/td&gt;
					&lt;td&gt;用户最多&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;SpringBlade&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;升级慢，部分团队 fork 自维护&lt;/td&gt;
					&lt;td&gt;关注度下降&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;COLA&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;4.0（COLA 5 架构 + Archetype）&lt;/td&gt;
					&lt;td&gt;阿里内部仍在用&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;踩坑点&lt;/strong&gt;（2024-2025 真实经验）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;javax → jakarta 命名空间&lt;/strong&gt;——所有自定义 starter 必须重写包名，老 starter 一夜失效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring Security 6 lambda DSL&lt;/strong&gt;——&lt;code&gt;http.authorizeRequests()&lt;/code&gt; 废弃，必须用 &lt;code&gt;http.authorizeHttpRequests()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MyBatis-Plus 3.5.7+&lt;/strong&gt; 才完整支持 Spring Boot 3.x，老版本 3.5.3.x 报 &lt;code&gt;ClassNotFoundException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nacos 2.3+&lt;/strong&gt; 才完整支持 Spring Boot 3.x 配置注册中心&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="124-选型补充2025-年的快速判断表"&gt;12.4 选型补充：2025 年的&amp;quot;快速判断表&amp;quot;
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;业务场景&lt;/th&gt;
					&lt;th&gt;2024 推荐&lt;/th&gt;
					&lt;th&gt;2025 调整&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;快速交付后台&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;jeecg-boot&lt;/td&gt;
					&lt;td&gt;jeecg-boot 4.0（Vue3） / eladmin 2.7+&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;微服务起步&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;pig&lt;/td&gt;
					&lt;td&gt;pig 4.x（已迁 Spring Boot 3）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;企业级 SaaS&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;lamp-cloud&lt;/td&gt;
					&lt;td&gt;lamp-cloud 5.x（Vben 5 + Spring Authorization Server）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;多端开发&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;SpringBlade&lt;/td&gt;
					&lt;td&gt;关注度下降，可考虑 pig uniapp 版&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;AI 时代内部工具&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;通用脚手架&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;FastGPT / Dify / n8n 这类 LLM 工作流平台&lt;/strong&gt;——传统后台管理正在被 AI 工作流平台挤压&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="125-个人随笔脚手架的尽头是平台化"&gt;12.5 个人随笔：脚手架的&amp;quot;尽头&amp;quot;是平台化
&lt;/h3&gt;&lt;p&gt;从 2024 写到 2026，回看本文的判断基本对——&lt;strong&gt;脚手架赛道的尽头不是&amp;quot;更好的脚手架&amp;quot;，而是&amp;quot;AI 时代的工作流平台&amp;quot;&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统脚手架&lt;/strong&gt;（jeecg-boot、pig、lamp-cloud）：做&amp;quot;表单 + 流程 + 报表&amp;quot;——这些在 2025 年还有市场，但增速放缓&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 工作流平台&lt;/strong&gt;（Dify、FastGPT、Coze）：做&amp;quot;自然语言 + 工具调用 + 知识库&amp;quot;——这是 2025-2026 的新增长极&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;融合形态&lt;/strong&gt;：jeecg-boot 在 4.0 版本加入了 AI 助手（基于本地 LLM），pig 4.x 内置 Flowable + AI 节点——&lt;strong&gt;老牌脚手架正在加 AI 能力应对冲击&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;5 年前选脚手架 = 选 Vue 模板 + Spring Boot 框架；&lt;strong&gt;2 年后选脚手架 = 选 AI 集成 + 工作流引擎 + 权限体系&lt;/strong&gt;。这是 2024 看不到但 2026 已经清晰的方向。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://dromara.org/zh/about/" target="_blank" rel="noopener"
 &gt;Dromara 组织&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/akullpp/awesome-java" target="_blank" rel="noopener"
 &gt;awesome-java 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Snailclimb/JavaGuide" target="_blank" rel="noopener"
 &gt;javaguide 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/hollischuang/toBeTopJavaer" target="_blank" rel="noopener"
 &gt;toBeTopJavaer 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/doocs/advanced-java" target="_blank" rel="noopener"
 &gt;advanced-java 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://openjdk.org/projects/jdk/21/" target="_blank" rel="noopener"
 &gt;JDK 21 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://spring.io/blog/2023/11/23/spring-boot-3-2-ga-released" target="_blank" rel="noopener"
 &gt;Spring Boot 3.2 迁移指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sa-token.cc/doc.html#/oauth2/oauth2-introduce" target="_blank" rel="noopener"
 &gt;Sa-Token 1.44+ OAuth2.0 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://doc.hutool.cn/pages/index/" target="_blank" rel="noopener"
 &gt;Hutool 5.8.x 国产算法支持&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>FSS 全栈脚手架：pnpm + turbo + husky + lint-staged 实战</title><link>https://liangweidonggood.github.io/p/fss-quan-zhan-jiao-shou-jia-2020/</link><pubDate>Wed, 15 Apr 2020 00:00:00 +0800</pubDate><guid>https://liangweidonggood.github.io/p/fss-quan-zhan-jiao-shou-jia-2020/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/fss-quan-zhan-jiao-shou-jia-2020/image/cover.jpg" alt="Featured image of post FSS 全栈脚手架：pnpm + turbo + husky + lint-staged 实战" /&gt;&lt;h2 id="什么是-fss"&gt;什么是 FSS
&lt;/h2&gt;&lt;p&gt;FSS（Full-Stack Scaffold）= 一套&lt;strong&gt;多端共享代码&lt;/strong&gt;的全栈项目脚手架，结构：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fss/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── apps/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── app/ # PC 端
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── desktop/ # 桌面端（Tauri）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── mini-program/ # 小程序
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── web/ # 移动端 Web
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── packages/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── ui/ # 公共 UI 组件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── utils/ # 公共工具
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── global/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── config/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── proto/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── scripts/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;核心技术栈：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;包管理&lt;/strong&gt;：pnpm（快、节省磁盘）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建编排&lt;/strong&gt;：turbo（增量构建、任务编排）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码规范&lt;/strong&gt;：ESLint + Prettier + Stylelint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 钩子&lt;/strong&gt;：husky + lint-staged + commitlint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI 框架&lt;/strong&gt;：Ant Design + Pro Components&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="初始化"&gt;初始化
&lt;/h2&gt;&lt;h3 id="1-创建根-packagejson"&gt;1. 创建根 package.json
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; fss
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-创建-pnpm-workspaceyaml"&gt;2. 创建 pnpm-workspace.yaml
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# pnpm-workspace.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;apps/*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;packages/*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;global/*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-创建-turbojson"&gt;3. 创建 turbo.json
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;$schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://turbo.build/schema.json&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;globalDependencies&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;**/.env.*local&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.env&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;globalEnv&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;NODE_ENV&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;pipeline&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dependsOn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;^build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dist/**&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.next/**&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;!.next/cache/**&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;persistent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;lint&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dependsOn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;^build&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;coverage/**&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="4-安装依赖"&gt;4. 安装依赖
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -D -w &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @eslint/js &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; eslint &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; eslint-plugin-react &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; eslint-plugin-react-hooks &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; eslint-plugin-react-refresh &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; globals &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; typescript-eslint &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @typescript-eslint/eslint-plugin &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @typescript-eslint/parser &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stylelint &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stylelint-config-standard &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stylelint-config-recess-order &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stylelint-scss &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stylelint-less &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postcss-less &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; husky &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lint-staged &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; prettier
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# commitlint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -D -w @commitlint/cli @commitlint/config-conventional
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="5-创建各端"&gt;5. 创建各端
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建一个 PC 端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; apps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir app &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm create vite admin-pc --template react-ts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 移除默认 ESLint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm remove -D @eslint/js eslint eslint-plugin-react-hooks &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; eslint-plugin-react-refresh globals typescript-eslint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="eslint--prettier-统一"&gt;ESLint + Prettier 统一
&lt;/h2&gt;&lt;h3 id="eslintrccjs根目录"&gt;&lt;code&gt;.eslintrc.cjs&lt;/code&gt;（根目录）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;es2022&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;eslint:recommended&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;plugin:@typescript-eslint/recommended&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;plugin:react/recommended&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;plugin:react-hooks/recommended&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;prettier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@typescript-eslint/parser&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@typescript-eslint&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react-hooks&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;react/react-in-jsx-scope&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;@typescript-eslint/no-unused-vars&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;warn&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;argsIgnorePattern&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;^_&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="prettierrc"&gt;&lt;code&gt;.prettierrc&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;printWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tabWidth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;useTabs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;singleQuote&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trailingComma&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;bracketSpacing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;arrowParens&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;always&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="stylelintrccjs"&gt;&lt;code&gt;.stylelintrc.cjs&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;stylelint-config-standard&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;stylelint-config-recess-order&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;no-descending-specificity&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;selector-class-pattern&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="husky--lint-staged"&gt;husky + lint-staged
&lt;/h2&gt;&lt;h3 id="启用-husky"&gt;启用 husky
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm run prepare
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky add .husky/pre-commit &lt;span class="s2"&gt;&amp;#34;npx lint-staged&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="lintstagedrcjson"&gt;&lt;code&gt;.lintstagedrc.json&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;*.{ts,tsx,js,jsx}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;eslint --fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;prettier --write&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;*.{css,scss,less}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;stylelint --fix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;prettier --write&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;*.{json,md}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;prettier --write&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="commitlint"&gt;commitlint
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// commitlint.config.js
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;extends&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;@commitlint/config-conventional&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;type-enum&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;feat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fix&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;style&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;refactor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;perf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;chore&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;revert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;subject-max-length&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;always&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx husky add .husky/commit-msg &lt;span class="s1"&gt;&amp;#39;npx --no -- commitlint --edit &amp;#34;$1&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;提交示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;feat: 添加用户管理模块&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;fix(auth): 修复 token 过期跳转&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="turbo-命令"&gt;turbo 命令
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;turbo --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 执行所有子项目的 build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm turbo run build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 执行指定子项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm turbo run dev --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 所有子项目构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm turbo run build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 代码校验&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm turbo run lint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 单元测试&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm turbo run &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="子项目依赖管理"&gt;子项目依赖管理
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 给指定子项目加 antd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add antd --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 路由&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add react-router --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 状态管理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add @reduxjs/toolkit react-redux --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CSS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -D unocss --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add @unocss/reset --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add @unocss/preset-wind3 --filter&lt;span class="o"&gt;=&lt;/span&gt;admin-pc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="ui-共享包packagesui"&gt;UI 共享包（packages/ui）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; packages
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ui &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ui
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 装 antd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add antd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -D @types/react @types/react-dom react react-dom
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;packages/ui/src/index.ts&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./Button&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kr"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./Table&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 admin-pc 引用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// apps/admin-pc/src/App.tsx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Table&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;@fss/ui&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="desktop-子项目tauri--react"&gt;desktop 子项目（Tauri + React）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; apps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir desktop &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; desktop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 初始化 pnpm workspace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# pnpm-workspace.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;../app&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 加 Tauri CLI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -D @tauri-apps/cli@latest -w
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 初始化 Tauri&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm tauri init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;开发：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm tauri dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;打包：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm tauri build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="全局目录global"&gt;全局目录（global/）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;global/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── config/ # 通用配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── eslint/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── stylelint/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── prettier/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── proto/ # Protobuf 定义
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── scripts/ # 构建脚本
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="性能优化"&gt;性能优化
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;turbo 远程缓存&lt;/strong&gt;：&lt;code&gt;turbo.json&lt;/code&gt; 加 &lt;code&gt;remoteCache: { teamSlug: &amp;quot;...&amp;quot;, token: &amp;quot;...&amp;quot; }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pnpm 设置&lt;/strong&gt;：&lt;code&gt;~/.npmrc&lt;/code&gt; 加 &lt;code&gt;auto-install-peers=true&lt;/code&gt; / &lt;code&gt;strict-peer-dependencies=false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建缓存&lt;/strong&gt;：&lt;code&gt;outputs: [&amp;quot;dist/**&amp;quot;, &amp;quot;.next/**&amp;quot;]&lt;/code&gt; 命中增量&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="下一步"&gt;下一步
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;想把 PC 端 + 移动端用一套代码覆盖，看 2021-07-15《PC 前端技术选型》&lt;/li&gt;
&lt;li&gt;想用 Tauri 2.x 替代 Electron，看 2020-05-15《Tauri 2.x 跨平台桌面应用》&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;pnpm workspace：https://pnpm.io/workspaces&lt;/li&gt;
&lt;li&gt;Turborepo 文档：https://turbo.build/repo/docs&lt;/li&gt;
&lt;li&gt;husky：https://typicode.github.io/husky/&lt;/li&gt;
&lt;li&gt;lint-staged：https://github.com/lint-staged/lint-staged&lt;/li&gt;
&lt;li&gt;Ant Design：https://ant.design/&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>