[译] 来了解一下 Island Architecture 孤岛架构

news2025/6/8 15:55:05

建立一个网站有不同的方法,其中之一便是多页应用程序(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 file
import 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,以及它们在内部之间的区别。

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异步任务如何测试?

总是能收到这样的问题&#xff1a; 异步任务如何测试&#xff1f;异步的接口如何测试&#xff1f;可以通过自动化来保证异步任务是否执行了吗&#xff1f;能否保证执行是否成功&#xff1f; 收到这样的问题&#xff0c;其实大家的问题都是通用的&#xff0c;那么正好整理下我…

毫无基础的人如何入门 Python ?

Python 我也是从零开始自学的&#xff0c;因为工作的原因&#xff0c;我需要 python 做很多数据抓取的工作。我把自己的学习的感想&#xff0c;做了一下总结&#xff0c;阅读到最后&#xff0c;一定会有惊喜。 首选&#xff0c;我不会一下子&#xff0c;给你推荐一堆视频课程&…

从git上新拉下来的vue项目,没有node_modules依赖,npm install报错,node-sass报错

因为没有node_modules依赖&#xff0c;我直接 1.npm install&#xff0c;但是报错&#xff1a; 2.npm install --force报错 3.npm audit fix --force报错 4.npm install --legacy-peer-deps报错 5.npm install --registry https://registry.npm.taobao.org 直接安装淘宝镜像也…

一名智能驾驶产品经理的自我修养

已剪辑自: https://mp.weixin.qq.com/s/fCSO7hmP3FP-Xat-NyFG0A 随着智能驾驶浪潮的兴起&#xff0c;市场上产生了对相关人才的大量需求&#xff0c;也诞生了一些传统汽车行业所没有的新兴岗位。其中&#xff0c;智驾产品经理&#xff0c;作为一个典型的、互联网与汽车行业深度…

应用反演工程对四层减反膜进行分析

有很多的过程可以被称之为反演工程&#xff0c;但在Essential Macleod中&#xff0c;该术语的意思是用来识别理想设计的和实际生产尝试之间的差异。该功能大致可以概括为“出了什么问题”。这一过程类似于优化&#xff0c;在优化过程中&#xff0c;将初始设计进行优化&#xff…

软饭硬吃,因为“测试能力单一”面试多次被拒,给跳槽的各位测试人员提个醒

最近公司有几位同事打算离职出去看看其他机会&#xff0c;几轮面试下来感觉很好&#xff0c;最终却没有收到几家offer。这几位同事都有好几年工作经验&#xff0c;测试经验丰富&#xff0c;也参与过大型项目的测试&#xff0c;在测试用例设计、测试流程把控、测试执行等方面做得…

汇富纳米冲刺创业板:拟募资6.25亿 王跃林堂叔侄控制近50%股权

雷递网 雷建平 12月20日湖北汇富纳米材料股份有限公司&#xff08;简称&#xff1a;“汇富纳米”&#xff09;日前递交招股书&#xff0c;准备在深交所创业板上市。汇富纳米计划募资6.25亿元&#xff0c;其中&#xff0c;3.5亿元用于2万吨/年气相法纳米粉体材料项目&#xff0c…

[前端攻坚]:如何优雅的用function实现一个class

使用function来写出一个class的类对于我们来说当然是简单的&#xff0c;但必须注意的是&#xff0c;要做好function实现一个class&#xff0c;那么就要必须实现达到高精准度的模仿&#xff0c;把该实现的细节都实现好&#xff0c;才能更好的对class进行深入的理解 废话少说&…

js逆向-无限debugger的原理与绕过

js逆向-无限debugger的原理与绕过 debugger是JavaScript中定义的一个专门用于断点调试的关键字,只要遇到他,JavaScritp的执行便会在此处中断,进入调试模式。 有了debugger这个关键字,我们就可以非常方便地对JavaScript代码进行调试,比如使用JavaScript Hook时,我们可以…

想用python拿大厂offer?那这个一定是你需要的

想用python拿大厂offer&#xff1f;那这个一定是你需要的 python&#xff0c;是一种解释型&#xff08;高级&#xff09;的&#xff0c;面向对象的&#xff0c;带有动态语义的高级程序设计的开源语言。1989年&#xff0c;Guido von Rossum&#xff08;荷兰人&#xff09;人称龟…

新华三推出人工智能模型训练平台,让智慧算力触手可及

随着AI技术不断完善升级&#xff0c;产业界的主要需求已经不再是基础算法的打磨&#xff0c;而是如何让AI技术与行业场景、企业需求相契合。不久之前&#xff0c;科技部等六部门联合印发了《关于加快场景创新以人工智能高水平应用促进经济高质量发展的指导意见》&#xff0c;明…

新浪l2接口如何获取某个记录类型对应的记录情况?

新浪l2接口获取某个记录类型对应的记录情况&#xff1a; 用法&#xff1a; get_result_records (recordtype, index, ContextInfo) 释义&#xff1a; 获取某个记录类型对应的某个时刻的记录情况。 *注&#xff1a;模型回测时有效&#xff0c;获取的为回测面板中的记录结果 …

Jmeter结果处理小心得

[内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 正文 工作中用jmeter请求一个接口对谈得上会jmeter的人似乎都是可以做出来的&#xff0c;但是实际难点是参数化&#xff0c;结果的断言&#…

谁会嫌钱多啊,最适合Python兼职攻略以及接私活经验!一定要看到最后!

想给大家谈谈一个非常热门的话题&#xff0c;就是如何在学习python的同时去赚钱。在这篇文章中&#xff0c;你会学习到如何通过学习python来赚取副业收入。 相信大家都对钱感兴趣吧&#xff0c;如果你和马云爸爸对钱不敢兴趣的话&#xff0c;那这篇文章就不适合你了。 如果你想…

ArcGIS的城市空间发展模拟预测案例

ArcGIS除了空间分析评价、综合制图等, 它其实还有一个很强大的功能! 这个功能,简直就是科研利器, 就叫它——模拟预测分析吧! 它涉及地质、环保、国土、规划、水利、气象等多方面的分析应用,科学进行城市空间发展变化的模拟预测! 城市空间单元划分与采样 划定分析单元…

汇编数据串操作和修改标志位指令处理机控制指令

目录 不使用数据串操作 数据串指令 数据串操作指令注意&#xff1a; MOVS数据串传送指令 (重点掌握&#xff09; REP重复指令&#xff08;补充&#xff09; LODS取数据串&#xff08;只有源&#xff09; STOS存入串&#xff08;只有目标&#xff09; CMPS串比较 可以加重…

设计模式之责任链模式

Chain of responsibility 责任链模式的概念、责任链模式的结构、责任链模式的优缺点、责任链模式的使用场景、责任链模式的实现示例、责任链模式的源码分析 1、责任链模式的概念 责任链模式&#xff0c;即把请求从链中的一个对象传到下一个对象&#xff0c;知道请求被响应为止…

多数据源事务处理-涉及分布式事务

一. 数据源跨库但是不跨 MySql 实例 这个形式就是数据源在同一个 MySQL 下&#xff0c;但是 jdbc-url 上的数据库配置不同&#xff0c;涉及多个数据库时&#xff0c;如果方法中发生异常&#xff0c;只有开启事务的数据源会发生回滚&#xff0c;其他数据源不会回滚。看到这里可…

禅道 删除回收站

回收站的内容只能进入数据库删 如何访问数据库 1、网页登录数据库 禅道数据库管理用的是adminer&#xff0c;但是为了安全&#xff0c;访问adminer的时候需要身份验证&#xff0c;需要运行/opt/zbox/auth/adduser.sh来添加用户(先 cd /opt/zbox/auth/ 然后执行 ./adduser.sh…

线程和进程 / 进程和线程的区别和联系

&#x1f496; 欢迎来阅读子豪的博客&#xff08;JavaEE篇 &#x1f934;&#xff09; &#x1f449; 有什么宝贵的意见或建议可以在留言区留言 &#x1f4bb; 欢迎 素质三连 点赞关注 收藏 &#x1f9d1;‍&#x1f680;码云仓库&#xff1a;补集王子的代码仓库 不要偷走我小…