美团外卖基于 Flutter Web 的多端一体化架构实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 基于 FlutterWeb 的多端一体化架
构实践
李典胜
2019.04 加入美团外卖,先后主导了几次美团外卖商家
前端技术栈升级,并推动了基于 FlutterWeb 的多端一
体化建设。
2. •
Content Title 1
3. 1 背景
2 面临的挑战
3 MTFlutterWeb 一体化
4 总结与展望
4. 业务形态多元化
a. 商家重度使用 PC
b. 具有外投 H5 场景
c. 多端业务功能对齐
5. MTFlutter 技术支撑
MTFlutter 是美团外卖商家端维
护的 Flutter 企业级解决方案
MTFlutter 在美团外卖商家端
APP 中的业务覆盖度达 90%+
6. FlutterWeb 官方的支持
2017 年 2018 年 2019 年 2021.03
Flutter
开源 FlutterWeb
Beta 发布 FlutterWeb
合入 main repo Flutter2.0
稳定 Web 支持
一套代码
多端运行
7. FlutterWeb 官方的支持
Flutter Native
Flutter Web(HTML Render)
渲染:利用 DOM、Canvas、JS 等,在 Engine 层对齐了渲染能力
逻辑:早已成型的 dart2js 可将 Dart 逻辑完美转换为 JS
站在巨人的肩膀上,可靠!
8. 团队背景
a. TypeScript 转型 Dart,学习成本可接受
b. 大前端融合,FE 承担了许多 Flutter 业务
c. 具备 Flutter 开发能力的同学达 95%+
9. 1 背景
2 面临的挑战
3 MTFlutterWeb 一体化
4 总结与展望
10. 面临的挑战
1
基建缺失
基础依赖未扩展 Web
需对接 Web 公共服务
3
PC 适配难度大
涉及多方的适配规范
适配效率与交互体验
2
性能差
页面加载性能差
滚动存在卡顿问题
11. 1 背景
2 面临的挑战
3 MTFlutterWeb 一体化
4 总结与展望
12. 整体架构
a. 公共服务对接
b. 基础依赖建设
c. 性能优化
d. PC 适配
13. 基础依赖建设
利用 Flutter Plugin 的 Web 扩
展能力,实现请求、埋点、路由
等基础依赖建设
借助 dart:html、package:js,
可调用 Web 中的 API
三端底层实现,上层无感知
14. 案例:埋点库实现
埋点库特征:已有现成的 JSSDK,在常规 Web 中是直接被引入并调用
Flutter Plugin 中
如何调用 JSSDK?
15. 案例:埋点库实现
①
定义声明
②
公共基类
16. 案例:埋点库实现
③ Web Plugin 实现
④ pubspec.yaml
17. 加载性能优化
Why Not CanvasKit ?
a. CanvasKit 模式输出包体积过大(> 2.5M)
b. 自定义字体、emoji 等存在渲染问题
c. 建议 CanvasKit 模式用于桌面应用
d. CanvasKit 模式的优化难度大
因此选用 HTML Render 模式
18. 存在的问题
SDK 输出的 JS 包
就达到 1.1M
a. SDK JS 体积大(> 1.1M)
b. 未支持文件 HASH
c. 缺少资源 CDN 化
19. 路由懒加载
减少首包大小体积,提升首屏加载性能,提高缓存命中率
20. 静态资源优化
干预编译流程,对产物二次处理,如:文件 HASH、文件分片、CDN 化等
21. 静态资源优化
flutter_tools/lib/src/build_system/targets/web.dart
JS 文件分片:等分 N
个文件,前端并行请求
N 个文件,充分享受浏
览器并发请求能力,提
升加载性能。
22. 滚动性能优化
大量的 Canvas
从何而来?
23. Canvas从何而来?
engine/bitmap_canvas.dart
color、shadow、border、
image 等都使用了 Canvas 渲
染,造成了资源的浪费
优化 Canvas 的创建是关键!
24. 滚动性能优化方案
a. 基础样式或元素,使用
HTML DOM 替代 Canvas
b. 设置阈值,增加兜底处
理,避免极端情况下引起内
存问题
25. 滚动性能优化方案
26. PC 适配实践
背景:实现 PC 复用,提
效最大化
挑战:保证双端交互习惯的
同时,低成本实现 PC 适
配
双端交互习惯的差异
27. PC 适配方案设计
a. 适配规范制定
b. 开发系列适配工具,包括
现有 PC 组件融合工具
c. 分平台打包,减少包体积
28. PC 适配规范
1
屏宽伸缩或加列
2
保证各端交互习惯
3
保留各端独有功能
• 列表模块 • 下拉框 • 顶部导航
• 表单模块 • 时间选择 • 面包屑
• Banner • 下拉刷新 • 三方分享
• 金刚资源位 • 滑动操作 • 报表下载
直接的收益:交互、 UI 无需介入 PC 的设计工作
29. 融合现有 PC 组件
背景:融合成型的 PC 组件库,提高适配效率的同时,也能保证交互习惯
挑战:Flutter 中如何能实现任意位置的插入并调用 Web 组件呢?
① 现有
Web 组件 定义 Dart 侧的
调用声明
② 任意位置创建
Flutter Widget 设定
样式属性
③
装载
Web 组件
绑定 Widget
与装载器
引入
dart:html
创建
装载器
渲染
Web 组件
30. 案例:调用 React 分页组件
①
定义声明
31. 案例:调用 React 分页组件
② 创建装载器
④
调用 Web 组件
③ Widget 与 装载器绑定
32. 分平台打包
背景:PC 适配产生了冗余代码,且是无法被 TreeShaking 剔除的
33. 分平台打包解决方案
a. 对编译进行干预,解析 AST 节点并改写,剔除平台冗余代码
b. 输出 PC、H5 双端资源并进行隔离
34. 案例:responsiveSystem 剔除无用代码
flutter_tools/lib/src/commands/build_web.dart
flutter build web --type pc
35. 成果与收益
页面完全加载时间提升 50%,
目前维持在 600ms(TP50)
2
三端复用人效提升明显,交互、
UI设计效率提升近 50%,RD 开
发效率提升 60%
大部分场景下滚动 FPS
可达到 45~60FPS
36. 1 背景
2 面临的挑战
3 MTFlutterWeb 一体化
4 总结与展望
37. 总结与展望
总结:
• 公共服务对接,基础设施搭建,使得业务能够快速接入
• 优化编译流程、定制 SDK,提升加载性能与滚动性能
• PC 适配规范和工具,提升产研整体效率
未来规划:
• 深度的性能优
• 赋能 Native,探索更多可能性
38.
39. 美团外卖基于_Flutter_Web_的多端一体化架构实践
扫描二维码 提交议题反馈