用 proxy 动态代理第三方库导出对象,可在不修改源码前提下添加日志、监控等功能;通过 get 和 apply 拦截器增强函数调用,透传非函数属性;node.js 中可替换 require.cache,前端构建时可用插件静态包裹,需注意 tostring 等内置方法及不可枚举属性的兼容处理。

直接用 JavaScript 的 Proxy 包一层,就能在不碰第三方库源码的前提下,给它的导出对象加日志、监控、缓存、权限校验等能力。关键不是改它,而是“劫持它的出口”。
用 Proxy 动态代理导出对象
第三方库(比如 lodash-utils)通常以模块形式导出一个对象,里面是多个函数。你可以在加载它之后,立刻用 Proxy 包裹这个对象,拦截所有属性访问和方法调用:
- 用
get拦截器判断访问的是否为函数,是则返回一个带增强逻辑的包装函数 - 用
apply拦截器在函数执行前后插入自定义逻辑(如计时、打点、错误捕获) - 非函数属性(如常量、配置)可直接透传,保持原行为不变
在 Node.js 中拦截已加载模块
CommonJS 环境下,模块加载后会缓存在 require.cache 中。你可以手动替换缓存项的 exports:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 先
require('lodash-utils')获取原始对象 - 构造
Proxy增强它,例如自动记录每个函数的执行耗时 - 再把
require.cache[modulePath].exports指向该代理对象 - 后续所有
require('lodash-utils')都会拿到增强后的版本
在前端构建时做静态包裹(推荐用于生产)
Webpack 或 Vite 等工具支持在打包阶段重写模块导入。例如在 Vite 插件中匹配路径 /node_modules/lodash-utils/:
- 用
transform钩子读取原始模块代码 - 注入 wrapper 代码:先
import original from 'lodash-utils',再export default new Proxy(original, {...}) - 这样所有导入都自动走代理,无需修改业务代码
- 构建时完成,零运行时开销,也避免污染 Node.js 缓存
注意边界与兼容性
Proxy 虽灵活,但有些行为需显式处理:
- 若原对象有
toString、valueOf等内置方法,代理默认不转发,需在get中特别放行 - 原对象若用了
Object.defineProperty设置不可枚举属性,Proxy 的ownKeys和getOwnPropertyDescriptor也要同步实现 - ESM 中不能直接改
import绑定,必须通过构建插件或顶层export * from+export default包裹方式介入










