
2025年的最后几天,当你回顾这一年的前端技术发展,是否感觉到了某种微妙的变化?
上周接到一个需求,听起来简单到令人发笑:把UI组件库从2.7.1升级到2.7.3。
两个patch版本的差距,按理说跑个npm update就完事了。但现实是什么?技术Leader给我的排期是三天。
你没看错,三天。
为什么?因为这个看似简单的升级会触发一连串的连锁反应:
升级组件库 2.7.1 → 2.7.3 ↓引发依赖冲突 ↓需要升级另外3个依赖包 ↓导致组件导入方式变更 ↓需要重构200+个组件引用 ↓单元测试全部失败 ↓需要重写测试用例 ↓CI/CD流程调整
这就像多米诺骨牌。你以为只是推倒第一张牌,结果整个牌阵都塌了。
我坐在工位上盯着那个Jira工单,内心只有一个疑问:就为了一个新的Hook名字,值得吗?
这一刻,我突然意识到:我们可能在一个巨大的框架陷阱里越陷越深。
如果你是2010年后入行的前端开发者,那么你很可能经历过这样的时间线:
时间轴:前端框架的变迁史2010-2012: jQuery统治时代 └─ "用jQuery改个DOM真方便!"2013-2015: Angular.js 崛起 └─ "双向绑定太酷了!" └─ Angular 2发布,API完全重写 └─ "我的项目代码全废了..."2015-2018: React 大爆发 └─ "虚拟DOM + 组件化是未来!" └─ Redux、MobX、Flux各种状态管理百家争鸣2018-2020: Vue 异军突起 └─ "更简单的API!" └─ Vue 3发布,Composition API └─ "又要重新学习..."2020-2025: 框架大战白热化 ├─ Svelte (编译时优化) ├─ Solid (更细粒度的响应式) ├─ Qwik (可恢复性架构) └─ 各种元框架 ├─ Next.js ├─ Nuxt.js ├─ Remix ├─ SvelteKit └─ Astro2026-未来: ??? └─ 你猜明年又会出什么新框架?
平均下来,每1.5-2年就会有一个新的“前端革命”。
先说清楚,我不是在宣布React或Vue的死刑。React不会消失。Vue不会崩盘。
但“框架是万能解药”这种思维模式,在即将到来的2026年,正在加速瓦解。我们正在进入一个新阶段:
- 浏览器原生API终于变得强大且好用
- 前端工具链变得更模块化
- 性能优化重新成为关注焦点
- 框架从“必选项”变成了“可选项”
越来越多开发者开始意识到一个简单的事实:
你不需要2MB的运行时和虚拟DOM,只为了更新一个按钮的文本内容。
听起来很荒谬,但这就是我们过去十年一直在做的事。
我们需要诚实地面对一个历史事实:框架之所以流行,不是因为它们有多优雅,而是因为原生JavaScript当年确实太难用。
在2010-2015年那个时代:
DOM操作是噩梦
// 2013年的代码,看着都头疼var elements = document.getElementsByClassName('items');for (var i = 0; i < elements.length; i++) { elements[i].addEventListener('click', function(e) { // 这里的this指向谁? // i的值是多少? // 闭包陷阱等着你 });}
浏览器兼容是灾难
// 要兼容IE8-IE11,你需要这样写var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");// 或者判断事件绑定方式if (element.addEventListener) { element.addEventListener('click', handler);} else { element.attachEvent('onclick', handler);}
状态管理全靠胶带
// 状态散落各处var userData = {...};var isLoggedIn = false;var cartItems = [];// 更新状态后手动同步DOMfunction updateUI() { if (isLoggedIn) { document.getElementById('username').textContent = userData.name; document.getElementById('cart-count').textContent = cartItems.length; // 忘记更新某个地方?恭喜你得到一个bug }}
框架解决了这些痛点,给了我们抽象层、统一模式、工程化工具和开发效率。但这是2013年的故事。现在是2025年底,即将跨入2026,世界早已天翻地覆。现代浏览器的原生JavaScript API 已变得强大且易用。
示例1:现代JavaScript的DOM操作
2013年(需要jQuery):
// 需要引入30KB的jQuery$('.save-btn').on('click', function() { $.ajax({ url: '/api/save', method: 'POST', data: { content: $('.editor').val() }, success: function(res) { $('.save-btn').text('已保存!'); }, error: function() { $('.save-btn').text('保存失败'); } });});
2025年(原生JavaScript):
// 不需要任何库,代码简洁清晰document.querySelector('.save-btn').addEventListener('click', async () => {const btn = event.currentTarget;const content = document.querySelector('.editor').value;try { const response = await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ content }) }); btn.textContent = response.ok ? '已保存!' : '保存失败'; } catch (error) { btn.textContent = '网络错误'; }});
这段代码可读性强,不需要jQuery的30KB体积,不需要React的状态管理,不需要任何运行时库。
示例2:Web Components不再是空中楼阁
很多人对Web Components的印象停留在“听起来不错,但实际没法用”。但现在情况不同了。
// 一个完整的、可复用的、原生的计数器组件class CounterButton extends HTMLElement {constructor() { super(); this.count = 0; } connectedCallback() { this.render(); this.addEventListener('click', () => { this.count++; this.render(); }); } render() { this.innerHTML = ` <button class="counter-btn"> 点击次数: ${this.count} </button> `; }}// 注册组件customElements.define('counter-button', CounterButton);// 使用(就像原生HTML标签一样)// <counter-button></counter-button>
这个组件可复用、原生支持、零依赖、封装性强。
对比React:
// React版本需要整个React运行时(~130KB)import { useState } from 'react';function CounterButton() { const [count, setCount] = useState(0); return ( <button onClick={() => setCount(count + 1)}> 点击次数: {count} </button> );}
功能完全一样,但React版本需要额外的130KB运行时。如果你的整个页面就只需要这一个简单交互,使用React就是在用火箭筒打蚊子。
这才是真正的问题所在。我们使用框架,很多时候不是因为需要,而是因为惯性思维、简历驱动开发、面试门槛工具和技术身份认同。
说了这么多,我不是要否定框架的价值。在某些场景下,框架依然是最佳选择:
场景1:大型设计系统
假设你在字节跳动工作,需要维护一套在抖音、今日头条、西瓜视频等多个产品中复用的设计系统。这种情况下,需要数百个可复用组件、统一的状态管理、严格的类型检查和完善的测试覆盖,React/Vue等框架 是合理的选择。
场景2:复杂的数据可视化面板
如果你在做类似阿里云控制台、腾讯云监控面板这种复杂的数据可视化应用,有实时数据流、复杂的状态管理、大量交互组件和高性能优化需求,React/Vue的虚拟DOM、状态管理、组件化都能发挥巨大价值。
场景3:大型团队协作
如果你的团队有50+前端开发者,使用统一的框架可以降低代码审查难度、简化新人入职流程、统一最佳实践、复用组件和工具。这时候框架带来的“规范性”价值远大于性能成本。
但问题在于,大多数项目其实没有这么复杂。
- 你的To-Do应用不需要:客户端路由、虚拟DOM diff算法、复杂状态管理、CSS-in-JS运行时。
- 你的落地页不需要:Redux状态管理、React Router、服务端渲染、130KB的运行时。
- 你的个人博客不需要:复杂的构建流程、组件化抽象、状态管理。
我们花了几个小时配置Webpack/Vite,引入React,搭建状态管理,最后做出来的东西,用20行原生JavaScript就能实现。
好消息是,业界正在纠偏。新一代工具正在出现:
- 微型库的崛起:如htmx(14KB)、Alpine.js(15KB),提供了轻量级的解决方案。
- 元框架的智能化:如Astro(默认零客户端JavaScript)、Qwik(可恢复性架构,按需加载),更注重性能。
- 回归渐进增强:确保JavaScript失败时,基础功能仍可用,体验降级但可用,这就是Web的本质:内容优先,交互增强。
实战建议:如何选择合适的技术栈
决策流程图
开始新项目 ↓问自己:这个项目有多复杂? ↓├─ 简单(落地页、博客、简单交互)│ ↓│ 尝试原生JavaScript + CSS│ 或使用轻量级库(Alpine.js、htmx)│ ↓│ 体积 < 50KB,首屏 < 1s│├─ 中等(企业官网、小型管理后台)│ ↓│ 使用元框架(Astro、Eleventy)│ + 少量React/Vue组件│ ↓│ 按需加载,SSR优先│└─ 复杂(大型SaaS、数据可视化、设计系统) ↓ 使用成熟框架(React、Vue) + 完整的工程化方案 ↓ 优化性能,代码分割
五条实战原则
- 先问“为什么”,再选工具:不要一上来就问“用React还是Vue”。先问这个项目的核心价值、用户最关心什么、我真的需要这么复杂的工具吗?
- 从简单开始,按需升级:先用原生技术实现静态版本和基础交互,如果复杂度上升,再逐步引入轻量级库或成熟框架。
- 不要用框架定义你的职业身份:你的职位是“前端开发工程师”,技能是“构建用户界面”,框架只是工具。
- 优先采用工具,而非生态系统:用Vite做构建,用Astro做SSR,用Alpine.js做交互。工具要解决具体问题,避免被庞大的生态系统绑架架构。
- 接受简单不等于退步:能用最简单的方案解决问题,才是真正的专业。复杂≠专业,简洁≠业余,原生≠过时。
所以,框架的时代结束了吗?答案是:没有,但框架垄断的时代,在2026年即将正式终结。
站在2025年的尾巴上,我们告别的不是框架本身,而是盲目跟风、单一技术栈统治、依赖地狱和过度工程化。我们迎来的是理性选择、务实主义、平台优先思维和性能意识回归。
如果我们更少地选择框架,我们就会更好地使用框架。下一次,当你看到一个patch版本升级需要三天工期时,也许你会停下来思考:“我真的需要这个框架吗?”
技术没有绝对的对错,只有适合与不适合。新年新气象,也许2026年可以尝试一些不一样的技术选择。