DPR都在做什么?.docx
《DPR都在做什么?.docx》由会员分享,可在线阅读,更多相关《DPR都在做什么?.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、新一代Web技术栈的演进:SSR/SSG/ISR/DPR都在做什么? 在开场浏览之前 先解释一下文章里用到的英文缩写 CSR Client Side Rendering 客户端 通常是阅读器 渲染 SSR Server Side Rendering 效劳端渲染 SSG Static Site Generation 静态网站生成 ISR Incremental Site Rendering 增量式的网站渲染 DPR Distributed Persistent Rendering 分布式的持续渲染。 从 SSR 到 SSG SSR 这套技术栈相信很多人应该都非常熟悉了 假如你不熟悉的话可以先浏览
2、相关文章 React/Vue/Angular 等等都从框架层面直接提供了支持 例如在 React 中你可以这样使用 import React from react import ReactDOMServer from react-dom/server const html ReactDOMServer.render( h1 Hello, world! /h1 ) SSR 最早是为解析决单页应用 SPA 产生的 SEO、首屏渲染时间等问题而诞生的 在效劳端直接实时同构渲染用户看到的页面 能最大程度上进步用户的体验 流程类似下面 但 SSR 引入了另一个问题 既然要做效劳端渲染 就必然需要一个实时
3、在线的后台效劳 通常是基于 Node.js 的效劳 用来承载页面恳求 那么 1、需要效劳器的计算资源以及公网流量来部署这套效劳 并且消耗的资源与页面的访问量成正相关 当页面的访问量突增时 渲染效劳也需要进展扩容 2、效劳端只能部署在有限的几个地域 对于间隔 效劳端较远的用户而言 加载速度跟静态资源的 CDN 相比 慢了一个数量级 通常是 1-5ms VS 50-100 ms 3、日常也存在传统效劳端同样的运维、监控告警等方面的负担 团队需要额外的人力来开发以及维护。 有没有方法解决这些问题呢 我们重新对 SSR 进展审视 效劳端渲染出的页面 逻辑上讲可以分成下面两大块 1、变化不频繁 甚至不会
4、变化的内容 例如文章、排行榜、商品信息、推荐列表等等 这些数据非常合适缓存 2、变化比拟频繁 或千人千面的内容 例如用户头像、Timeline、登录状态、实时评论等。 例如 在一篇文章的页面中 文章的主题内容是偏向于静态的 很少有改动 那么每次用户的页面恳求 都通过效劳端来渲染就变得非常不值得 因为每次效劳端渲染出来大局部内容都是一样的 我们完全可以将文章的页面渲染为静态页面 至于页面内那些动态的内容 用户头像、评论框等 就通过 HTTP API 的形式进展阅读器端渲染 CSR 这样做有很多好处 1、由于文章内容已经被静态化了 所以它是 SEO 友好的 能被搜索引擎轻松爬取 2、大大减轻了效劳
5、端渲染的资源负担 不需要额外做一套 Node.js 效劳 3、用户始终通过 CDN 加载页面核心内容 CDN 的边缘节点有缓存 速度极快 4、通过 HTTP API CSR 页面内次要的动态内容可以以被很好地渲染 5、数据有变化时 重新触发一次网站的异步渲染 然后推送新的内容到 CDN 即可。 6、由于每次都是全站渲染 所以网站的版本可以很好的与 Git 的版本对应上 甚至可以做到原子化发布以及回滚。 这便是 Gatsby.js、Next.js 这样的网站生成器解决的问题 他们属于 React/Vue 更上一层的框架 Meta Framework 通过 SSR 把动态化的 Web 应用渲染为多
6、个静态页面 并且对高度动态的内容也保存了 CSR 的才能。 从 SSG 到 ISR/DPR 细心的同学一定发现了 SSG 这样的形式 看似美妙 但存在一个瑕疵 对于只有几十个页面的个人boke、小型文档站而言 数据有变化时 跑一次全页面渲染的消耗是可以承受的。 但对于百万级、千万级、亿级页面的大型网站而言 一旦有数据改动 要进展一次全部页面的渲染 需要的时间可能是按小时甚至按天计的 这是不可承受的。 为解析决这个问题 各种框架以及静态网站托管平台都提供了不同的方案 这里我们介绍 ISR 以及 DPR 两种。 ISR Incremental Site Rendering 既然全量预渲染整个网站是
7、不现实的 那么我们可以做一个切分 1、关键性的页面 如网站首页、热点数据等 预渲染为静态页面 缓存至 CDN 保证最正确的访问性能 2、非关键性的页面 如流量很少的老旧内容 先响应 fallback 内容 然后阅读器渲染 CSR 为实际数据 同时对页面进展异步预渲染 之后缓存至 CDN 提升后续用户访问的性能。 页面的更新遵循 stale-while-revalidate 的逻辑 即始终返回 CDN 的缓存数据 无论是否过期 假如数据已经过期 那么触发异步的预渲染 异步更新 CDN 的缓存。 这就是增量式更新 ISR 的概念 这个概念最早由 Next.js 在 9.5 版本中提出 下面是一个小
8、 Demo Static Reactions Demo s:/reactions-demo.vercel.app/ 在 Next.js 中 你可以使用 getStaticPaths()来定义哪些途径需要预渲染 通过 getStaticProps()来获取预渲染需要的数据 / 定义哪些页面需要预渲染export async function getStaticPaths() return / 只有 /posts/1 以及 /posts/2 会被预渲染 paths: params: id: 1 , params: id: 2 , / 其它页面 如 /posts/3 都会返回 fallback 页面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DPR 什么
限制150内