前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通用底层DOM/BOM平台

通用底层DOM/BOM平台

作者头像
否子戈
发布于 2021-07-16 03:28:34
发布于 2021-07-16 03:28:34
9900
举报
文章被收录于专栏:

粉丝过1000啦,没想到自己小小一个公众号,还有这么多朋友关注,再次感谢你的厚爱~~以后多写文章回馈~~


最近这两天一直在想一种实现方式。我们现在的前端应用,实现上基于DOM是最好的最流行的,不过,大部分前端都构建了自己的路由系统,这又依赖BOM。也就是说,目前大部分前端应用,都是基于DOM+BOM实现的。那么,我是否可以创建一个通用的DOM/BOM平台,让这些应用跑在这个平台上。

让前端应用跑在一个DOM/BOM平台上,听上去有点莫名其妙,为啥不跑在浏览器里面?没错,我就是想脱离浏览器跑这些应用。比如在nodejs里面跑(目前有JSDOM可以支持这个效果),虽然没有界面可以看,但是可以用来做一些单元测试的工作。比如在webworker中跑,众所周知,webworker是没有DOM API的,假如有了这个平台,那么就可以在worker中跑一个vue应用(虽然没有界面)。同样的道理,能否更远一点,跑在非js的环境中,比如flutter(目前阿里开源的Kraken支持这个效果)甚至C++写的原生应用中。想一想,在一个树莓派中跑一个vue应用。于是,我想出了这样一个架构:

由于从某些角度讲,DOM是BOM的一部分,所以,上图中我用VBOM包含了BOM和DOM的API。其中,VBOM这一层和Driver framework这一层是整个架构要实现的核心。VBOM是用纯js实现的DOM+BOM环境,只要把已有的vue代码,包在一个VBOM实例的闭包里面(用babel把全局变量的引用切换到window上),那么vue代码所做的任何关于DOM/BOM的操作,都是在这个VBOM的实例内部完成。Driver framework则是监听/操作这个VBOM实例,对接不同的平台,比如小程序,由于小程序是js写的,所以,引用js-driver,然后在driver的各个生命周期钩子函数上写小程序要做的事情,driver会把VBOM中有关DOM/BOM的变化告诉给小程序,也会把来自小程序的消息发送给VBOM产生新的副作用。而flutter上,我们可以使用dart-driver,原生应用可以使用cpp-driver,python-driver, rust-driver, java-driver等等,通过driver之后,终端代码里面只写终端语言代码,不需要写任何js相关的东西。而回过来,应用这端,开发者只需要写vue或react,不需要考虑自己的应用会在哪个环境里面去跑。

再用一个基于webworker的微前端方案的例子说明:

微前端要解决的是一个沙箱问题,比如一个vue应用,要在宿主应用中加载运行,那么,这个vue应用里面可能操作DOM, location, history等等,这些东西会导致vue这个子应用和宿主应用去抢location, history进行操作。我在mfy中的做法是创建一个iframe,然后把里面的window, location, history借过来给子应用去操作,通过监听,同步子应用和父应用的相关信息,这样就不会出现抢的局面。但是,由于浏览器环境中的特殊原因,目前所有的微前端方案,实现沙箱都需要借助Function来实现,同时还需要用with这个性能极差的语法(而且这个语法已经被抛弃了)来解决全局变量修改问题(虽然也可以用babel进行编译处理来去掉with语法)。这些方案都无法避免父子应用的某些冲突,特别是子应用代码运行过程中发现当前提供的资源不符合自己代码实现的逻辑,报错。

既然浏览器环境下沙箱问题这么多,性能这么差,那么我能不能把沙箱迁移到一个webworker中,在worker环境下,一个子应用一个worker,根本不存在抢资源问题,也不需要用Function来包裹vue代码。但是,worker中没有DOM啊,也没有location, history,所以就想到了,我们需要自己造一套DOM/BOM的环境,然后把这套环境放在webworker中,这样可以让vue应用在worker中跑起来,vue操作的,是VBOM,虽然不会报错,但是没有任何界面效果。

