外观
NextJS
Making the Web. Faster.
在聊NextJS技术之前,我们需要先了解为什么要用NextJS,即Web应用开发的7个原则;NextJS解决了哪些问题,即Jamstack
Web应用开发的7个原则
谈到NextJS框架,不得不提到Vercel的CEO,Guillermo Rauch。他在14年的时候写过一篇Web应用开发的七项原则,这篇文章很好的反映了NextJS的设计思路。简要概括如下:
Server渲染页面仍然是必须的
服务器端渲染与SEO无关,它主要的考虑是性能:需要考虑的包括不在服务器渲染的话,请求脚本、页面样式、页面资源和API请求造成的额外的开销,以及考虑在HTTP2.0里加入的PUSH of resources。
对用户输入立刻响应
我们可以使用JavaScript来掩盖网络的延迟,把它作为设计原则,就可以在你自己的应用里面去掉绝大多数的spinner或者loading。
数据变更时的应对
当服务器的数据变化时,应该主动让用户知道。这样可以使得用户无需经常进行手动的刷新(F5, Cmd+R….),也是一种性能上的改进措施。新的挑战是:(重)连接的管理,状态的一致性问题。
控制与服务器的数据交互
如何精细的控制客户端和服务器之间的交互。注意出错处理,自动重试,在后台同步数据并管理好离线的缓存。
不要破坏history,增强它
不使用浏览器来管理URL跳转和history,将带来新的挑战。我们必须保证用户在浏览时,应用的表现符合他的期望。可以自建缓存来提高响应速度。
推送代码更新
数据自动更新但代码的更新不是自动推送的应用是低效的。要避免API出错,增强性能。使用无状态的DOM来避免重画。
行为预测
通过行为预测来进一步减少延迟。
这些原则,是从用户体验的角度出发,去思考现有的技术发展方向。我们可以在使用Next的过程中,看到如何通过技术来达成这些设计原则。
Jamstack
NextJS是创建Jamstack站点最流行的一个解决方案
Jamstack是什么
Jamstack 指的是一套用于构建现代网站的技术栈,可能过去的一些文章通常会把它们理解为 JavaScript、APIs、Markup,但其实现在这个概念已经被扩大了。
Jamstack 的官网上是这样说的:
Jamstack 是一种架构方法,可将 Web 体验层与数据和业务逻辑解耦,从而提高灵活性、可扩展性、性能和可维护性。
Jamstack 不再需要业务逻辑来决定 Web 体验。
它为 Web 提供了一个可组合的架构,其中自定义逻辑和第三方服务通过 API 来使用。
主要构成
作为一个构建应用程序的Web技术栈,Jamstack可以类比LAMP、MEAN。但是显然Jamstack没有明确指定数据库、web服务器这些web应用程序构成要件。这是因为Jamstark的出现,很大程度上得益于各大云厂商提供的云上能力,包括更容易管控的 CDN/DNS、Serverless Function、DevOps 工具等等。绝大多数Jamstack网站,都是这样的技术栈:
使用预渲染整个网站
整个网站在部署前,会被静态网站生成器(SSG, Static Site Generators)构建和优化为一系列的静态页面和静态资源,这样整个网站可以被托管在 CDN 上,加载速度得到最大程度地优化,安全性也得到保障。当然随着预渲染技术的不断升级,服务端渲染(SSR,Server Side Rendering)、渐进式的静态内容生成(ISR,Incremental Static Regeneration)、客户端渲染(CSR、Client Side Rendering)以及这些渲染技术的组合会构成非常灵活的渲染体系。
使用 Headless CMS(无头 CMS)管理动态内容
如果想要网站承载动态内容,那么可以接入各种 Headless CMS(无头 CMS),这些 CMS 系统会对外提供 API,预渲染服务可以调用这些 API 拉取数据,将动态数据渲染成为静态页面。相比传统的CMS,Headless CMS将内容与前端/移动应用程序隔离开来,不需要负责管理页面模板和呈现,只关心内容本身,使开发人员能够独立地构建和维护前端。
使用 HTTP API 增强网站的功能
Jamstack 网站通常会使用微服务提供的 HTTP API,或者 Serverless 来提供服务,例如DaaS或者FaaS。
优势
相比于纯静态网站
纯静态的网站很难承载动态的内容,内容改动通常都是要直接修改页面的代码,这对于内容管理人员(很可能是非技术人员)来说非常不友好。
而 Jamstack 的网站,通常会使用无头 CMS 来将内容管理抽离出去,内容管理人员可以直接在这些 CMS 系统的 UI 界面上进行内容修改,然后触发整个网站的重新预渲染,以及部署。
相比于传统动态网站
这里的“传统动态网站”指的是用 PHP、Ruby On Rails、JSP 甚至更古老的 CGI 构建的网站,以及基于这些技术产生的建站工具比如 WordPress、Drupal 等等。
这些传统网站的劣势在于,它们在运行时都需要一个实时在线的服务端,这些服务端负责处理请求、渲染页面,这就很大程度上降低了服务的可伸缩性和稳定性(想象一下,你迁移扩容一个在线的 WordPress 网站有多么麻烦)。
Jamstack 由于是直接使用 CDN 分发静态的页面,完全不需要渲染页面的服务,网站的伸缩性、稳定性可以得到最大的保障。
相比于单页应用(SPA)
大概五年前,随着各种前端框架的成熟,越来越多的业务逻辑迁移到了前端处理,这也就诞生了 SPA 的概念,也就是整个网站的 UI 层,由浏览器端来完全接管。得益于 HTML5 和现代浏览器的一系列特性,这样的做法可以保证最好的用户体验。
但是 SPA 最大的问题在于它对 SEO 不友好,因为 SPA 的页面内容都是靠浏览器异步获取、渲染的,虽然 Google 为首的大多数搜索引擎渐渐地支持爬取 SPA 的内容,但是这依然是一个隐患。另外,由于 SPA 需要异步加载数据,首屏内容需要在在加载、运行 JS 之后才能看到,也给用户打开网站的体验带来影响。
而 Jamstack 的页面本质上都是托管在 CDN 上的静态页面,搜索引擎可以直接爬取这些静态内容,首屏与静态网站一样,可以直接展示内容,而不需要等到加载运行 JS 之后。
相比于 SSR 应用
目前市面上的几大前端框架都支持了服务器端渲染,也就是 SSR 的概念,这些 SSR 技术也成为了 Jamstack 的基础之一。但是典型的 SSR 应用和传统动态网站一样,都是需要一个在线的服务来渲染页面,同样会有运维和安全性上的风险。
Jamstack 从技术角度上讲,可以认为是 SSR 技术的进阶,也就是提前用 SSR 预渲染大部分页面,然后将这些页面部署在 CDN 上,随后根据网站的数据变化,重复预渲染、部署即可。