Next.js 居然不支持 静态生成 时用 动态路由

33 天前
scienhub  scienhub

最近我正在重构一个基于 Vue3 和 Vite 的 SPA 项目,同时调研一些可用的技术方案。

我们的需求是让少部分页面(如主页、About Us 、Contact 、Terms of Use 等)在构建时生成纯静态页面;而其余页面使用动态路由(例如 “/username” 或 “/username/projectname”),前端通过路由参数动态获取数据,类似传统的 SPA 模式。

由于觉得 SSR 的实现需要额外的服务器支持,显得过于繁重,因此希望能采用一种仅靠 Nginx 就可以部署的方案。本质上,我们希望将 SPA 中的一部分页面静态化,以便于 SEO 优化。

然而,经过一番搜索后发现,Next.js 最新的 App Router 在使用静态生成(output=export)时居然不支持动态路由。感觉这种需求非常常见和基础,却没有被很好地支持。

从中感受到,Next.js 似乎为了配合 Vercel 的托管业务,有意推动用户更多地使用 SSR 。

相关 GitHub 讨论: https://github.com/vercel/next.js/discussions/55393

2696 次点击
所在节点   程序员  程序员
11 条回复
xiaoming1992
xiaoming1992
32 天前
不谈 nextjs ,单纯说你自己用 nginx (或者其他服务器)部署静态文件,如果要实现动态路由,应该需要自定义配置吧,就例如把/username/projectname 重定向到诸如( username )目录下的( projectname ).html 文件。

如果 nextjs 来实现这一套,必然会和 nginx 配置耦合。诚然这需求确实很常见,我也需要,但我感觉 nextjs 应该不会实现这一套。
huijiewei
huijiewei
32 天前
你这个不是 Pre-rendering 么?
cj323
cj323
32 天前
这个 SSG 的需求 react router 可以: https://reactrouter.com/start/framework/rendering ,里面也说了,prebuild page 很适合没有 SSR 时候的 SEO 需求

另外这个 page level SSG 我记得 tanstack start ,nuxt 也可以,他们底层应该都是通过 vite 达成的,Next.js 没有用 Vite 。

另外,自信一点,Vercel 就是有意推动 SSR ,人家就是卖 infra 挣钱的。你一个 Nginx 能干的事情换成 SSR+边缘计算人家能挣不少呢。
scienhub
scienhub
32 天前
@huijiewei 是部分页面 pre-rendering ,剩下的页面路由,比如 user1/project1 要查数据库
scienhub
scienhub
32 天前
@cj323 感谢。我看了下 reactrouter 的文档,看样子确实就是我要的。

nuxt 似乎是可以达到我的需求,但是感觉 react 生态略完整一些。

像我这种项目,ssr 完全没有必要。
Plumbiu
Plumbiu
31 天前
scienhub
scienhub
31 天前
@Plumbiu 这个是在 build time 指定参数的。
我需要在 build 后通过用户访问的地址去查数据库,传统的 spa 那种
vishun
vishun
31 天前
??查数据库还仅靠 nginx ?
scienhub
scienhub
31 天前
@vishun

我已经有 express 后端了,不想 SSR 再要个 node 后端,也不想用 vercel/cloudflare 的边缘计算。就想一个 nginx 解决问题。

我的需求就是:主页,about-us 等少数几个页面直接 build 期间静态生成;
然后 /username/projectname 这种页面,直接前端请求后端资源,渲染页面,也就是传统 spa 的模式。

不知道我有没有讲清楚。
mailworks
mailworks
30 天前
@scienhub 传统 spa 不就是 use client 吗? Next.js 好像是可以按路由页面 SSG 、SSR 、SPA 混着来的吗?其实我也不太懂
scienhub
scienhub
30 天前
@mailworks

use client 跟 spa 没有关系的,这个比较复杂你可以搜一下看看。

我贴的 GitHub 链接,next 不支持 spa 的动态路由的,不过有开发者承诺今年 3/4 月份会完成这个功能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1108171

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX