小程序主包方法迁移到分包-调用策略

news/2025/3/15 22:16:58/
/** @Date: 2024-12-10 15:59:32* @Description: 加载异步代码*/import { type Type, type ReversedType, type ReversedTypeRecord } from '@/lazy/type'type Key = keyof Type/** 只支持调用函数 */
export const lazierInit = new Proxy<ReversedType>({} as any, {get<T extends Key>(_, key: T): Promise<ReversedTypeRecord[T]['value']> {return <Promise<ReversedTypeRecord[T]['value']>><unknown>function (...args) {return new Promise((resolve) =>{/** @ts-ignore */resolve(require.async("../../../lazy/type.js"))}).then((res) => {const {type : reversedType} = res as { type: Type }if (typeof reversedType[key] !== 'function') {return ''}return  (reversedType[key] as (...arg: any[]) => any).call(this,...args)}).catch(err => {wx.$.collectEvent.event("lazyFalse", {key: key,data: JSON.stringify(err)})return Promise.reject(err)})}}
})/** 支持直接访问常量(如数组)和调用函数  * * // 1. 调用函数(带参数)*await wx.$.l.operationMidCallV3(arg1, arg2);** // 2. 访问常量数组*const shouldShow = (await wx.$.l.newResumeMidPops1()).includes('call_B');* * // 3. 更简洁的常量访问方式(无参数调用)* const arr = await wx.$.l.newResumeMidPops1();* * // 4.需要将组件的实例this等 一起带给方法* wx.$.l.callPhoneBtnOfList.call(this, e.detail, { ... })* 
*/
const moduleCache: { [key: string]: any } = {};export const lazier = new Proxy({} as any, {get<T extends string>(_: any, key: T) {return function (this: any, ...args: any[]) {return (async () => {if (!moduleCache[key]) {try {const res = await new Promise<any>((resolve) => {/** @ts-ignore */resolve(require.async("../../../lazy/type.js"));});const { type: reversedType } = res as { type: any };moduleCache[key] = reversedType[key];} catch (err) {wx.$.collectEvent.event("lazyFalse", { key, data: JSON.stringify(err) });throw err;}}const cachedValue = moduleCache[key];if (typeof cachedValue === 'function') {return cachedValue.apply(this, args);}return cachedValue;})();};}
});

---------------避免用户使用程序的过程中,缓存无限增大,内存泄露。

  • 结合缓存过期时间和LRU(最近最少使用)策略,确保缓存的有效性和内存使用效率。

继续优化:

interface CacheItem {value: any;expires: number;
}const MAX_CACHE_SIZE = 1000;
const moduleCache: { [key: string]: CacheItem } = {};
const cacheOrder: string[] = [];function addToCache(key: string, value: any) {if (cacheOrder.length >= MAX_CACHE_SIZE) {const oldestKey = cacheOrder.shift();if (oldestKey) {delete moduleCache[oldestKey];}}moduleCache[key] = { value, expires: Date.now() + 60000 }; // 设置1分钟过期时间cacheOrder.push(key);
}export const lazier = new Proxy({} as any, {get<T extends string>(_: any, key: T) {return function (this: any, ...args: any[]) {return (async () => {const now = Date.now();if (!moduleCache[key] || moduleCache[key].expires < now) {try {const res = await new Promise<any>((resolve) => {/** @ts-ignore */resolve(require.async("../../../lazy/type.js"));});const { type: reversedType } = res as { type: any };addToCache(key, reversedType[key]);} catch (err) {wx.$.collectEvent.event("lazyFalse", { key, data: JSON.stringify(err) });throw err;}}const cachedValue = moduleCache[key].value;if (typeof cachedValue === 'function') {return cachedValue.apply(this, args);}return cachedValue;})();};}
});


http://www.ppmy.cn/news/1579412.html

相关文章

MTK Android12 安装app添加密码锁限制

提示&#xff1a;通过安装前输入密码的需求&#xff0c;来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…

css中实现border距离视图左右两侧有距离

首先看效果图 再看css是如何实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.main {background-color: aqua;display: block;width: 300px;padding: 0px 32px;box-sizing: border-box;}/…

用 UCS Moody 和Camarilla支点打造量化高胜率模型

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;UCS Moody数学振荡器和Camarilla支点这两个量化工具&#xff0c;能显著提升交易决策的精准度。通过结合振荡器的动态趋势捕捉能力与支点策略的关键位预判&#xff0c;我优化了…

买瓜 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组

买瓜 题目来源 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组 原题链接 蓝桥杯 买瓜 https://www.lanqiao.cn/problems/3505/learning/ 问题描述 题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n n n 个瓜,每个瓜的重量为 A i A_i Ai​。小蓝刀功了得,他可以把任何瓜…

单片机—中断系统

什么是中断系统&#xff1f; 为使得CPU具有对外界紧急事件的实时处理能力而设置的&#xff0c;当CPU正在处理某些事的时候&#xff0c;当外界紧急事件请求&#xff0c;CPU会停止当前的事情&#xff0c;先去处理紧急的事件&#xff0c;处理结束后&#xff0c;在返回处理当前事件…

阿里云dataworks入门操作

什么是DataWorks DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎&#xff0c;为数据仓库、数据湖、湖仓一体等解决方案提供统一的全链路大数据开发治理平台。从2009年起&#xff0c;DataWorks不断沉淀阿里巴巴大数据建设方法论&#xff0c;支撑数据中台…

【SpringMVC】常用注解:@RequestParam

1.作用 如果控制器标注的方法的参数名称与前端传递过来的参数名称不一致&#xff0c;使得SpringMVC无法自动启动&#xff0c;那么我们可以使用该注解实现前后端参数的绑定。 2.相关属性 value/name&#xff1a;这两个属性都是一个作用&#xff0c;都是描述参数的名称&#x…

使用服务器如何DNS呢

莱卡云服务器 DNS 配置指南 一、配置云服务器本地 DNS ‌修改网络配置文件‌ ‌Ubuntu/Debian‌&#xff1a; bashCopy Code sudo nano /etc/network/interfaces # 添加或修改 DNS 配置 dns-nameservers 8.8.8.8 8.8.4.4 *&#xff08;保存后重启网络服务&#xf…