From 27d3a0736285ec3a80493665537771f122d2ffe7 Mon Sep 17 00:00:00 2001 From: Chen-jj <798095202@qq.com> Date: Sat, 28 Oct 2023 00:20:58 +0800 Subject: [PATCH] CompileMode --- rfcs/0000-compile-mode.md | 282 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 rfcs/0000-compile-mode.md 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个): + +- `