文章插图
同构过程中的一些经验:
- 通用代码移动到 Common 目录:语雀代码仓库是 monorepo模式,如果没有很清晰的目录划分,很容易造成跨端兼容问题 。有了这个约定以后,业务研发同学就会注意到这个会用在移动端或者桌面端
- 通过 webpack alias 适配多端:这个方式比较常见,比如各端有不同的网络请求库,在组件层面使用 adapter/request 。webpack 在构建时,adapter 映射到不同的端实现 。
- 定义多端代码研发规范:梳理出不同端的一些差异点,在研发时避免采坑 。
虽然同构模式可以解决我们当时遇到的一些问题,但是随着业务规模和功能增加,陆续有些问题暴露出来:
- 迁移到 Common 目录,各种依赖问题:很多功能在桌面端之前已经上线,有些复杂组件迁移到 Common 下本身也需要耗费不少时间 。
- 缺少动态化能力,迭代滞后(web 与桌面端功能不一致):组件在 web 发布上线后,桌面端需要发布才支持,所以经常会碰到 web 和桌面端不一致的吐槽 。
- 容易出现多端兼容问题(环境依赖等):虽然我们定义了一些规范,但很难彻底避免出现环境依赖问题 。
- 缺少独立沙箱,容易影响主应用(内存泄露、样式) :web 可能用完即走,可以刷新等,不太容易遇到问题,但是桌面端因为是常驻的,如果有些内存泄露或者样式污染问题,就直接影响到整体可用性 。
考虑到上述原因,我们将代码复用架构升级成子应用模式,利用桌面端容器,嵌套一个 html 在线或者离线页面 。
简单来说,子应用模式可以理解为支付宝九宫格进去的各个小程序模块 。
文章插图
- 快速迭代:提供独立的发布迭代能力,所以无需跟随桌面端整体发布 。而且直接由业务同学跟进整个交付流程,无需桌面端同学参与,提升交付效率 。
- 具备端相关能力:每个子应用默认就能使用桌面端提供的 JSBridge 能力,天然能做到跟桌面端模块一样的能力 。
- 独立沙箱:独立于桌面端主窗口,利用桌面端的容器来完成渲染,所以能完全做到进程级别隔离,相互之间的内存开销一目了然,更好的做到管控,保证整体应用稳定性 。
- 加载初始化:除了上述的一些优势,也会到来一些问题,比如加载速度慢等,我们通过 webview 预热、缓存等方式,一定程度上解决了这个问题 。
性能是一个桌面端软件必须要面对的问题,是需要持续在不同角度进行优化的
文章插图
主要包括这几个方面:
- 启动速度优化:启动速度是用户第一映像,我们主要是将主进程代码进行缓存,尽早展示 loading 避免白屏,主窗口和渲染进程的部分任务同时执行,达到并发效果;
- 主进程优化:主进程和渲染进程执行是同步的,如果主进程做了太多任务,会导致用户使用起来卡顿,甚至闪退 。所以尽量减少主进程所做的事情;
- Web 优化:同时,之前很多在 web 上做的优化,一样可以拿过来使用 。例如懒加载,合并模块等(组合多个模块本身也有开销);
- Webview 优化:例如预热 webview、并进行一些性能管控措施,避免失控 。
性能优化其实不是说做完哪些事情就可以彻底解决,而是一个长期过程 。可能我们后续新增功能时,代码里有某一个内存泄露问题,就很容易导致性能拉胯下来 。所以我们也建立了一些持续性的机制:
推荐阅读
- 描写蚂蚁的成语?关于蚂蚁的诗句和谚语
- 曹操为什么建造铜雀台?曹操建铜雀台是为了干什么
- 最有深意的生日祝福语?含义深刻的生日祝福语
- 我和周先生共用一台电脑英语?我和周先生不熟
- 教师节祝福语2021简短暖心短句?2021教师节祝福语大全温暖好听
- 教师节写贺卡的祝福语?送给老师的祝福语
- 晚安心语致自己适合发朋友圈的?晚安朋友圈的句子触动人心的
- 早起的鸟儿有虫吃格言?早起的鸟儿有虫吃短句
- 是我多管闲事?多管闲事的词语
- 白浅|桃花番外370白浅二胎临盆,玉清宫出现异样,墨渊语言神族将遭劫