代码维护太费劲?整洁架构实操指南:中小团队3步落地的实战技巧

代码维护太费劲?整洁架构实操指南:中小团队3步落地的实战技巧 一

文章目录CloseOpen

今天就把这套中小前端团队专属的整洁架构落地方法分享给你,不用推翻重写,3步就能上手,亲测对10人以内团队特别有效。

为什么中小前端团队更需要“轻量级”整洁架构

提到“整洁架构”,你可能会觉得是大厂才玩的东西——一堆复杂的分层、严格的依赖规则,小团队哪有精力搞这些?其实恰恰相反,中小团队抗风险能力弱,一旦代码变成“乱麻”,重构成本比大厂高得多。我见过不少小团队因为代码太乱,最后不得不推翻重写,半年工期全白费,这才是最可惜的。

传统的整洁架构(比如Robert C. Martin提出的六边形架构)确实有门槛,它要求严格的分层(实体层、用例层、接口适配层、外部接口层)和单向依赖规则,对前端来说,直接套用容易变成“过度设计”。但这两年我带小团队实践时发现,只要做“轻量化改造”,保留核心思想,去掉冗余规范,中小前端团队完全能驾驭。

举个例子:我之前合作的一个电商前端团队,3个人维护小程序和H5商城。他们早期为了赶进度,把商品列表、购物车、下单逻辑全塞在页面组件里,连API请求都直接写在methods里。后来要加“满减优惠”功能,改购物车计算逻辑时,不小心把商品库存判断的代码删了,上线后用户能下单“负库存”商品,紧急回滚才没造成损失。这种问题,本质就是业务逻辑和技术细节没分开,就像把发动机和外壳焊死了,想换零件就得拆整体。

而“轻量级整洁架构”的核心就是解决这个问题:把“变的部分”和“不变的部分”拆开。前端里,UI样式、接口调用这些是“易变的技术细节”,而购物车计算、订单状态流转这些是“稳定的业务核心”。只要把后者抽离出来单独维护,不管外面的UI框架从Vue2升到Vue3,还是API从Axios换成Fetch,核心逻辑都不用动——这就是整洁架构最厉害的地方。

Martin Fowler在他的博客里提到过“演进式架构”(链接{rel=”nofollow”}),意思是不用追求一步到位,小步优化反而更适合中小团队。我特别认同这个观点,前端整洁架构落地也一样,别想着一次改完所有模块,每周优化一个核心功能,两个月就能看到明显变化。

中小前端团队落地整洁架构的3个实操步骤

第一步:用“3问诊断法”找到代码的“混乱根源”

在动手改造前,你得先知道问题出在哪。我 了一套“3问诊断法”,帮你快速定位代码里的“边界模糊点”,中小团队不用专门搞架构评审,开发自己花10分钟就能做。

第一问:这个组件/函数,能不能用一句话说清它“到底是干什么的”?

比如一个叫handleOrderSubmit的函数,如果它既要调接口、又要处理表单验证、还要更新本地缓存,那肯定有问题。我之前见过一个叫renderUserInfo的函数,里面竟然包含了“请求用户数据→格式化生日日期→判断会员等级→渲染头像和昵称”,这就像让一个厨师既要买菜、又要炒菜、还要洗碗,不乱才怪。 第二问:如果换个UI框架(比如从React换成Vue),这部分代码需要改多少? 真正的业务核心逻辑,应该和UI框架无关。我带团队做诊断时,会特意看那些“长得像工具函数但又依赖框架API”的代码,比如Vue项目里用this.$store的工具函数,或者React里用useState的业务逻辑——这些都是典型的“技术细节入侵核心逻辑”,换框架时绝对要重写。 第三问:删了这部分代码,系统还能跑通核心业务流程吗? 比如电商系统的“购物车计算价格”逻辑,如果删了它,用户就没法下单,这就是“核心业务代码”;而“列表下拉加载动画”删了,系统照样能用,这就是“非核心技术细节”。你可以在项目里建个文档,把所有核心业务逻辑列出来,标红那些“混在技术细节里的核心代码”,这就是优先改造的目标。

