Glimmer VM与虚拟dom有何不同?

Kid*_*der 7 javascript ember.js glimmer.js

所以我最近开始研究ember js,特别是它的微光渲染引擎,并试图了解它是如何工作的.

所以我的理解是,Glimmer VM是一个虚拟机,可以模拟实际的DOM并执行函数来对其进行更新.虽然vdom维护DOM状态的内部表示,但是glimmer VM没有这样的状态,而是执行两组线性指令 - 一组用于模板的初始渲染,第二组用于更新元素.这种方法的主要好处是,这种方式我们可以完全绕过JS的解析/编译瓶颈,只需将二进制文件发送到客户端,然后执行glimmer vm.我说得对吗?

fri*_*sco 5

如果只是将模板的语言从 JS 或文本更改为二进制字节码,Glimmer 不会绕过下载/解析/编译,因此下载它的下载和解析/编译是由 Glimmer VM 完成的更小和更快,而不是由 Glimmer VM 完成JS VM 具有简单的语法,解析和执行速度非常快,而且将来 VM 可以移动到 WebAssembly 以使其更快。

Glimmer VM 只是执行字节码的 VM,但 Glimmer 是处理状态的 VM,因此当它想要渲染组件时,它需要该组件模板并在 VM 中执行模板字节码。渲染模板程序并生成更新程序字节码,并将其与组件关联存储,因此当组件需要重新渲染时,仅在 VM 中执行更新程序。在 Virtual Dom 环境中,更新调用修改虚拟 dom 的函数,然后,立即或当绘制系统滴答时(批量更新),它将虚拟 dom 与前一个进行比较,并更新需要更新的节点。

虚拟 DOM 在 react 中很有意义,因为它不使用模板,组件 JSX 被转换为使用 react api 与 DOM 交互的 JS 代码(检查这个)。

Angular Ivy(Angular 的新视图引擎)似乎与 Glimmer 类似,因为它确实创建了某种 Ivy 代码而不是完整的 JS,但它不会像 Glimmer 那样创建更新程序。(不太确定这是我从我发现的常春藤文章中得到的)。

Glimmer 和 Angular 做一些类似于 Virtual DOM 的事情,但在组件级别,它们控制更改并且只重新渲染已更改其数据的组件。主要区别在于 Glimmer 已经知道绘制了什么并执行先前生成的更新模板字节码,而不是拆卸和完整渲染。