博客列表

三分钟看看头牌React元框架Nextjs、Remix、Gatsby差异

回顾二十载前端技术架构演进,主流Web应用技术由LAMP伊始,再到MEAN占据主流,时至今日Netlify提出JAM的概念,SSG、ISR、DSG、DPR携手边缘计算登上舞台。

next-gatsby-react

JAM 从上图不难看出,LAMP Stack在操作系统、数据库等方面都有一定约束。到了MEAN Stack阶段,关系型数据库换成了NoSQL,更快更灵活,并且不再依赖单一操作系统。也有团队采用SPA+Node中间层+Go/Python Web Server的模式,前后端团队技术栈分离。如今演进到JAM Stack,架构更加灵活,数据与代码逻辑解耦,站点渲染可以不依赖Javascript,为开发者提供了更大的系统设计与优化空间。

LAMP(2000年) MEA(R/V)N(2013年)
JAM(2020年)
优势
  • 免费开源许可
  • 技术文档成熟
  • 编程语言统一,大前端时代来临
  • NoSQL适合高流量场景
  • 工具模块各司其职
  • 借助CDN能力,性能更佳
  • 安全性高
劣势
  • 学习曲线陡峭
  • 性能瓶颈
  • 对于分布式、数据分析等项目,Go比Node更让人青睐
  • 依赖边缘服务稳定性
  • 电商、UGC等动态场景需优化缓存层

##JAM Stack渲染方案 最近折腾Gatsby博客升级到了v4,瞅瞅初次提交的git代码,已经过去四年了。随着社区日益繁荣、插件体系不断完善,Gatsby也开始卷入云上战场,一图与Vercel、Netlify、Cloudflare、Shopify一绝高下。

在Gatsby 4的feature update中,提到了叫DSG的渲染方法。仔细翻了翻文档,才明白这是提升SSG海量内容构建速度的一种优化。为了减少预构建Markup文档的时间,采纳了按需build的思路。长尾内容请求未命中CDN缓存时,利用边缘Worker的计算能力返回动态结果,并写入CDN Cache。

gatsby dsg 从上面的请求过程来看,似乎跟Nextjs的ISR增量构建差不多。不过这两种方案还是有一定差异,DSG更像是Gatsby对DPR的实现方式。在ISR方案中,请求未命中缓存时,会回源重新注水,产生一次服务端API调用。而DSG会在每次版本构建时生成一份分离的数据缓存快照。在Cache Miss时,Cloud Worker会用实时的业务代码拉取上个版本的缓存,生成对应的Markup。

Remix最近也有提到自身对渲染的理解,它将页面归类为静态、中间态、动态,可在运行时基于数据、用户、A/B测试等细粒度进行缓存控制。最终的理想将会是,结合边缘计算与CDN,使回源逻辑发生在边缘节点上。

next-edge

React元框架对比

Nextjs诞生于2016年,基于Node API,与React生态强关联,支持RSC及HTML流渲染;Gatsby在2017年发布1.0版本,初衷是用SSG实现CMS站点建设;Remix于2020年问世,其哲学体现在四个方面,源码内容分离、拥抱网络基础(浏览器、HTTP、HTML)、JS实现渐进增强、不崇尚过度抽象底层技术。

12869073-e85a-4bab-bfa8-70adef5d7f3f RemixvsNextTable+(5)

Nextjs
Remix Gatsby
特性
  • 优化的图片组件
  • 自动化CSS内联
  • i8n
  • AMP支持
  • 基于Web标准API:数据写入场景支持HTTP和HTML Form
  • Resource Routes语法糖:可伺服JSON、PDF、Webhook等富媒体内容
对比Wordpress等传统CMS来说,Gatsby在开发体验和性能优化方面更有优势,社区的插件丰富度也与Nextjs旗鼓相当
数据获取与静态化
  • getStaticPaths: SSG
  • getInitialProps:客户端+服务端运行时
  • getStaticProp:服务端构建时
  • getServerSideProps、RSC:服务端运行时
  • SWR:客户端
  • ISR:getStaticProps + SWR
  • ISR:RSC + revalidate
  • Middleware: Edge Runtime
  • 通过Loader和userLoaderData获取数据,loader返回的对象转换为标准Fetch响应
  • 数据均由服务端返回,用户不会看到加载态,代价是可能增加服务端请求耗时
  • 目前不支持SSG,可通过添加缓存头或Puppeteer配合CDN实现
  • CreatePage API动态创建页面
  • GraphQL数据层API,提供PageQuery、StaticQuery、Fragments查询Schema,构建时注入React组件
部署 Vercel是nextjs官方部署平台,默认继承了性能优化最佳实践 Remix由于不依赖Node,可做云函数、容器化、虚拟机部署,Architect、Cloudflare Workers、Netlify、Vercel都支持 Gatsby Cloud是Gatsby官方部署平台,集成了增量构建、实时预览、边缘计算等能力
路由
  • 基于文件系统API
  • 支持伪路由刷新,不会触发数据拉取方法
  • 支持i18n路由前缀
  • 支持REST API路由
  • 抽象了嵌套路由,支持共享父级视图,有利于局部优化
  • 通过Outlet渲染局部子路由
  • 通过文件系统路由API生成静态页面
  • 支持嵌套路由和鉴权守卫
  • 运行时路由可以通过@react/router实现
Latest Conf Nextjs Conf 2021 Remix Conf 2022 Gatsby Conf 2022

尾声

Nextjs和Gatsby对SSR、SSG的支持是类似的,差异在一些细节的地方,比如nextjs的增量静态生成与Gatsby的增量构建。当然,Gatsby的SSR的能力相对较新,不如Nextjs成熟。

Remix是新生物,只支持SSR。不过,通过适当的缓存头配置,可以达到接近SSG的性能。

当下Web技术日新月异,博客、电商、大数据应用百花齐放。对于框架的选择,很大程度取决于你的应用特性、开发偏好、运维成本、新技术栈包容度等等。

参考