个人使用nextjs有一段时间了,基本感受如下:
部署角度
目前体验基本满分。结合 vercel 基本不用任何配置,就能快速部署。并且使用 cloudflare 的域名后,也可以实现让国内访问。
开发体验角度
无法在 server component 里直接使用 hooks ,ref 和 react 的事件收集( onChange 这类)的功能,所以有些动画需要原生实现,失去了 react 的很多便利性。
SEO 角度
由于可以将大部分内容直接通过静态页面返回,所以确实带来了巨大的提升。但是官方文档对于 robots ,sitemap ,meta 标签的 keywords 之类的常见功能没有提供一个比较好的解决方案(目前还是采用字符串模版拼接的方式,或者是我没仔细看),理想的情况下希望能提供几个函数来收集每个路由下的信息来解决这个问题。
监控工具的集成角度
目前我集成了 google analytics 、tag manager 、google 站长工具。官方提供了一个集成的 component 配置比较简单。
server 负载角度
对于大部分网页访问量不高的情况不会有问题,但虽然提供了 server component 的渲染缓存,但对于接入数据的变动 server component 来说,还是存在部分 CPU 密集型的计算在 nodejs 的 server 中,在访问量比较大的时候,还是需要考虑。
总结
总的来说,对于我个人来讲,如果没有强烈的 SEO 需求,对于一般项目的话不会采用 nextjs 。server component 和 client component 的分离,迫使我在状态管理上要做更多思考和操作。而且对于首屏的渲染在现在协商缓存的基础下,也只有用户收到新版本的网页的时候会有差距,其他大部分情况下差距不大。
最初 RSC 要解决的简单问题是:在服务端渲染时如何请求数据?
由于 React hooks 令人费解的设计哲学,React 传统组件无法异步。在客户端渲染时,一般通过 `useEffect` 来获取数据。而在服务端渲染时,我们无法使用 `useEffect`,这使得在服务端请求数据(以及其他异步操作)成为了一个问题。顺带一提,vue3(nuxt.js) 就不会面临这个问题,因为 vue3 的组合式 API 没有 React hooks 的一堆限制,并且 setup 是能够异步的。
Next.js(RSC)给出的答案是:设计一个全新的服务端组件,专门用来在服务端发请求。好处是,这个组件可以异步了,坏处是,在这个组件中无法使用 hooks 。
Remix(React-Router-v7)的答案是:Loader 。预先定义好要加载的数据,框架会在数据加载完后将数据注入到组件中。
在我看来 Loader 方案明显比 RSC 更好:
1. 性能更好:Loader 单次加载完成页面所有数据; RSC 每次加载一个组件,加载完父组件的数据,再加载子组件的数据。
2. 更低的心智负担:Loader 只需要提前写好请求,然后方便地通过 useLoaderData 拿到数据; RSC 则引入了额外的服务端组件的概念,在编写时得区分是否为服务端组件,还得到处写 "use client"。
包括新出的 TanStack 也是提倡使用 Loader 方案而不是 RSC 。
参考:
https://react.dev/blog/2020/12/21/data-fetching-with-react-server-components
https://nuxt.com/docs/getting-started/data-fetching
https://remix.run/docs/en/main/discussion/data-flow
https://tanstack.com/router/latest/docs/framework/react/guide/data-loading
1. 是不是真的快
2. 快多少
3. 服务器需要增加多少费用
4. 增加的心智负担
5. 增加的复杂程度
6. 增加的接手成本
这是取舍题。
sitemap, OG gen, meta 都有不用 ssr 的方案, 而且 SEO 早就不是问题了,2024 了 google 也不至于这么落后。
推荐阅读国外其他前端 er 对 react 服务端的帖子: https://www.joshwcomeau.com/react/server-components/
我是工作经验 1.5 年的 react 前端,如果你工作年限比我大,那么你说得对
13=>14=>15 每个版本变动很大,需要重新看文档。文档比较杂,同一个东西能看到好几种使用姿势。还有那个 NextAuth ,简直就是一坨。跑起来很吃内存,如果有内存泄漏问题,需要很强的 node.js 功底去排查,用起来成本挺高的