qq小程序组件加载失败分析

1. 问题

qq小程序(基于uni-app)使用JS分发和组件分发插件后,有些页面会白屏,打开调试器,会看到下面的报错:

意思是找不到这个页面,然后列举了一系列的有效的组件。

这个问题只在qq小程序的真机上出现,在qq小程序开发者工具、微信小程序都没有。

2. 原因

找了一圈原因,最后发现是执行顺序不同导致的原因。qq小程序真机上,并不是先运行Page页面,而是先执行每个组件,或者说校验每个合理的组件,而其他环境,都是先执行Page下的js

Page下的js会加载此分包下的vendor.js,也就是每个页面下的js第一句都是下面的代码:

js 复制代码
require('./common/vendor.js');(global["webpackJsonp"]=global["webpackJsonp"]||[]).push()

这会加载分包中的module,注册一些moduleId。而qq小程序真机环境先执行了组件,此时如果某些moduleId还没注册的话,就会报错。

3. 实验

我们检验一下这个结论,在组件和页面对应的JS中分别打印一句话,看看执行顺序。

在qq小程序真机下:

在qq小程序开发者工具下:

上面的create page对应页面,press switch对应组件,可以看到qq小程序真机与开发者工具,对组件和页面的加载顺序确实不同。

4. 解决

如何解决这个问题呢?既然组件需要这个moduleId,那就提前加载好就可以了。这里写了个插件,自动引入分包所在的vendor

会不会有副作用呢?不会的,这里要了解下webpack运行时原理。vendor.js只是往global["webpackJsonp"]push了一些modulepush方法被hook了,本质是会缓存一些moduleId

另外,那些并非插件移动的组件为什么没问题呢,因为它们和Page下的js一样,第一句都引用了分包中的vendor.js

5. 后记

虽然是个小问题,定位却花了不少时间,因为微信小程序没问题,所以没往执行顺序不同那方面想,期间猜想问题原因可能是moduleId找错了之类的。

相关推荐
山河木马3 分钟前
无框架-原生webGL渲染-底层入门-1
前端·javascript·webgl
jingling5553 分钟前
Flutter | 商城项目鸿蒙(OpenHarmony)适配实战
android·开发语言·前端·flutter·华为·harmonyos
郝学胜_神的一滴4 分钟前
系统设计 014:缓存深度实战:如何用 Cache 优雅优化数据库读写?
前端·后端·面试
光影少年6 分钟前
react状态管理
前端·react.js·前端框架
小李云雾6 分钟前
深入浅出 Vue 3 核心知识点:从基础到实战
前端·javascript·vue.js·程序人生
小雨下雨的雨7 分钟前
房产登记交易系统鸿蒙PC Electron框架技术实现详解
前端·华为·electron·harmonyos·鸿蒙·鸿蒙系统
Cobyte9 分钟前
16.响应式系统比对:链表如何实现 computed 的高效更新
前端·javascript·vue.js
踩着两条虫9 分钟前
开源 AI 低代码平台 VTJ.PRO 双版本齐发:核心引擎 v0.17.1 与在线平台 v2.4.1 正式上线,强化团队协作与 AI 资产管理
前端·人工智能·低代码·架构·开源
铁皮饭盒14 分钟前
sharp.js安装不上, Bun.Image说: 我不用安装
前端·后端
陈_杨14 分钟前
鸿蒙APP开发-带你走进黑胶阁的唱片收藏怎么管理
前端·javascript