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:
iven
2026-05-24 11:32:40 +08:00
parent 675f8a4b10
commit 1e59007bd5
58 changed files with 4950 additions and 494 deletions

View 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;
}