发布于 2026-01-06 5 阅读
0

Next.js 的阴暗面 - 应用路由

Next.js 的阴暗面 - 应用路由

今天,我想和大家分享一下 Next.js 应用路由方面令人失望的问题

关于SSR

我假设您了解服务器端渲染 (SSR) 的概念,并且大致了解它的工作原理。
例如,服务器返回包含标记的 HTML 页面,同时 JS 和 CSS 包也在下载,用户能够立即看到页面,而解析 JS 代码则需要一些时间。

问题_rsc

每次在 Next.js 中切换路由时,它都会首先从服务器请求一些元信息,您可以看到诸如 之类的请求{smt}_rsc,我猜 代表 _ReactServerComponent。

_rsc 请求

服务器响应如下:

_rsc 响应

Next.js 路由器即使在需要更新 searchParams 时也会发出这些请求,例如/url?param=value这不是一个新页面,所有操作都纯粹在客户端进行,但仍然会发出 _rsc 请求。

另一个例子是,当有一个卡片列表时,每张卡片都有一个编辑按钮Next/Link组件,并对应一个独立的编辑页面/card/{some_id}/edit。Next.js
会尝试优化性能,_rsc提前预取这些请求。结果就是,每张卡片都会收到一个请求,但用户可能根本不会点击编辑按钮。

即使你的服务器和互联网连接速度非常快,网络请求也会使用户界面变慢,并给服务器带来更大的压力。

虽然 SSR 非常适合初始页面加载,但应用加载后的导航操作要频繁得多。

讨论

关于这个问题,讨论很少:

如何解决

对于现有项目而言,切换到类似这样的系统Remix过于困难。

如果确定是纯客户端操作,可以使用window.history带有 pushState/replaceState 的普通旧接口代替 App router。

对于queryParams/来说,可以使用一个名为state-in-url的searchParams库来简化这些操作。该库默认使用state-in-url,并且提供了一个选项来使用App Router。此外,它比NUQS简单得多,使用正确的类型解析功能即可直接使用。history

感谢阅读,如果喜欢的话,请点赞并分享。

文章来源:https://dev.to/asmyshlyaev177/dark-side-of-nextjs-app-router-15l