所以,接下来,就需要driver出场,driver监听VBOM中的变化,把这些变化交给controller(controller是微前端框架基于js-driver实现的一个运行在webworker中的控制器),controller通过postMessage发送给主线程,由主线程的renderer收到message之后决定怎么修改DOM。当用户点击子应用区域内的某个按钮之后,renderer将该点击事件postMessage给controller,由controller分析并把对应的DOM事件发送给driver,driver要知道这个事件发生在哪个DOM节点上,于是在VBOM中对应的节点上触发该事件,VBOM实际上是vue的运行环境,vue组件上的事件被触发,回调函数被执行,引发VBOM中新的DOM更新,再次走一遍前面的过程。

看上去好绕啊!!!但是,你要知道,其中,对于框架开发者而言,他们维护的是微前端框架,对于宿主开发者而言,他们维护的是微前端框架的配置,对于子应用开发者而言,他们维护的是vue这个应用。真正需要经常调整、修改的,是vue应用这一层,其他两者基本上是以逸待劳,一劳永逸。所以,一旦这一套跑起来之后,不管是vue也好,react也好,开发者只需要了解自己熟悉的基于DOM/BOM的web开发即可,不需要关心自己是在什么环境下运行。这对小程序的开发者而言,肯定深有感触,小程序开发因为有线程约束,导致开发者有的时候非常痛苦,翻遍开发文档都找不到问题的根源。而如果有了上面这一套方案,开发者只需要考虑在自己熟悉的web平台上开发即可,而不需要考虑其他。

补充一点,如果需要调用原生的能力,需要框架开发者在driver那一层,向VBOM提供某些接口的能力,比如提供调用摄像头的能力,比如提供app是否被切换到后台运行的事件等等(很多hybird的惯用手法)。对于应用的开发者而言,无非是增加了一些特殊接口和事件,仍然还是DOM/BOM那一套。

本文发表在博客上后,有小伙伴留言,看完还是没有明白。我觉得继续补充只会让你更糊涂,但是我还是再说下我的看法。对react有思考的同学,会认为react实质上UI的DSL,因为它提供了自定义render的能力(vue3也开放了这个能力),所以,基于该DSL,到底要render成什么结果,由开发者自己来决定。

回到本文,我认为DOM是比react更高级的DSL,它是一个w3c标准的DSL,你有非常明确的标准作为依据,每一个操作会产生什么影响都有标准告诉你,因此,是更加完美的描述体系。只不过现在的DOM是由浏览器实现的,浏览器提供DOM接口,获得DOM实例后,用来渲染界面(或者说按照HTML5标准渲染界面)是它的实现方式,我想的是,DOM的接口是标准的,那么我们也可以有其他的实现,获得DOM实例之后,也可以不走HTML5的标准实现,而是用来做其他描述,这个过程和react/vue自定义渲染器一样,我们把DOM/BOM作为DSL,为它们编写自定义渲染器,用来完成非浏览器方式的副作用。

