diff --git a/rfcs/0000-compile-mode.md b/rfcs/0000-compile-mode.md new file mode 100644 index 0000000..0f93f88 --- /dev/null +++ b/rfcs/0000-compile-mode.md @@ -0,0 +1,282 @@ +- 提案时间: (2023-10-27) +- 影响版本: (3.x) +- 相关 issues: [#7400](https://github.com/NervJS/taro/issues/7400) + +## 概述 + +**小程序编译模式(CompileMode)**通过在编译阶段对开发者的代码进行扫描,把 JSX、Vue template 代码提前编译为对应的小程序模板代码,达到减少小程序渲染层虚拟 DOM 树节点数量的效果,从而提升渲染性能。 + +## 动机 + +Taro3 是重运行时框架,当节点数量增多到一定量级时,渲染性能会大幅下降,出现白屏时间长、交互延时等问题。 + +之前在开发 [CustomWrapper](https://docs.taro.zone/docs/next/optimized#2-customwrapper-%E7%BB%84%E4%BB%B6) 时,我们发现页面局部的更新使用对应自定义组件的 `setData` 会比使用页面的 `setData` 性能要更好。这是因为使用后者时小程序渲染层会 diff 整颗页面的虚拟 DOM 树,而前者则只会 diff 自定义组件范围内的虚拟 DOM 子树。可见在节点数过多时,小程序渲染层的 diff 操作可能会消耗大量耗时。 + +在分析微信小程序的模板解析算法后,我们发现以下模板语法会额外产生虚拟 DOM 节点(1~2个): + +- `