诊断完后,你可能会发现80%的混乱都来自“核心业务逻辑和技术细节耦合”。我去年帮那个SaaS团队诊断时,他们的“权限校验逻辑”竟然写在路由守卫里,还混杂了localStorage操作和菜单渲染逻辑,后来把这部分抽离成独立的核心模块,光权限相关的bug就少了70%。

第二步:按“三层洋葱模型”渐进式拆分代码

找到了问题,接下来就是拆分代码。中小团队千万别学大厂搞“五层架构”,我 的“三层洋葱模型”更实用:核心层(业务逻辑)、适配层(技术细节)、表现层(UI渲染),像洋葱一样从里到外依赖,核心层不依赖任何外层,外层可以依赖核心层。

核心层:只放“纯业务逻辑”,像数学公式一样“只算不调”

这一层是架构的“心脏”,只包含业务规则和实体模型,不能有任何框架API、第三方库调用或副作用代码。比如电商系统的“订单价格计算”,你可以新建src/core/order/priceCalculator.js,里面只写纯函数:

// 核心层代码示例:纯业务逻辑,不依赖任何外部API

export function calculateOrderPrice(goodsList, coupons) {

let total = goodsList.reduce((sum, item) => sum + item.price * item.quantity, 0);

// 应用优惠券逻辑

if (coupons.type === 'fullMinus') {

total = Math.max(total

  • coupons.value, 0);
  • }

    return total;

    }

    你发现没?这里没有axios请求,没有Pinia调用,甚至连日期格式化都不用——因为这些都是“技术细节”,要放在外面的适配层。我带团队时,要求核心层代码必须通过“纯函数测试”:给固定输入,必须返回固定输出,像数学公式一样可靠。

    适配层:帮核心层“对接外部世界”,做“翻译官”

    核心层不能调接口、操作缓存,那数据从哪来?适配层就是干这个的。比如要获取商品列表,你可以建src/adapters/api/goodsApi.js,专门处理API请求和数据转换,再把“干净数据”传给核心层:

    // 适配层代码示例:处理技术细节,给核心层提供干净数据
    

    import axios from 'axios';

    export async function fetchGoodsList(params) {

    const res = await axios.get('/api/goods', { params });

    // 转换API返回格式,只保留核心层需要的字段

    return res.data.map(item => ({

    id: item.goodsId,

    name: item.goodsName,

    price: Number(item.salePrice),

    quantity: 1 // 默认数量

    }));

    }

    我 适配层按“技术类型”拆分:api(接口调用)、store(状态管理)、cache(缓存操作)、utils(技术工具),这样换技术方案时,比如把axios换成fetch,只改api目录下的代码就行,核心层完全不用动。

    表现层:只负责“把数据变成界面”,不做决策

    最后是我们最熟悉的页面组件,这一层要做“减法”:只接收数据、渲染UI、处理用户交互,把业务决策交给核心层。比如Vue组件可以这样写:

    <!-
  • 表现层代码示例:只渲染和交互,不处理业务逻辑 >
  • 总价:{{ totalPrice }}元

    import { ref } from 'vue';

    import { fetchGoodsList } from '@/adapters/api/goodsApi';

    import { calculateOrderPrice } from '@/core/order/priceCalculator';

    const totalPrice = ref(0);

    // 组件只做:调用适配层拿数据 → 传给核心层计算 → 渲染结果

    async function loadOrderData() {

    const goodsList = await fetchGoodsList({ userId: 123 });

    totalPrice.value = calculateOrderPrice(goodsList, currentCoupon);

    }

    // 用户交互只触发动作,不处理逻辑

    function handleApplyCoupon() {

    // 调用核心层判断优惠券是否可用,结果返回后再更新UI

    const isAvailable = checkCouponAvailable(currentCoupon, goodsList);

    if (isAvailable) loadOrderData();

    }

    我之前那个团队按这个模型拆分后,一个复杂订单页面的组件代码从1800行减到了600行,90%的业务逻辑都移到了核心层,新人接手时再也不用“猜代码意图”了。

    第三步:用“最小规则集”守住架构边界

    拆分完代码不是结束,最怕过两个月又回到老样子。中小团队不用搞复杂的架构治理,我 了3条“最小规则”,用ESLint和代码评审就能落地,亲测能让架构“不反弹”。

    规则1:核心层禁止导入适配层和表现层的代码

    这是整洁架构的“铁律”。你可以在项目根目录建.eslintrc.js,加一条自定义规则:

    // ESLint规则示例:禁止核心层导入外层代码
    

    module.exports = {

    rules: {

    'no-core-import-outer': [

    'error',

    {

    coreDir: 'src/core',

    outerDirs: ['src/adapters', 'src/views', 'src/components']

    }

    ]

    }

    };

    我带团队时,刚开始每周都有2-3次触发这个规则的提交,后来大家慢慢养成了“核心层只写纯逻辑”的习惯,一个月后基本就不触发了。

    规则2:业务逻辑变更时,优先改核心层,不动表现层

    比如要加“满200减30”的优惠规则,只改core/order/priceCalculator.js,不用动任何页面组件。我之前那个电商团队,加新优惠规则时,按这个规则改核心层,上线只用了1小时,比之前改组件快了5倍,还没出bug。

    规则3:每个核心模块配“单测保镖”

    核心层代码是业务的“命根子”,一定要写单元测试。不用追求100%覆盖率,把核心函数(比如价格计算、权限判断)的测试写好就行。我 用Jest写测试,比如给价格计算函数写测试:

    // 核心层单元测试示例
    

    import { calculateOrderPrice } from '@/core/order/priceCalculator';

    test('满200减30优惠计算正确', () => {

    const goodsList = [{ price: 150, quantity: 2 }]; // 总价300

    const coupon = { type: 'fullMinus', value: 30, condition: 200 };

    expect(calculateOrderPrice(goodsList, coupon)).toBe(270);

    });

    有了单测,改核心逻辑时心里就有底,不用担心“改A坏B”。

    如果你觉得这些规则太麻烦,可以先从“每周架构小会”开始,团队一起看3个上周改的文件,讨论“有没有遵守分层规则”,两个月就能形成肌肉记忆。

    你可能会说“我们团队太忙,没时间搞这些”。其实我带的团队都是“边迭代边优化”,比如做新功能时,顺手把相关的核心逻辑拆到core目录;改bug时,顺便检查是不是分层出了问题。就像整理房间,每天收拾10分钟,总比半年大扫除轻松。

    如果你团队也有代码越写越乱的问题,不妨先从“3问诊断法”开始,挑一个最头疼的组件按“三层洋葱模型”拆分层,试完记得回来告诉我效果怎么样!


    其实啊,10人以上团队用这套轻量级方法完全没问题,就是得根据团队规模稍微“加码”,但核心思路——“业务逻辑和技术细节分开”——肯定不能丢。你想想,团队从5个人涨到15个人,原来3个人互相喊一嗓子就知道代码咋写,现在可能分了3个小组,各写各的模块,这时候要是核心层没管好,很容易出现“你改你的,我改我的,最后合起来全是bug”的情况。所以适当加几条规则,不是为了搞复杂,是为了让沟通成本变低。

    我带过18人前端团队时,就遇到过这种情况:核心层的“订单状态流转”逻辑,两个小组各写了一版,上线后发现状态判断冲突,用户付了钱订单还是“待支付”。后来我们在三层洋葱模型基础上,给核心层加了“领域事件”机制——比如订单从“待支付”变成“已支付”时,核心层会抛出一个事件,适配层的库存模块、积分模块自己去监听处理,不用核心层操心具体怎么调接口。这么一改,跨模块通信就清晰多了,15人团队用着特别顺。 人多了代码量也大,我们把核心层拆成独立的npm包(用Monorepo管理,比如pnpm workspace),每个包对应一个业务域(订单域、商品域、用户域),各小组负责自己的域,发布前必须通过核心层的CR评审(Code Review)。像20人团队这么操作,核心层代码质量反而比小团队时更稳定,因为每个人都清楚“这部分是业务核心,得小心改”。

    不过有个原则得记住:千万别一上来就堆10条8条规则。我见过有些团队一到20人就照搬大厂的“架构规范手册”,又是依赖图检查又是分层覆盖率统计,结果大家天天应付规范,没空写业务代码。其实10-20人团队,加2-3条关键规则就够了——比如“核心层必须发版前CR”“跨域通信用领域事件”“独立包版本号跟着业务迭代走”——先把这些跑顺,等团队磨合好了再慢慢优化。毕竟咱们用“轻量级”的初衷就是不想被架构绑架,核心层跑通了,其他都是锦上添花。


    小团队落地整洁架构大概需要多久能看到效果?

    不用等完全改造完,渐进式优化就能逐步见效。我带3人电商团队时,先从最核心的“购物车计算”模块开始拆分,1周就完成了这个模块的三层拆分,改完后当月购物车相关bug就少了40%。通常 每周重点优化1个核心模块,2-3个月能完成80%关键业务逻辑的拆分,这时候新功能开发速度和bug率会有明显改善。

    前端框架是Vue/React/Angular,会影响整洁架构落地吗?

    完全不影响,整洁架构的核心是“业务逻辑与技术细节分离”,和具体框架无关。我实操过Vue2、Vue3、React18的项目,都能用“三层洋葱模型”拆分:核心层纯JavaScript/TypeScript函数(不依赖框架),适配层封装框架API(如Vue的Pinia、React的useState),表现层写组件(Vue单文件、React函数组件)。比如React项目的核心层代码,复制到Vue项目里改改适配层调用,就能直接用。

    既有项目代码很乱,一定要重构才能用整洁架构吗?

    不用推翻重写,“渐进式拆分”才是小团队的正确姿势。可以先按“3问诊断法”找出最混乱的核心模块(比如订单计算、权限校验),只拆分这部分:先把业务逻辑抽成核心层纯函数,再用适配层对接现有API和状态管理,最后改表现层组件调用新的核心层函数。我去年帮SaaS团队改造时,就是从“权限管理”模块开始,没动其他功能,2周就完成了局部优化,完全不影响线上业务。

    整洁架构和平时说的“MVVM架构”有什么区别?

    两者解决的问题不一样:MVVM(Model-View-ViewModel)是“UI层架构”,主要解决视图和数据绑定的问题(比如Vue的data和template联动);而整洁架构是“系统级架构”,关注整个项目的业务逻辑组织,核心是让业务逻辑不依赖UI框架、API工具等技术细节。打个比方,MVVM像“房间怎么摆家具”,整洁架构像“房子的承重墙和隔断怎么设计”,可以一起用——比如用Vue的MVVM做表现层,同时用整洁架构拆分核心业务逻辑。

    团队超过10人,这套“轻量级”方法还适用吗?

    10人以上团队可以适当增加规则,但核心逻辑依然适用。比如15人团队可以在“三层洋葱模型”基础上,给核心层加“领域事件”机制(比如订单状态变更时触发事件,适配层监听事件更新UI),再用Monorepo把核心层拆成独立包管理。我接触过20人前端团队用这个思路,在“最小规则集”里加了“核心层代码必须通过CR评审”,也能稳定落地,关键是别一开始就堆复杂规范,先跑通核心逻辑拆分。

    0
    显示验证码
    没有账号?注册  忘记密码?