这样的标准上海市疫情防控工作领导小组也好意思发布出来?

人民日报林治波社长发出灵魂拷问:你们是没有常识,还是没有良知?

惨烈的高峰防御战—“圣元春战役”打响!

母子乱伦:和儿子做了,我该怎么办?

一定在信仰的指导下抗击疫情《马克思主义信仰:战胜新冠肺炎疫情的内生力量》

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

基于Deno的新交互框架:Fresh如何改善用户体验

前端之巅 2022-10-21
图:Lewis J Goetz 发布于 Unsplash,Fernando Doglio 二次编辑

作者 | Fernando Doglio
译者 | 马可薇
策划 | 闫园园

随着 Fresh 1.0 的发布,这款基于 Deno 的框架在将近一年后终于有了第一个稳定的版本。那么,高效且对客户端浏览器友好、非必要不允许渲染动态内容的 Fresh 是如何做到这些的呢?

让我们拭目以待吧!

这个新架构能干什么?

或许我们应该先解决这个问题?SSR(服务端渲染)、渐进式 SSR 之类都在试图优化渲染过程,在服务端完成大部分工作,在客户端通过水合重新创建不同组件。这些可没有听起来那么简单,我们可是在重新连接事件和处理程序,从虚拟 DOM 中重新创建 DOM。这其中的主要问题在于,需要传输到客户端的 JavaScript 可不在少数,而到了关键时刻,必须送到客户端的,最昂贵的数据类型就是 JavaScript。

同样的字节量下,无论你传输到设备中的是图片、CSS、HTML 还是 JavaScript,其中要花大功夫处理还是 JavaScript。我们要做的不只是传输数据,更要对这些数据处理和解释。或许对于 M1 MacBook pro 来说这些没什么差别,但如果你的移动设备是个老古董,而且网还特别慢,那影响可就大了。

那我们现在要做什么呢?当然是想法子搞到鱼和熊掌。或者说,我们既要给所有人提供动态或交互式内容,还要想办法把传输的 JavaScript 量降到最小,让所有人都能真正享用我们的网站或应用程序。

那什么是“岛”呢?

岛(Islands),或者说互动岛,都是指互动组件。就是这样,就是这么简单,是不是很失望?我们在服务器上渲染所有的静态内容后,将其传送到客户端中动态组件的占位符(也就是岛)里。随后在客户端中,异步水合(Hydrate)每一个岛。是的,每一个岛都可以自行进行水合,都是独立于彼此的,这也就是为什么会叫“岛”吧?我猜的。

而在 Fresh 里,岛是我们构建在一个叫“islands”的特殊文件夹中的组件,框架会将其识别为特殊组件以区别对待。没了。岛的美妙之处在于,我们可以不清楚其背后构造直接拿来用。我们只需要问自己一个问题,“这个组件需要是交互式的吗?”

如果答案是“否”,那么继续按照原来的组件创建方法不用动。

如果答案是“是”,那么也还是继续原来的方法,记得把文件都放在那个叫“islands”的文件夹里即可。

就是这么的简单。

而交互式组件也可以直接通过静态组件调用,所以这也不是什么大问题。具体改善最终用户体验的魔法都是在框架内部施展的。

我们为什么要关心“岛”是什么呢?

对开发者而言,我们确实不需要关心,我们甚至可以不知道它的存在。但既然聪明人在思考向浏览器传送代码和内容的全新方式,那一定是有理由的,并且一定是个好理由。

或者说,应该是好几条理由:

  • 性能。还记得前面提到的,通过 SSR 将大量 JavaScript 传送到客户端侧,重新创建虚拟 DOM 等等一系列无聊任务吗?岛让我们可以只需要重新创建一个组件,而且还是异步的,其余每个组件都能照顾好自己。因此,所需的 JavaScript 的数量大大减少,运行起来也要简单很多。

  • SEO。这点虽然并不是 Fresh 框架特有的,但也算是个好处。SEO 尤为偏爱将所有静态内容都在服务器端渲染的网站。

  • 重要的东西先渲染。这点很好实现的,用户感兴趣的东西十之八九是静态内容,这些东西无论什么情况都会优先渲染。至于你在周围塞的交互式按钮、链接、小工具要等上几微秒才会出现,谁又在乎呢?你的用户会高兴地看到自己想要的东西,不会因为一个缓慢加载的 JavaScript 而耽误世间。

所以说,岛非常棒,我们可以用岛建任何东西。

虽然这么说,但你可能并不想这么干。我最近为了我的博客节目 20MinJS 采访了 Fresh 的创始人 Luca Casonato,据他所说,在考虑岛之前你应该先算一算自己的动态静态内容占比。如果你大部分内容都是静态的,那么像是 Fresh 之类的就很适合你,你会享受到这个框架所带来的全部好处。

然而,如果你大部分内容都是动态的,比如社交媒体网站,或者是 Figma 之类的应用程序,基本就是浏览器中的一个桌面应用程序,那么构建岛就没什么意义了。你不仅享受不到静态内容渲染的好处,还得在岛里构建所有东西。这种场景下,其他类型的框架和架构可能更合适。

都有谁在用“岛”呢?

虽然我是因为 Fresh 才了解到岛的,但其实 Fresh 并不是第一个将其付诸实践的。顺带一提,Fresh 是以 Preact 为基础,但降低了在客户端中运行所需的 JavaScript 数量。也就是说,如果你对 Fresh 一无所知并且非常担心看不懂文档,那么放宽心,只要你懂 React 就没问题。

除了 Fresh 之外,另一个用岛的流行框架 Astro 不仅提供了部分水合,还有在服务器端静态 HTML 的同时懒加载动态组件的功能。还有 MarkoJS 框架,虽然他们的主页上没有明确地提到岛,只写了他们是如何传送互动组件需要的代码,其余部分全是用 SSR,但这就其实岛的定义。

虽然如你所见,岛的概念以及围绕它的整个架构还没有被广泛使用,但这只是一个开始,考虑到岛所能带来的性能改善,相信很快所有静态优先类型的框架都会开始实施它。

交互性架构的岛这个名字很顺耳。虽然岛的概念很简单,但它在性能和渲染时间方面所带来的好处是非常多的。岛应该是每一个静态优先类型的网站生成器都努力实现的模式。

你尝试过 Fresh 吗?对它有什么想法吗?

文链接:https://blog.bitsrc.io/islands-of-interactivity-what-are-they-and-why-is-fresh-using-them-1806fc67a07

声明:本文为InfoQ翻译,未经许可禁止转载。


 活动推荐

于 10 月 30-31 日举办的 GMTC 全球大前端技术大会(北京站)上,来自阿里的前端技术专家光弘老师将分享《基于 LowCodeEngine 的阿里低代码组件体系的建设和实践》,带你了解低代码组件为组件研发领域带来的变化以及机会点。此外,本次 GMTC 北京站还设置了 TypeScript、跨端技术选型、前端 DevOps 实践、IoT 动态应用开发、大前端监控、移动端性能与效率优化等共 12 个专题,50+ 大厂技术专家现场分享,点击底部【阅读原文】查看更多精彩内容,感兴趣的同学联系票务经理:+86 18514549229
本周荐文

跨过四个时代,JavaScript框架终于可以与原生应用SDK竞争了

我是如何开发和部署一个Chrome扩展程序的

Mozilla控诉苹果谷歌微软搞垄断;Shopee 中国宣布裁员上热搜;钉钉总裁称非常讨厌红点和DING消息

文章有问题?点此查看未经处理的缓存