Next.js 的阴暗面:为什么说这个流行的框架可能并不适合你

985 阅读7分钟

原文: 《The Dark Side of Next.js: Why This Popular Framework Might Not Be Right for You》

作者:Dzmitry Ihnatovich

过去几年,我跟 Next.js 这家伙打了不少交道——有时候拿它写点简单的落地页,有时候又用它开发一些相当复杂的应用。一开始,我完全是被它天花乱坠的宣传给忽悠了。它看起来就像是 React 开发者的"屠龙宝刀",简直是闪瞎了我的眼!

然而随着使用深入,缺点逐渐显现。

我可不是要故意黑这个框架。说实话,我挺佩服 Vercel 团队的技术实力。但就跟所有工具一样,咱们不光要知道它能干啥,更要搞清楚它干不了啥。

所以,我就来聊聊我在使用 Next.js 时踩过的那些坑——那些让我抓狂的瞬间、意想不到的"惊喜",以及那些让我忍不住扪心自问的时刻:"我用这玩意儿到底图啥?"

那么,Next.js 到底是什么?

Next.js 是由 Vercel 开发的基于 React 的框架。它承诺提供开箱即用的解决方案,包括服务器端渲染(SSR)、静态站点生成(SSG),现在还有更多功能——包括路由、API 路由、图像处理,甚至边缘函数。

这个想法相当吸引人:基于 React 封装出提升生产力的解决方案。在很多方面,它确实做到了。但是,一旦你深入挖掘,它的“魔法”光环就开始褪色了。

事情在哪里变得一团糟

1. 复杂性来得太快,就像龙卷风

Next.js 的初衷是简化开发,但实际上手后,你会发现脑子越来越不够用。像路由、数据获取这些本来挺简单的事儿,在 Next.js 里可能变得异常复杂,尤其是当你把 SSR 这尊“大佛”请进来之后。

我记得有一次,我只想安安静静地写个带几个动态页面的 SPA。结果呢?不知不觉就陷入了处理服务器逻辑、解决水合(Hydration)错误的泥潭,还得费尽心思保证数据在各种环境下的一致性。 调试框架耗时远超功能开发,这种本末倒置的情况令人抓狂!

2. Vercel:亲儿子,你懂的

没错,Next.js 是开源的,但谁都知道,Vercel 才是背后真正的“老大”,牢牢把控着它的发展方向。而且很多功能在他们自家的平台上运行得更好——或者干脆只有在 Vercel 上才能用。

像图像优化或 ISR 这样的功能集成得如此紧密,以至于如果你尝试在其他地方托管,要么失去这些功能,要么花大量时间重新实现它们。这虽然算不上强制绑定,但感觉就像 Vercel 在你耳边不停地说:“嘿,哥们儿,别折腾了,快到碗里来!”

3. SSR:听起来很美,用起来想哭

SSR 听起来确实很香:更好的 SEO、更快的首屏加载!但真用起来呢?它不仅增加了复杂性、提高了服务器成本,还经常逼得你不得不搞一些复杂的缓存策略来保证速度。

在一个项目中,我们大力押注 SSR,期望性能提升——但最终得到的却是比简单 SPA 路线更多的 bug 和更慢的交付时间。这就像杀鸡用牛刀,既笨重又不实用!

4. 版本迭代快如风,稳定性堪忧

Next.js 发展得是快,但有时候步子迈得太大,容易扯着淡。像 /app 目录和服务器组件这些重磅更新,想法是挺酷的——但往往是生态系统还没跟上,就急匆匆地推出来了,感觉就像是给法拉利配了个拖拉机发动机,完全发挥不出来。

5. 学习曲线?那简直是珠穆朗玛峰

如果你是从 React 转过来的,可能以为会无缝衔接。但很快你就会发现,你得重新学习一整套全新的东西:

  • 客户端 vs. 服务器组件
  • SSR vs. SSG vs. ISR
  • 布局、模板和 suspense
  • 路由

就连我身边那些经验丰富的老鸟,也得花上好一阵子才能搞明白。至于团队新人培训?那简直就是一场灾难,比登天还难!

6. 框架太“固执”,有时候很碍事

我喜欢“约定优于配置”——直到这约定不再适合我的项目。基于文件的路由系统是很巧妙,但我好几次都遇到了需要更高灵活性的场景,最后只能跟框架“打架”。

服务器和客户端的边界问题也是一样。有时候你就是想让一个工具函数在两边都能用,但 Next.js 会冷酷地告诉你:“门儿都没有!”

7. 生态系统:唯一不变的就是变化

Next.js 的每个新版本似乎都伴随着“地震”。我完全支持创新,但这种持续不断的变化,让我在开发长期项目时,总有种在沙滩上盖摩天大楼的感觉,心慌慌。

一些让人感觉更“靠谱”的替代方案

当 Next.js 开始让我觉得心累时,我探索了一些其他选择——坦白说,有些方案简直就是一股清流:

Remix

Remix 更贴近 Web 标准。它的路由和数据加载逻辑清晰明了,一切都感觉更直观。我就喜欢它没那么多花里胡哨的“魔法”。

SvelteKit(让开发重拾乐趣)

如果你不执着于 React,那一定要试试 SvelteKit,丝滑得不像话。它能生成更轻量的代码包,并且响应式原理简单易懂。对我来说,它让我重新找到了写前端的乐趣。

Nuxt.js(Vue 爱好者的福音)

如果你是 Vue 的忠实粉丝,那 Nuxt 绝对不容错过。它经过了时间的打磨,非常稳定,并且提供了许多与 Next.js 相同的功能——而且没那么多糟心事儿。

Astro(计划写一篇单独的文章)

对于内容密集型的网站,Astro 简直就是神器。它打包出来的东西非常小,默认不发送任何 JS,让你可以按需添加交互。我用它搭了个个人作品集网站,那速度,快到让我怀疑人生!

自己动手,丰衣足食(如果你够胆)

有时候,自己用 Express 或者 Fastify 搭一个 SSR 服务,反而能得到你想要的一切——没有意外的“惊喜”。当然,工作量是大了点,但你能完全掌控一切,想怎么玩就怎么玩。

当然,Next.js 也有它的高光时刻 🚀

虽然槽点满满,但在某些场景下,Next.js 依然是那个“最靓的仔”:

  • 你在 Vercel 上部署并使用他们的全套功能
  • 你想要 SSR 或 ISR 并准备好接受权衡
  • 你的团队已经很熟悉它
  • 你正在构建像博客或营销网站这样的静态内容为主的东西

一些心里话

Next.js 是一个很牛逼的框架,但牛逼不代表一切。有些场景下我用着很爽,但另一些场景下,我真的用得想哭。说到底,它也只是个工具,茫茫工具海中的一个罢了。

在为你的下一个项目默认选择 Next.js 之前,问问自己你真正需要什么。你想要 SSR 的额外复杂性吗?你能接受与 Vercel 紧密绑定吗?或者,一个更简单的方案能让你更快地到达终点——还没那么多糟心事儿?

市面上有大把优秀的选择。很多时候,最合适的方案,并不是那个最火、最潮的,而是那个能让你专心搞定业务,而不是天天跟框架"打架"的工具。