原文题目:Island Architecture
原文:Island Architecture | Maina Wycliffe Blog
作者:Maina Wycliffe
建设一个网站有不同的办法,其中之一便是多页应用程序(MPA),它大概在十年前就过期了,当初又从新流行起来。MPA曾经被Angular和React以及其余古代框架所遍及的单页利用(SPA)办法所取代。
因为应用软件迭代趋势的运作形式,办法/工具很容易过期。这并不是因为它的效率低,而是因为开发人员不再应用它们来反对其余货色。这就是多页利用(MPA)所产生的事件,开发人员开始采纳风行的Web框架,如Angular、React、Vue等。这导致了SPA应用的回升,因为框架变得越来越风行。
因为SPA的工作形式,导致咱们发送到浏览器的 Javascript 数量减少了。也就是说,如果没有 React 来治理状态和渲染,你就不能有一个 React Web 应用程序。SPA 应用 Javascript 来出现要在浏览器中显示的 HTML。在许多状况下,这是可取的,例如,在 Facebook 或 YouTube 等网络应用程序中,治理状态至关重要。但在其余状况下,这没有意义,例如博客、集体作品集等。
SSR Server-Side Rendering 服务端渲染
当应用 Angular 或 React 等SPA框架时,服务器做的很少,所有的渲染都是在客户端实现的,也就是所谓的客户端渲染。要查看内容,你首先须要下载框架的运行态(JS须要撑持你的web应用程序),还须要一个渲染内容的环境,也就是浏览器。
这有一些毛病,值得注意的是它在屏幕上显示一些货色的速度很慢,这对低端设施和较慢的网络情况和搜索引擎优化的影响更糟——机器人和爬虫通常无奈渲染这些页面,也不能通过解析内容来获取显示后果。
咱们有两个规范的解决方案来解决上述问题:服务器端渲染(SSR)和构建时渲染(SSG)。SSG 相似于 SSR,但在构建时,不须要在服务器上对每个申请进行渲染。SSG 通常用于内容不那么动静的网站。这两种解决方案的问题在于,它们不能解决 SPA 的问题,而是推延它。
如果你想要领有任何模式的交互性,比方关上和敞开网页利用上的导航栏,你就须要从SSG或SSR中为渲染的利用润色。这其实是疏导你正在应用的框架的过程,从服务器传输状态,以便框架能够接管。这通常产生在绘制第一个内容之后(从服务器出现服务器端出现的 HTML 之后),但在 Web 利用中的交互性之前。
这意味着必须下载和解析框架所需的JS,并且用户必须期待所有这些事件产生后能力与您的Web应用程序进行交互。这意味着即便在咱们不须要交互性的页面上,即“对于咱们”页面、条款等等,依然须要执行所有这些下载和解析操作,这有点没有必要。
岛屿 Islands
这就是孤岛架构(Islands Architecture)的用武之地了。设想一下:你能够应用纯 HTML 和 CSS 为所有动态内容创立 Web 应用程序,而后增加动静内容或交互区域(孤岛),这些区域能够应用框架来增加交互性,并且这些区域能够应用任何框架,运行态框架只有在应用到它的页面上才会被下载,而不是在网站的初始加载中。
Astro(我的网站是用Astro构建的)、Marko和最近的Qwik等Web框架都在实现这种架构办法。以Astro为例,Astro组件应用JSX的某些变体,但没有客户端状态,因而没有运行态。
Astro 框架
Astro应用JS抉择退出的概念,这意味着在默认状况下,不会生成Javascript,除非你被动通知Astro须要蕴含这些Javascript。如下所示:
<script> document.getElementById("menuToggle").addEventListener("click", () => { const collapsibleMenu = document.getElementById("collapsibleMenu"); collapsibleMenu.classList.toggle("navbar-menu-show"); collapsibleMenu.classList.toggle("navbar-menu-hidden"); });</script>
以上JS代码片段来切换挪动菜单的关上和敞开
Astro组件不能被 hydrate(注水),因为它们是HTML模板组件,任何 Javascript脚本都须要通过如上办法或通过 React、SolidJS 等框架蕴含其在内。
第二种抉择是引入你应用的框架,例如React, Preact, Lit, slvelte, Vue等,来创立在你的web利用中增加交互区域(岛)的组件。
// index.astro file---import ReactComponent from "./ReactComponent"---<ReactComponent />
你也能够管制必要部位的补水工夫。这是通过批示Astro何时进行注水作用来实现的。例如,您可能心愿一个岛在装载时或仅当它可见时才加水。有几个指令能够帮忙您实现这一点,您能够在这里理解更多。
// index.astro fileimport ReactComponent from "./ReactComponent"<ReactComponent client:visible />
Marko 和 Qwik 框架
尽管我不是Marko或Qwik(社区新秀)的专家,但如果您有趣味理解更多,我将在上面链接了其余资源。与Astro相比,Marko和Qwik将岛屿的概念更进一步。
Marko是一个MPA框架,它的Island架构更聪慧一些,因为它会主动决定加载一个Island所需的JS,尽可能地提早它,容许更高效的Island。这与Astro目前的办法不同,后者依赖于开发人员通知Astro何时进行注水。Astro仍处于预公布阶段,兴许将来这种状况会有所扭转。
Marko绝对于Astro的另一个要害劣势是,Marko能够决定岛上有什么or岛上没有什么。这意味着仅显示动态内容的组件(如页脚、页眉等)不会成为孤岛,而表单和其余具备动静内容的丰盛组件将成为能够水化的孤岛。
另一方面,Qwik将其带到组件级别,合成了注水的形式,以便仅在须要时进行注水。这是通过踊跃地将网站的JavaScript合成为多个块,设置全局事件侦听器并将趣味点间接序列化为HTML来实现的。对于每个不同的用户交互,Qwik 领有仅加载执行操作所需的代码所需的所有,仅此而已。
作为回报,这将导致代码块更小,从而可能更快地加载、解析和加载用户须要的内容。这就是所谓的渐进式注水,这超出了本文的探讨范畴,心愿我能很快就此进行探讨。
总结
本文着眼于岛屿架构,它们存在的起因以及以后利用它们的框架。在接下来的系列文章中,我想更深刻地钻研下面提到的框架 —— Astro,Marko和Qwik,以及其余框架,如Svelte,Angular和React,以及它们在外部之间的区别。
参考起源
- Why Progressive Hydration is Harder than You Think
- From Static to Interactive: Why Resumability is the Best Alternative to Hydration
- JavaScript vs. JavaScript. Fight!
- Why Efficient Hydration in JavaScript Frameworks is so Challenging
- Resumable JavaScript with Qwik
- Conquering JavaScript Hydration Event delegation is the key to not running over the component... Apr 15
- State of JavaScript 2021: Framework Reflections
- A first look at Qwik - the HTML first framework WRITTEN BYMIŠKO HEVERY JULY 2, 2021
举荐扩大浏览(译者)
- Islands 架构原理和实际 - 掘金
- 从 Islands Architecture 看前端有多卷 - 掘金