fix(mp): DevTools 卡死 + 主包 2MB→766KB + 代码质量 4 项全通过
根因:主包 2MB 全量组件注入导致 DevTools 渲染引擎内存渐增, 叠加离线时固定 3s 抑制期后的请求洪泛。 修复: - app.config.ts 添加 lazyCodeLoading: requiredComponents 主包 2.0MB→766KB,taro.js 526→131KB,vendors.js 230→28KB - request.ts 离线抑制改为指数退避(3s→6s→12s→30s cap) 后端不可达时自动延长抑制,防止请求风暴 - SegmentTabs Tab 接口改为 readonly,修复 TS 编译错误 - AbortController polyfill 补齐小程序运行时缺失 - 健康首页/设备同步/健康档案/报告/设置页 UI 重构 - 文章页公开端点适配游客访问 - 健康首页 Swiper 间隔优化 4s→5s,动画 500→300ms
This commit is contained in:
57
apps/miniprogram/src/utils/abort-controller-polyfill.ts
Normal file
57
apps/miniprogram/src/utils/abort-controller-polyfill.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* AbortController / AbortSignal polyfill — 微信小程序 JS 运行时
|
||||
*
|
||||
* 微信小程序 JSCore/V8 不提供 AbortController / AbortSignal Web API。
|
||||
* usePageData hook 在每个页面挂载时 new AbortController(),
|
||||
* 缺少 polyfill 会导致 ReferenceError 崩溃,影响全部 ~40 个数据页面。
|
||||
*
|
||||
* 在 app.tsx 首行导入(crypto-polyfill 之后),确保在任何页面代码之前执行。
|
||||
*
|
||||
* 实现了 usePageData / request.ts 所需的完整规范子集:
|
||||
* - signal.aborted (getter)
|
||||
* - controller.abort()
|
||||
* - signal.addEventListener('abort', cb) / removeEventListener
|
||||
*/
|
||||
|
||||
if (typeof globalThis.AbortController === 'undefined') {
|
||||
class _AbortSignal {
|
||||
aborted = false;
|
||||
private _listeners: Array<() => void> = [];
|
||||
|
||||
addEventListener(type: string, cb: () => void): void {
|
||||
if (type === 'abort') this._listeners.push(cb);
|
||||
}
|
||||
|
||||
removeEventListener(_type: string, cb: () => void): void {
|
||||
this._listeners = this._listeners.filter((fn) => fn !== cb);
|
||||
}
|
||||
|
||||
/** @internal 触发 abort 事件 */
|
||||
_doAbort(): void {
|
||||
if (this.aborted) return;
|
||||
this.aborted = true;
|
||||
const listeners = this._listeners.slice();
|
||||
this._listeners = [];
|
||||
for (const fn of listeners) {
|
||||
try {
|
||||
fn();
|
||||
} catch {
|
||||
/* best-effort dispatch */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class _AbortController {
|
||||
readonly signal = new _AbortSignal();
|
||||
|
||||
abort(): void {
|
||||
this.signal._doAbort();
|
||||
}
|
||||
}
|
||||
|
||||
// @ts-expect-error — polyfill: globalThis 上原本没有 AbortController
|
||||
globalThis.AbortController = _AbortController;
|
||||
// @ts-expect-error — polyfill: globalThis 上原本没有 AbortSignal
|
||||
globalThis.AbortSignal = _AbortSignal;
|
||||
}
|
||||
Reference in New Issue
Block a user