其他
打破重重阻碍,Flutter 和 Web 生态如何对接?
导读:Flutter 设计之初是不考虑 Web 生态的,原因很简单:两种技术设计理念不同,强行融合很可能让彼此都丧失了优势。但是业界又有很多团队在做这种尝试,说明需求是存在的。今天,阿里无线开发专家门柳就来手把手教如何实现 Flutter 和 Web 生态的对接?
不要对接!不要对接!不要对接!
为什么要对接?
可能这些理由也不够充分,暂且先照着这个假设继续分析,最后再重新讨论到底该不该对接。
从 Web 到 Flutter。就是使用 Web 技术栈来开发,然后对接到 Flutter 上实现跨平台渲染。对 Web 来说是解决性能和跨平台一致性问题,对 Flutter 来说是解决生态复用问题。 从 Flutter 到 Web。就是官方已经实现的 Web support for Flutter,把已经用 Dart 开发好的 App 编译成 HTML/JS/CSS 然后运行在浏览器上,可以用于降级和外投场景。
如何实现“从 Web 到 Flutter”?
TS 魔改:用 JS 引擎替换掉 Dart VM,用 JS/TS 重新实现 Flutter Framework(或者直接 dart2js 编译过来)。 JS 对接:引入 JS 引擎同时保留 Dart VM,用前端框架对接 Flutter Framework。 C++ 魔改:用 JS 引擎替换掉 Dart VM,用 C++ 重新实现 Flutter Framework。
▐ TS 魔改
为啥是 TS 而不是 JS?这不是因为 TS 是个大热门嘛,而且向下兼容 JS,现在几乎所有时髦的框架都要用 TS 重写了。
▐ JS 对接
▐ C++ 魔改
▐ 几种方案对比
如何实现“从 Flutter 到 Web”?
▐ 实现原理
使用 dart2js 把 Framework 编译成 JS 代码。 基于浏览器的 API 重新实现 dart:ui,即 dart:web_ui。
▐ 存在的问题
▐ 优化方案
使用 CSS Painting API 做绘制。 这是还处于提案状态的新标准,可以用 JS 实现一些绘制功能,自定义 CSS 属性。 目前还未实现,需要等浏览器先把 CSS Houdini 支持好。 使用 WebAssembly 版本的 Skia 做绘制https://skia.org/user/modules/canvaskit 这样可以发挥 wasm 的性能优势,并且保持 skia 功能的一致。但是目前 wasm 在浏览器环境里未必有性能优势,这里不展开讨论了。 已经部分实现,参考这里的配置启用功能: https://github.com/flutter/flutter/issues/41062#issuecomment-533952994
一种适应性更好的架构
Framework: 开发框架。为开发者提供可编程 API,实现响应式的开发模式,提供细粒度 Widget 供开发者自由封装和组合。 Renderer: 渲染引擎。专门实现布局、绘制、动画、手势的的处理,这部分功能相对独立,是可以与开发框架解耦的,也不必与特定语言绑定。 Engine: 图形引擎。实现跨平台一致的图形接口,合成输入的层并绘制到屏幕上,处理好平台力的接入和适配。
再讨论一遍:为什么要对接?
END