可用 proxy 拦截 apply 实现无侵入配置注入:代理 sdk 初始化方法,在 apply 陷阱中按环境动态合并配置、防重处理,并适配全局/原型/esm/umd 等不同导出形态。

可以用 Proxy 拦截函数的 apply 操作,在调用前动态注入配置,不修改 SDK 源码、不污染全局,且对 Promise/回调等异步场景也天然兼容。
代理目标函数并劫持 apply 调用
核心是用 new Proxy(target, { apply }) 包裹 SDK 的初始化方法(如 AlipaySDK.init、AMap.init 或 wx.config),在 apply 陷阱中插入配置逻辑:
- 提取原始参数,检查是否已含配置项;若无,则自动合并预设的全局配置对象
- 确保
thisArg正确传递(尤其当 SDK 内部依赖this上下文时) - 必须使用
Reflect.apply(target, thisArg, args)执行原调用,避免this丢失或隐式转换
支持多环境差异化配置注入
可在注入逻辑中根据运行时环境(如 process.env.NODE_ENV、location.hostname 或 UA)动态拼装配置:
- 开发环境:启用
debug: true、接入本地 mock 服务地址 - 测试环境:注入灰度开关、指定测试 appKey 或 token
- 生产环境:自动剔除调试字段,加载 CDN 域名与加密密钥
避免重复注入与配置覆盖冲突
第三方 SDK 往往只允许初始化一次,需加防重机制:
- 用闭包变量(如
let inited = false)或 WeakMap 缓存已处理的函数实例 - 检测参数中是否已有
config字段,有则跳过注入,仅做浅合并(不覆盖业务显式传入的 key) - 对多次调用同一初始化方法的场景,首次注入后返回缓存结果,后续直接 resolve 已初始化实例
适配不同 SDK 的导出形态
不是所有 SDK 都暴露顶层函数,需按实际形态选择代理方式:
- 全局对象方法(如
window.AlipaySDK.init):直接代理该属性值 - 原型方法(如
XMLHttpRequest.prototype.open):需在绑定后代理,保留this指向 - ESM 默认导出(如
import sdk from 'xxx-sdk'):在 import 后立即用 Proxy 包装再 re-export - UMD 模块(挂载在
window下):在脚本加载完成后遍历识别并批量代理关键方法










