多编译内核生态下的极速研发体验
如果无法正常显示,请先停止浏览器的去广告插件。
1. 多编译内核生态下的极速研
发体验
朱天健
京东 · 凹凸实验室
2. 目录
01 背景
02 极速构建
03 总结与展望
3.
4.
5. 多编译内核生态
6. 多编译内核生态
Webpack
…
7. 多编译内核生态
React Native 生态
Webpack 方案
编译
Metro 方案
使用 metro 编译内核,更贴合 React Native 生态体系
8. 多编译内核生态
社区呼声
通过 vite 编译内核提升 Web 端研发体验
9. 面向多终端研发
10. 面向多终端研发
编译系统
小程序
Web
OpenHarmony
快应用
React Native
11. 面向多终端研发
编译系统
一致性
通过标准配置能力,为不同编
译内核提供多终端编译特性,提
供一致的研发体验。
框架生态
插件系统提供一致的编译生
命周期,兼容多内核生态。
12. 面向多终端研发
……
13. 极速构建
多编译内核生态
14. 多编译内核架构
CLI
插件系统
开发
范式
编译
核心
运行
环境
运行
平台
React
Vue
jQuery
......
Webpack / Vite
小程序
Web 端的渲染规范
Web
OpenHarmony
小程序标准的组件库
Metro
快应用
React Native
小程序标准的 API 库
15. Webpack 编译内核
16. Webpack 编译内核
17. Webpack 编译内核
构建体验
持久化缓存
依赖预编译
配置工具
18. Webpack 编译内核
PreBundle
19. Webpack 编译内核
PreBundle 小程序
Scan
Bundle
Remote App
Host App
20. Webpack 编译内核
PreBundle 小程序
Scan
使用 ESBuild 收集项目内已使用的 js 模块
注意:
1. TS + Vue <script setup> 语法可能被误判被移除
,需设置副作用避免遗漏依赖;
2. 需根据 TARO_ENV 等环境变量移除无关依赖。
21. Webpack 编译内核
PreBundle 小程序
Bundle
使用 ESBuild 打包用户配置和收集的模块,并通
过 SWC 优化代码的编译能力,基于 CommonJS 的依
赖转换 ESM 后的编译结果进行兼容。
Scan Dependencies
注意:
ESBuild
Entry Plugin
SWC Plugin
ESBuild Bundle Modules (Cache)
多模块使用 ESBuild 输出嵌套路径的难以分析预
测,故消除路径中的 / 将其扁平化输出,并在插件中
通过 virtual module 保留原始 path。
22.
23. Webpack 编译内核
PreBundle Web
Scan
Bundle
Remote App
Host App
Proxy
24. Webpack 编译内核
PreBundle Web
Remote App
TaroContainerPlugin
使用指定的公开模块来创建额外的容器入口。
使用 MF 构建 Remote 应用
Bundle Modules (ESBuild)
Webpack (Module Federation)
TaroModuleFederationPlugin
(TaroContainerPlugin)
Remote App (Cache)
注意:
Web 端环境中不需要通过 ProvidePlugin 注入
额外的 @tarojs/runtime ,且同步模式会导致页面加
载冗余等问题,降低实际用户体验,故在这里与小程
序有所区分。
25. Webpack 编译内核
PreBundle Web
TaroContainerReferencePlugin
Host App
为 Host 应用添加 MF 配置
Webpack (Module Federation)
Remote App (Cache)
TaroModuleFederationPlugin
(TaroContainerReferencePlugin)
Remote App Assets
MFPlugin Config
(Host App)
- 将预编译的依赖修改为远程模块
- 将特定的引用添加到作为外部资源的容器
- 允许从这些容器中导入远程模块
- 注入所需的 webpack 工具函数。
26. Webpack 编译内核
PreBundle Web
Proxy
为 Remote 应用提供静态服务,供 Host 应用加
载依赖时使用
注意:
MF 模块会异步加载,可以通过 virtual-
modules 将 App 或页面入口嵌套一层异步加载避免
依赖错误。
27. Webpack 编译内核
PreBundle 性能测试
17.5
优化前
预加载
3
小程序端
79
优化前
预加载
24
Web 端
使用 NutUI 示例项目测试
28. Webpack 编译内核
小程序中使用模块联邦
Module Federation
如何在小程序中使用模块联邦?
29. Webpack 编译内核
Module Federation
ModuleFederationPlugin
ContainerReferencePlugin
(Host App)
ContainerPlugin
(Remote App)
SharePlugin
TaroModuleFederationPlugin
TaroContainerReferencePlugin
Module Federation
(Host App)
SharePlugin
TaroContainerPlugin
(Remote App)
30. Webpack 编译内核
Module Federation
Webpack
创建额外的容器入口
TaroContainerPlugin
自动注册模块的逻辑
Module Federation
劫持 ContainerEntryDependency,通过插入
taroModuleMap 将异步逻辑改为同步。
Remote App
注意:需要收集使用到的 webpack 工具函数,并删除冗余的入口、runtime 等 chunk。
31. Webpack 编译内核
Module Federation
Webpack
TaroContainerReferencePlugin
预编译依赖改为远程模块 需同时注入所需的 webpack 模块
插入自动注册模块的逻辑 修改 webpack/runtime/remotes 模块的输出
生成 id 映射对象 idToExternalAndNameMappin
app.js 注入 require
依赖所有预编译的 chunk 和 remoteEntry
Host App
注意:需要移除小程序环境中不需要的远程加载模块,减少不必要的代码输出。
32. Webpack 编译内核
PreBundle 第三方使用
预构建依赖和指定模块、页面
33. Vite 编译内核
34. Vite 编译内核
依赖打包的开发服务
启动项目时,需优先扫描整个项目依赖和代
码,并在应用完成构建后提供服务。
依赖 ESM 环境的开发服务
使用 ESBuild 构建依赖,并在浏览器请求源
码时,将对应模块转换为原生 ESM,按需提供
源码。
35. Vite 编译内核
Web 端适配
小程序特性 Webpack 内核
支持小程序路由、Tabbar 等特性,
兼容各 API、跨框架组件库配置。 支持 webpack 编译内核已经支持的
各种特性,如 React、Preact 等 DSL 模
块,多路由模式……
提供适配 Web 端的 Vite 插件
36. Vite 编译内核
小程序端适配
module (virtual)
page.config (router)
写入
App Build
app.config (entry)
module (virtual)
page.config (router)
module (virtual)
module (virtual)
…
…
import
提供适配小程序端的 Vite 插件
37. Vite 编译内核
38. Vite 编译内核
CLI
Init
配置
模板
…
钩子
Vite 配置
编译能力
框架配置
样式
ES5 TS SourceMap sass less stylus
resolve 静态资源 压缩 PostCSS 内置 PostCSS CSS Module
小程序
H5
DSL 各小程序兼容 Tabbar
CustomWrapper 分包 原生组件/插件
DarkMode
DSL Server Tabbar
样式 API HMR
生成模式 路由模式 首次启动耗时
跨框架组件库 兼容组件库
特殊编译模式
智能提取分包依赖 小程序组件
预渲染 独立分包
原生组件
…
39. Vite 编译内核
可能遇到的问题
循环依赖
打包输出 CJS 格式在配置
splitchunk 后可能产生循环依
赖,并导致运行报错。
- 01 -
编译缓存
由于缺少持久化缓存能力
支持,较 webpack5 相比编
译速度会慢。
- 02 -
40. Metro 编译内核
41. Metro 编译内核
taro build —type rn —watch
config
@tarojs/ rn-runner (metro)
react-native start
JSBundle
listen: 8081
42. Metro 编译内核
taro build —type rn —watch
config
@tarojs/router-rn
@tarojs/ rn-runner (metro)
React Navigation
合并 metro.config.js
@tarojs/runtime-rn
@tarojs/rn-transformer
@tarojs/rn-style-transformer
index.ts
react-native start
index.bundle?platform=[platform]
JSBundle
listen: 8081
43. Metro 编译内核
编译性能
打包优化
生态支持
提升编译速度,提供更好的 规避由于 webpack 提供的
与 React Native 默认配置保
SourceMap 支持,提升研发效 多 entry 模式导致的问题,并降 持一致,支持更灵活的合并方式
率和体验。 低包体大小…… 。
44. Metro 编译内核
构建流程
taro build —type rn —watch
react-native start
RN Runner
metro server
Transformer
@tarojs/rn-transformer
@tarojs/rn-style-transformer
index.bundle?platform=[platform]
index.ts
Runtime
@tarojs/taro-rn
@tarojs/component-rn
@tarojs/router-rn
45. Metro 编译内核
原生 React Native 应用支持
@tarojs/rn-supporter
App Config
Taro Config
MetroConfig
支持框架提供的编译、运行时配置,和资源样式解析方案
46. Metro 编译内核
原生 React Native 应用支持
注意:路由导航相关需要自行处理
47. 编译系统
CLI
插件系统
编译核心
48. 编译系统
拓展编译过程
taro build —type [platform] [—watch]
编译
CLI
注入运行时依赖
加载平台插件
编译结果
49. 编译系统
插件系统
命令行扩展
- registerCommand
编译过程扩展
- onBuildStart
- onCompilerMake
- modifyWebpackChain
- modifyBuildAssets
…
编译平台拓展
- registerPlatform
50. 编译系统
插件系统
DSL 插件
端平台插件
…
…
51. 编译系统
插件系统
语法拓展
React
Vue2
Vue3 ......
自定义插件 ......
纵向拓展
QQ 插件
阿里系小程序插件
已支持的平台
微信插件
支付宝插件
横向拓展
......
......
快手插件
功能模块
插件化系统
编译时
运行时
......
52. 生态工具链
SWC
标准语法 对标 Babel 特性支持
支持 ES5 语法编译 支持 browserlist、target 等常用特
性,以及很多 Babel 内置插件;但作用 支持 JSX、React、TS;支持使用 JS
编写插件,后续会也将支持使用 Rust 编
域隔离等与 Babel 存在差异或缺失…… 写插件。
使用 @swc/register 代替 @babel/register 提升 config.js 加载速度
53. 生态工具链
ESBuild
JS 代码压缩
CSS 压缩
54. 总结与展望
55. 总结
开放式跨端跨框架解决方案
语
法
React
标
准
编译
系统
Vue
Web 端的渲染规范
jQuery
小程序标准的组件库
小程序
Taro 插件系统
React 适配器 模拟 DOM
Vue 适配器 模拟 BOM
小程序渲染层
运行
平台
小程序标准的 API 库
编译核心
CLI
Web
OpenHarmony
快应用
Webpack / Vite
小程序
运
行
时
......
Metro
Web
数据序列化
React 适配器
Vue 适配器
路由
API 库
React Native
React Native
跨框架组件库
WebComponents
路由库 组件库
API 库 Expo
React Native 0.70
56. 展望未来
前端 UI 框架
支持更多类型的前端 UI 框架,为开发者的研发流
程提供更多可选项。
性能优化
为小程序提供更好的热重载、预渲染等能力,提升
多端研发体验,提供适用于更多场景的多端性能优化方
案。
同时根据场景提示性能优化方案,以及性能指标测
…
评工具,为项目优化提供指引。
57. 展望未来
Flutter
Web Assembly
Test Renderer
58. 展望未来
技术委员会
59. 感谢大家观看