08 — 关键设计决策与依据(精简)
编排说明:更细的 问答与编译深挖(原分散在 10~14 稿、小程序/RN/iOS·Android/复杂度/多端/CSSOM 等)已统一收入 09-常见问题.md。本章只保留 决策 + 原因 + 源码锚点,便于与 09 对照。
1. 运行时 + 类 DOM 与 Reconciler
决策:Taro 3 起在逻辑层 模拟 DOM,用 react-reconciler 等 操作 TaroElement 树,再 hydrate + 静态模板 + setData 对接宿主。
依据:packages/taro-react/src/reconciler.ts;packages/taro-runtime/src/hydrate.ts。
2. 模板:递归 × WXS/SJS
决策:shared/src/template.ts 将宿主差异抽象为 模板是否可自递归 与 是否用 XS/SJS;非递归用 baseLevel + comp。
依据:template.ts 文首注释。
3. setData:setTimeout 合并
决策:TaroRootElement.scheduleTask 用 setTimeout,避免微任务导致 连续 setData。
依据:packages/taro-runtime/src/dom/root.ts。
4. 编译器:webpack5 / vite / RN 分叉
决策:VALID_COMPILER = ['webpack5','vite'];RN 独立 Metro,不经 compiler 字段。
依据:packages/taro-service/src/platform-plugin-base/platform.ts;packages/taro-rn-runner/src/index.ts。
5. 入口与平台补丁
决策:taro-loader 收口 createPageConfig + Page;hostConfig.mergeReconciler 注入平台差异。
依据:packages/taro-loader/src/page.ts;packages/taro-platform-weapp/src/runtime-utils.ts。
6. 预构建
决策:小程序构建前 Prebundle,失败 跳过。
依据:packages/taro-webpack5-prebundle;index.mini.ts。
7. 社区流程
决策:重大功能 RFC;Issue 用 issue helper。
依据:本仓库 README.md。
延伸阅读
- 09-常见问题.md — Q&A 全集(含深挖)
- Taro 实现细节
- RFC / Issue Helper