我找了很久,没有找到纯js实现的DOM/BOM,目前有一些项目中有一些实现,例如kbone、kraken(flutter实现)、worker-dom等项目中,但是我看它们基本上都和自己的逻辑绑定了,而非纯粹的用js实现标准接口(或者说没有脱离具体的目标,实现任意的扩展能力)。如果你有发现用纯js实现的DOM/BOM,请在下方评论区,或者直接在公众号中告知我,不甚感激~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 唐霜 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
字节跳动是如何落地微前端的
微前端是什么:微前端是一种类似于微服务的架构,是一种由独立交付的多个前端应用组成整体的架构风格,将前端应用分解成一些更小、更简单的能够独立开发、测试、部署的应用,而在用户看来仍然是内聚的单个产品。
Nealyang
2021/10/26
1.7K0
字节跳动是如何落地微前端的
推荐两个腾讯开源的前端框架,好用又好看!
无界微前端是一款基于 Web Components + iframe 微前端框架,具备成本低、速度快、原生隔离、功能强等一系列优点。
程序猿DD
2023/08/09
7120
推荐两个腾讯开源的前端框架,好用又好看!
支付宝 App 架构的原理与实战
根据公开的 2018 年移动互联网行业分析报告,目前支付宝的月活跃用户已经超过 QQ ,成为国内第二大 App。
开发者技术前线
2020/11/23
1.6K0
支付宝 App 架构的原理与实战
前端跨平台框架对比分析,看这篇就够了
前端跨端实践是指在开发过程中,使用统一的代码库或框架来实现在不同平台上运行的应用程序。
winty
2023/08/23
5.9K0
前端跨平台框架对比分析,看这篇就够了
2025新鲜出炉--前端面试题(四)
回答: 是的,我在之前的项目中实现过服务端渲染(SSR),主要使用 Next.js(React 生态)和 Nuxt.js(Vue 生态)。服务端渲染的核心目的是提升首屏加载性能、SEO 友好性以及用户体验。具体实现包括:
全栈若城
2025/02/10
3980
2025新鲜出炉--前端面试题(四)
从场景倒推,在字节我们要什么样的微前端体系
微前端已经不是一个新概念了,大家或多或少都听说过接触过,这里不再去做一堆定义,只是对目前业界做法的调研总结 / 概览,这篇文章面向的是还没有在业务中使用过微前端的同学或团队,通过这篇概览,可以简单的建立对 「微前端」的整体认知;
ConardLi
2021/09/29
1.5K0
从场景倒推,在字节我们要什么样的微前端体系
小程序多平台同构方案分析-kbone 与 remax
当前国内小程序平台众多,微信小程序、支付宝小程序、头条小程序、以及未来还会出现的新小程序平台,所以为了解决一套代码可以在多个小程序平台上运行,出现了多种方案来解决,京东的 Taro、蚂蚁的 Remax、微信的 Kbone,各有特点,主要归为两种类型,编译时与运行时适配两种。
极乐君
2020/03/25
8440
使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统《纯血版本——鸿蒙 Next》,以及各个互联网厂商开展鸿蒙应用开发的消息。其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言框架 —— ArkTS。
winty
2023/12/12
1.9K0
使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理
微前端方案 qiankun 只是更完善的 single-spa
一个前端应用能够单独跑,也能被作为一个模块集成到另一个应用里,这种架构方式就叫做微前端。
神说要有光zxg
2022/11/11
1.1K0
微前端方案 qiankun 只是更完善的 single-spa
【微前端】1443- 将微前端做到极致-无界方案
微前端已经是一个非常成熟的领域了,但开发者不管采用哪个现有方案,在适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等用户核心诉求都或存在问题,或无法提供支持。本文提供一种基于 iframe 的全新微前端方案,完善的解决了这些核心诉求。
pingan8787
2022/11/15
5.2K1
【微前端】1443- 将微前端做到极致-无界方案
vivo悟空活动中台 - 微组件多端探索
随着小程序、快应用的用户体验越来越友好,用户群体庞大,运营小伙伴开始偏向将营销活动投放至微信、支付宝、快应用等微应用中。
2020labs小助手
2020/07/06
1.5K0
基于 Flutter 的 Web 渲染引擎「北海」正式开源
阿里巴巴历时 3 年自研开发的 Web 渲染引擎 北海(英文名:Kraken)正式开源,致力打造易扩展,跨平台,高性能的渲染引擎,并已在优酷、大麦、天猫等业务场景中使用。
Nealyang
2021/05/10
1.5K0
基于 Flutter 的 Web 渲染引擎「北海」正式开源
面向未来与浏览器规范的前端DDD架构设计
Hello 大家好,我是来自字节跳动的郑仁杰,目前是公司微前端开源项目 Magic(https://github.com/bytedance/magic-microservices)的负责人及核心贡献者,今天我带来的分享主题是《面向未来与浏览器规范的前端 DDD 架构设计》,这次我们站在了一个与行业传统微前端解决方案完全不同的全新的视角去思考如何设计和实践前端微服务,如何更优雅的借助浏览器原生能力将微前端的粒度做到组件级别,期待能给大家带来不一样的收获和体验。
ConardLi
2021/12/13
2K0
面向未来与浏览器规范的前端DDD架构设计
月活跃用户达5.16亿的微博是如何实现跨平台稳定开发、快速迭代的?
微博作为一款体量巨大的应用,能够快速高效的在多个平台上实现复杂的业务功能,是它成功的重要因素之一。在不断前行的路上,微博有哪些成功经验可以供广大开发者借鉴与学习?
软件绿色联盟
2022/03/31
1.1K0
月活跃用户达5.16亿的微博是如何实现跨平台稳定开发、快速迭代的?
微前端概述
Tech 导读 本文由浅到深地对微前端进行了概括性介绍,读者可以了解到微前端的概念、微前端的特点与价值、微前端的实现方案、一个微前端框架应具备的功能,以及微前端的适用场景。读者可以多关注下本文提到的各个开源的优秀的微前端实现方案,通过对比及借鉴来实现一套适合自身业务的微前端方案。 01 微前端是什么 传统的分而治之的策略已经无法应对现代 Web 应用的复杂性,因此衍生出了微前端这样一种新的架构模式,与后端微服务相同,它同样是延续了分而治之的设计模式,不过却以全新的方法来实现。微前端是一种由独立交付的多个前
京东技术
2022/03/17
1.6K0
写给前端的跨平台方案、跨端引擎的本质
近些年来,前端领域的跨端技术越来越多了:react native、weex、flutter、electron、kraken 等等。
前端森林
2021/06/25
2K0
写给前端的跨平台方案、跨端引擎的本质
作为面试官,为什么我推荐微前端作为前端面试的亮点?
作为面试官,我经常听到很多候选人说在公司做的项目很简单,平常就是堆页面,写管理端,写H5,没有任何亮点,我以我一次面试候选人的经历分享给大家
linwu
2023/07/27
1.2K0
作为面试官,为什么我推荐微前端作为前端面试的亮点?
前端技术探索 - 你不知道的JS 沙箱隔离
自从 2014 年 HTML5 正式推荐标准发布以来,HTML5 增加了越来越多强大的特性和功能,而在这其中,工作线程(Web Worker)概念的推出让人眼前一亮,但未曾随之激起多大的浪花,并被在其随后工程侧的 Angular、Vue、React 等框架的「革命」浪潮所淹没。当然,我们总会偶然看过一些文章介绍,或出于学习的目的做过一些应用场景下的练习,甚或在实际项目中的涉及大量数据计算场景中真的使用过。但相信也有很多人和我一样茫然,找不到这种高大上的技术在实际项目场景中能有哪些能起到广泛作用的应用。
zz_jesse
2021/04/21
1.8K0
从零到一实现企业级微前端框架,保姆级教学
•如何进行路由劫持•如何渲染子应用•如何实现 JS 沙箱及样式隔离•提升体验性的功能
winty
2021/11/05
7420
从零到一实现企业级微前端框架,保姆级教学
详解微信原生小程序架构及同构方案
最近实习中参与了H5项目向小程序迁移的工作,在微信官方文档和一些帖子上学习了小程序运行机制和底层原理,以及与Web页面的区别,在此基础上又看了一些关于小程序同构方案的内容。以下是我个人的一些学习总结。本文内容参考
极乐君
2020/07/28
2.8K0
详解微信原生小程序架构及同构方案
推荐阅读
相关推荐
字节跳动是如何落地微前端的
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档