低垂的果实早已被摘完。你那些自我感动的“抽象”,AI 不认,队友不认,时间更不认。
一、一个危险的断言
我要说的这句话,可能会刺痛很多人,但它必须被说出来:
在 AI 时代,前端程序员最大的认知误区,就是高估了自己的“封装能力”,而低估了“直接使用”的力量。
我们见过太多这样的场景:
- 一个简单的 API 请求,被套上三层抽象,只为了“万一将来要换请求库”——AI 看了都直摇头,每次给你生成请求代码,都得先去你那屎山一样的
request.ts里品味一番你当年引以为傲的“灵活设计”。 - 一个表单组件,被设计成“万能配置式”,只为了“减少重复代码”——AI 每次想帮你填个表单,都得先解析你那个 400 行的
config对象,最后它选择绕过你的组件,直接操作 DOM。 - 一个状态管理方案,从 Redux 换到 Zustand,再自己封装一层“更优雅”的 API —— 结果 AI 生成的代码一半用你的 API,一半用原生 Zustand,最后运行时炸成一锅粥。
这些行为的背后,有一个共同的幻觉:“我的封装是有价值的,我的抽象是高级的。”
但真相是:前端框架领域的低垂果实,早在 2022 年之前就被摘完了。 你现在做的 90% 的封装,要么是重复造轮子,要么是制造别人看不懂的“智力垃圾”。
而 AI 的到来,只是把这块遮羞布彻底扯了下来。
二、为什么你的“封装”在 AI 时代一文不值?
1. AI 只认识“共识”,不认识“个性”
任何 AI 代码模型(Copilot、Cursor、ChatGPT)的训练数据,都来自公开的、海量的代码库。它们学到的,是 useState、useEffect、fetch、lodash、date-fns 这些标准写法。
它们学不会你的 useAwesomeRequest,学不会你的 SuperFlexTable,更学不会你那套“只有你自己觉得优雅”的抽象层。
结果就是:你越封装,AI 越帮不上忙。 你花了一周设计的“完美抽象”,AI 生成的代码全是在绕过它。最后你只能手动修修补补——你不仅没省力,反而给自己套上了枷锁。
2. 框架的“历史进程”已经终结
这不是悲观,这是事实。
从 jQuery 到 Angular,从 React 到 Vue,从 Hooks 到 Signals——前端框架的每一次范式革命,都伴随着一批“封装红利”。但今天,你还能在 React 19 或 Vue 3.5 里找到什么颠覆性的、未被开垦的封装机会吗?
没有了。
现代框架已经足够聪明:
- 内置了并发渲染、Suspense、流式 SSR
- 官方或社区提供了你所能想到的一切工具库
- 最佳实践已经收敛到 90% 的场景都可以用现成方案
你所谓的“封装创新”,99% 只是在重新排列组合已有的东西。 而排列组合的结果,往往比直接用框架原生能力更差、更慢、更难维护。
3. 看看 Tailwind 和 shadcn/ui 为什么流行?因为它们“克制”
你发现没有,这几年最火的前端工具,恰恰是那些不强迫你使用其抽象的工具。
- Tailwind CSS:它给你原子类,但从不逼你封装成组件。你想怎么组合都行,它不傲慢地说“你必须用我的 Button 组件,我的间距系统是神圣的”。
- shadcn/ui:它直接给你源码,你复制粘贴到自己的项目里,想怎么改就怎么改。它没有那种“别人一定得这么用,一定要用我的 API,不支持某个功能不是我的错误”的天生傲慢。
这两个工具的成功,恰恰反衬出传统封装思维的失败。传统组件库告诉你:“用我的 Table,传一个 columns 和 data,别问为什么不能自定义表头。”——AI 想帮你改个样式,发现你的 Table 组件根本不暴露内部结构,它只能放弃。
好的工具给开发者空间,坏的工具给开发者牢笼。
而你的封装,大概率是后者。
4. 抽象能力不足 + 边界感知缺失 = 灾难
这话很难听,但它是真的。
很多人真正的错误,不是不学习,而是对工具和方法的使用边界毫无感知。
-
今天听说领域驱动设计很酷,明天就把
User、Order、Product拆成聚合根、实体、值对象,层层嵌套——完全不问自己:我这个前端项目到底需不需要领域模型?事务边界在哪里?聚合根要序列化传给后端吗? 没人能回答,但代码里已经躺着一个“前端DDD四件套”。 -
昨天学了函数式编程,今天就把
map、flatMap、fold塞进每一个数组操作里——也不管可读性是否比for循环更差,也不问自己:这个副作用真的被隔离了吗? -
上周刚看完“整洁架构”,这周就搞出了
presentation、application、domain、infrastructure四个文件夹——每个文件夹里只有两个文件,其中一个还是README.md。
他们学了一堆名词:领域驱动、事件风暴、六边形架构、CQRS……但从来没有真正理解过这些方法论是在解决什么问题、需要什么前提、边界在哪里。更不会在落地之后,回头问一句:“我的设计带来收益了吗?有没有更简单的办法?”
结果就是:朝三暮四,学了一堆东西却无一精通。 今天抄后端的分层,明天抄函数式的纯函数,后天抄微前端的隔离——抄到最后,项目成了一个四不像的“学术展览馆”。
你的抽象很抽象!!!
AI 不会拯救这种能力缺失,只会放大它。 因为 AI 可以 30 秒生成一个“看起来合理”的抽象,让你误以为自己很厉害。然后三个月后,这个抽象会成为整个团队不敢动的地雷——连你自己都忘了当初为什么这么设计,但谁也不敢删,因为一删就崩。
真正的能力,不是知道多少种方法论,而是知道什么时候不用它! 以前学习前端如此,之后学习AI相关的功能来辅助编程开发本事亦是如此,不审视不自我批评和迭代,终是一团糟。
三、“少封装”不是倒退,是觉醒
你可能会问:那是不是回到“复制粘贴”的时代?
是的,某种程度上,就是要回归“适度的复制粘贴”。
三条铁律,建议贴在工位上:
-
默认不封装。 除非同一个逻辑在三个完全不同的地方重复出现,并且你能用一句话说清楚它的业务含义。
-
框架有的,直接用。 不要写
useFetch,不要写<Suspense>的二次包装,不要写“增强版”的 Router。框架团队比你聪明,也比你有更多测试。 -
社区成熟的,不要自己造。 日期处理用
date-fns,数据验证用zod,工具函数用lodash。你写的formatDate没有 bug 只是因为没人用过。
唯一允许封装的三类场景:
- 业务领域内真正稳定的概念(比如你们公司的“用户权限判断逻辑”)
- 跨项目复用的 UI 模式(前提是你准备开源,并且有信心维护三年)
- 框架和社区都完全没有的缺口(概率极低,遇到了先搜 npm)
除此之外,停止自我感动。
四、AI 时代的前端能力,不是“更会封装”,而是“更敢不封装”
这是一种新的职业素养,也是一场关于诚实的修行。
说白了就是:一个床上不行的男人,不要硬装,该吃药吃药,正视自己。
你不行就是不行——你写的 useSuperRequest 三天两头出 bug,你设计的“万能表单”换个需求就崩,你封装的“优雅状态管理”连你自己两周后都看不懂。但你偏偏不肯用 React Query,不肯用 useState,不肯写那“看起来不够高级”的原生代码。
你在干什么?你在硬装。
- 明明可以
fetch一把梭,你非要套三层抽象,美其名曰“可扩展”——结果 AI 看了直摇头,每次帮你写请求都得绕开你那座屎山。 - 明明可以直接写
<button className="px-4 py-2">,你非要封装一个Button组件,支持 20 个 props,其中 15 个从来没用过——结果新人改个样式要花半天读你的“优雅设计”。 - 明明可以直接复制粘贴三行代码,你非要抽成一个“通用工具函数”——结果三个月后发现三个地方的逻辑其实不一样,你又要费劲拆开。
这不是能力问题,这是虚荣问题。
你不敢承认:我的抽象能力不够,我的项目不需要这么复杂,我写的封装大概率是垃圾。
但没关系,AI 时代给了你解药:直接吃药。
- 用框架原生 API —— 那是经过亿级用户验证的“特效药”。
- 用社区成熟库 —— 那是全球程序员共同试出来的“放心药”。
- 用复制粘贴 —— 那是“最朴素的安慰剂”,但至少不会吃死人。
而你自己手搓的那些抽象,就是三无保健品——看起来高大上,吃多了肝肾衰竭。
真正的勇气,不是创造多么精妙的封装,而是敢于说:“这玩意儿我封装不了,也不该封装,我就老老实实写框架 API。”
AI 时代,代码生成的成本趋近于零,但代码理解的成本永远存在。你每多一层私有封装,就是在给未来的维护者(包括 AI)多设一道障碍。
所以,别再硬装了。
不行就吃药,吃药不丢人。丢人的是明明不行,还要在床上摆出十八般武艺,最后 AI 都看不下去,默默帮你回滚到 fetch。
五、最后,我想对前端同行说
低垂的果实已经没了,不要再举着梯子去摘空气。
尊重历史进程,意味着承认:我们这一代前端,最大的贡献可能不是发明新东西,而是学会停止发明旧东西。
让框架做框架该做的事,让 AI 做 AI 擅长的事,让开发者做只有人才能做的事——判断边界、拒绝过度设计、保护代码的朴素性。
如果你看完这篇文章感到被冒犯,破防了,那就对了。