前端简约主义崛起:少 JS、少依赖、少 hype,2026 的前端氛围真不一样了
前端简约主义崛起:少 JS、少依赖、少 hype,2026 的前端氛围真不一样了
2026 年你随便打开一个前端项目,node_modules 动辄几百 MB,npm install 要等好几分钟,依赖树复杂到连工具本身都开始帮你可视化才能看懂。但今年风向真的变了——Astro 被 Cloudflare 收购后加速扩张,Qwik 的 “1KB 运行时” 逻辑越来越多人认可,甚至社区里 “Vanilla JS 复兴” 的声音也越来越大。这波”前端简约主义”不是反智倒退,而是一套更务实的思路——在必要的地方用 JS,在不必要的地方坚决不用。
问题:一个 Hello World 项目是怎么变成 200MB 的
先别笑,这不是段子。你用 create-next-app 新建一个项目,还没写一行业务代码,node_modules 就已经接近 200MB。这 200MB 里面有啥?
- Babel 全家桶 —— 哪怕你已经用 SWC 了,旧项目可能还残留着
@babel/core和十几个 preset - ESLint 及其 50+ 插件 —— 每个插件又有自己的依赖
- PostCSS 加各种 preset 和 plugin
- TypeScript 本身的编译器
- 框架核心代码(React、Next.js 等)
- 测试框架(Jest/Vitest + 各种配套库)
- 构建工具及其 loader/plugin
每一个单拿出来都是合理的选择,但叠在一起,一个”空项目”就已经是一头大象了。
更麻烦的是传递依赖。你装了一个 react-datepicker,它可能依赖 date-fns,date-fns 又依赖一堆工具函数——你只是想要一个日期选择器,结果引入了 30 个间接包。
Vue 团队成员 antfu 开发的 Node Modules Inspector(在线体验:node-modules.dev)正是为了解决这个问题。它是一个可视化工具,运行 npx node-modules-inspector 就能以图形化方式看到所有依赖的关系链和体积占比。如果你还没试过,我强烈建议你跑一下——我第一次用的时候发现 @babel/parser 被三个间接依赖分别拉进来了三次,版本还不一样。
方案一:Islands Architecture,默认不加载 JS
Astro 在 2026 年 1 月被 Cloudflare 收购,同年发布了 Astro 6 测试版,这背后有一个最核心的理念:默认零 JavaScript。
传统 SPA 框架的逻辑是:整个页面用 JS 渲染,哪怕是一篇纯文本文章,也得先下载 React runtime、执行 hydrate、挂载虚拟 DOM,用户才能看到内容。Astro 反过来——默认输出纯 HTML,只有那些真正需要交互的部分(比如一个计数器、一个搜索框)才被标记为 “岛屿”,选择性水合。
---
// 这是 Astro 组件,默认生成静态 HTML
import Header from '../components/Header.astro'
import SearchBox from '../components/SearchBox.tsx'
---
<!-- 静态 HTML,零 JS -->
<Header />
<!-- 只有这个搜索框是交互式岛屿 -->
<SearchBox client:load />
这套架构直接带来几个可衡量的好处:
- FCP 大幅下降:首屏不需要等 JS 下载和执行
- TTI 显著提升:交互逻辑按需加载,而不是全量 hydrate
- 打包体积小 1 到 2 个数量级:纯内容页面只有 HTML + CSS
根据腾讯云开发者社区的一篇实测文章(2026 年 7 月),同样一个文档站点项目,Next.js 构建产物体积约 1.2MB JS,Astro 构建只有约 80KB——差了 15 倍。而性能数据更直观:Astro 版的 Lighthouse Performance 评分稳定在 98-100,Next.js 版在 75-85 之间浮动。
不过 Astro 并不是万能药。如果你的项目是一个重度交互的 SaaS 后台,全是表单、表格、实时数据面板——那 Astro 的 “岛屿” 模式反而会增加复杂度。它最适合:内容站、营销页面、文档站、电商展示页。
Qwik 走得更极端。它提出的 “可恢复性”(Resumability) 概念,核心运行时的 JS 只有约 1KB。页面在服务端渲染完成后,所有事件监听和状态信息被序列化到 HTML 中。用户点击任何元素时,Qwik 只按需加载那个元素对应的事件处理函数——精确到函数级别。
// Qwik 组件,只有用户点击时才下载这个函数的代码
export const Counter = component$(() => {
const count = useSignal(0)
return (
<button onClick$={() => count.value++}>
{count.value}
</button>
)
})
这套逻辑的好处是:不管你的应用多大,首屏始终只需要极少量 JS。缺点是这种粒度级的懒加载在生产环境中调试起来比较头疼,而且社区生态远不如 React 丰富。
方案二:用工具给你的 node_modules “瘦身”
简约主义不只是换框架,更现实的路径是优化现有项目的依赖。
Knip(webpro-nl/knip)是目前最主流的未使用代码检测工具。它能扫描整个项目,找出哪些导出函数、文件、甚至整个依赖包都没有被引用——然后你可以放心删除它们。
npx knip
输出示例:
Unused files (3)
src/utils/legacy-helper.ts
src/styles/old-theme.css
Unused dependencies (5)
lodash
moment
axios
@types/lodash
Unused exports (12)
formatDate (src/utils/date.ts)
validateEmail (src/utils/validation.ts)
一个真实的案例:某中型电商前端项目,运行 Knip 后发现了 5 个未被引用的依赖包和 12 个未使用的导出函数。清理后 node_modules 体积从 380MB 降到 220MB,npm install 时间从 47 秒缩到 28 秒。
Node Modules Inspector 则是从可视化角度帮你做依赖分析。运行 pnpx node-modules-inspector 后会在浏览器打开一个交互式依赖关系图,颜色深浅表示体积大小,连线的粗细表示依赖深度。你会发现有些包明明只需要一个工具函数,却把整个库都拉进来了。
# 一行命令启动
npx node-modules-inspector
此外,如果你还在用 npm,强烈建议切到 pnpm。pnpm 的硬链接机制让多个项目共享同一份依赖,磁盘占用能减少 60-70%。在 monorepo 场景下,这个差距更加明显。
方案三:Vanilla JS “复兴” 和更轻的框架选择
前端简约主义的第三股力量,是社区对 “原生 JS” 和更轻量框架的重新审视。
Hacker News 上那篇讨论 “Why Vanilla JavaScript” 引发了不少共鸣。核心论点很简单:如果你的页面只需要一个折叠面板切换、一个 Tab 切换、一个表单校验——真的需要引入一个框架吗?
<!-- 很多情况下,几行原生 JS 就够了 -->
<details>
<summary>点我展开</summary>
<p>不需要任何框架,浏览器原生支持</p>
</details>
<script>
// 批量切换 Tab
document.querySelectorAll('.tab-btn').forEach(btn => {
btn.addEventListener('click', () => {
document.querySelector('.tab-btn.active')?.classList.remove('active')
btn.classList.add('active')
})
})
</script>
这不是说要放弃框架回到 jQuery 时代,而是在选型时多问一句:”这部分的交互复杂度,真的值得引入一个 50KB 的库来解决吗?”
对于需要框架但不想太重的情况,2026 年有几个值得关注的选择:
- SolidJS:没有虚拟 DOM,直接用 Signals 做细粒度更新。打包体积约 7KB(gzip),性能对标原生 JS。API 像 React,但运行时开销小得多。
- Preact:React 兼容的”轻量版”,体积约 3KB。如果你的团队熟悉 React 但项目对包体积敏感,Preact 是最平滑的迁移路径。
- Svelte:编译器思路——框架代码在构建阶段就”蒸发”了,运行时不携带框架 runtime。
结论:简约主义不是非此即彼,而是一种成本意识
总结一下这三条路:
| 策略 | 适合场景 | 收益 |
|---|---|---|
| Islands 架构(Astro/Qwik) | 内容站、营销页、文档 | 首屏 JS 减少 90%+ |
| 依赖瘦身(Knip/PNPM/可视化) | 所有项目 | 构建速度提升 30-50%,体积缩小 40-60% |
| 轻量框架(Solid/Preact/Svelte) | 对体积有严格要求的 SPA | runtime 从 50KB 降到 3-7KB |
2026 年的前端简约主义,内核是成本意识——每个 KB 的 JavaScript 都有代价:更慢的下载、更多的解析时间、更高的内存占用、更大的出错面。当你下次 npm install 一个包之前,不妨先问自己三个问题:
- 这个功能浏览器是不是已经原生支持了?(比如
<details>、CSS:has()、View Transitions API) - 如果非要用库,有没有更轻量的替代?(比如 date-fns 代替 moment,zod 代替 yup)
- 这个组件真的需要在客户端运行吗?(能不能在构建时就渲染成静态 HTML?)
简约不是目的,质量才是。多出来的每一 KB JS 要么带来业务价值,要么就砍掉——就这么简单。
评论区
登录后可评论。












