AI 时代的前端忏悔:停止你的“封装崇拜”,尊重历史进程

5 阅读9分钟

低垂的果实早已被摘完。你那些自我感动的“抽象”,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)的训练数据,都来自公开的、海量的代码库。它们学到的,是 useStateuseEffectfetchlodashdate-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. 抽象能力不足 + 边界感知缺失 = 灾难

这话很难听,但它是真的。

很多人真正的错误,不是不学习,而是对工具和方法的使用边界毫无感知

  • 今天听说领域驱动设计很酷,明天就把 UserOrderProduct 拆成聚合根、实体、值对象,层层嵌套——完全不问自己:我这个前端项目到底需不需要领域模型?事务边界在哪里?聚合根要序列化传给后端吗? 没人能回答,但代码里已经躺着一个“前端DDD四件套”。

  • 昨天学了函数式编程,今天就把 mapflatMapfold 塞进每一个数组操作里——也不管可读性是否比 for 循环更差,也不问自己:这个副作用真的被隔离了吗?

  • 上周刚看完“整洁架构”,这周就搞出了 presentationapplicationdomaininfrastructure 四个文件夹——每个文件夹里只有两个文件,其中一个还是 README.md

他们学了一堆名词:领域驱动、事件风暴、六边形架构、CQRS……但从来没有真正理解过这些方法论是在解决什么问题、需要什么前提、边界在哪里。更不会在落地之后,回头问一句:“我的设计带来收益了吗?有没有更简单的办法?”

结果就是:朝三暮四,学了一堆东西却无一精通。 今天抄后端的分层,明天抄函数式的纯函数,后天抄微前端的隔离——抄到最后,项目成了一个四不像的“学术展览馆”。

你的抽象很抽象!!!

AI 不会拯救这种能力缺失,只会放大它。 因为 AI 可以 30 秒生成一个“看起来合理”的抽象,让你误以为自己很厉害。然后三个月后,这个抽象会成为整个团队不敢动的地雷——连你自己都忘了当初为什么这么设计,但谁也不敢删,因为一删就崩。

真正的能力,不是知道多少种方法论,而是知道什么时候不用它! 以前学习前端如此,之后学习AI相关的功能来辅助编程开发本事亦是如此,不审视不自我批评和迭代,终是一团糟。


三、“少封装”不是倒退,是觉醒

你可能会问:那是不是回到“复制粘贴”的时代?

是的,某种程度上,就是要回归“适度的复制粘贴”。

三条铁律,建议贴在工位上:

  1. 默认不封装。 除非同一个逻辑在三个完全不同的地方重复出现,并且你能用一句话说清楚它的业务含义。

  2. 框架有的,直接用。 不要写 useFetch,不要写 <Suspense> 的二次包装,不要写“增强版”的 Router。框架团队比你聪明,也比你有更多测试。

  3. 社区成熟的,不要自己造。 日期处理用 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 擅长的事,让开发者做只有人才能做的事——判断边界、拒绝过度设计、保护代码的朴素性。

如果你看完这篇文章感到被冒犯,破防了,那就对了。