meld.js快速上手指南:5分钟给任意函数加日志,不改一行代码
【免费下载链接】meldAOP for JS with before, around, on, afterReturning, afterThrowing, after advice, and pointcuts项目地址: https://gitcode.com/gh_mirrors/meld1/meld
如果你曾为了调试在业务代码里满屏插console.log而头疼,meld.js 就是为你准备的 JavaScript AOP(面向切面编程)工具:一行代码即可给任意函数或对象方法加上日志、计时、缓存等"外围"功能,完全不改动原始代码。本文带你 5 分钟上手这个轻量库 🚀
一句话理解 meld.js
meld.js 把 Java 世界著名的 AOP 思想搬到了 JavaScript:不侵入地给函数"附加"行为。它有 6 种 advice(建议/通知),分别挂在函数执行的不同时机上:
before—— 执行前on—— 执行后立刻afterReturning—— 正常返回后(拿到返回值)afterThrowing—— 抛异常后(拿到异常对象)after—— 无论返回还是抛异常,总会执行around—— 完整包裹,能改参数、改返回值,甚至拦截原函数不执行
🎯 核心优势:原函数始终不被修改,行为随时可以移除。
一行安装:3种常用方式
Node 环境最简单,一条命令搞定:
npm install meldvar meld = require('meld');浏览器 AMD 项目可用bower install meld,或克隆源码阅读:
git clone https://gitcode.com/gh_mirrors/meld1/meld库的核心实现在入口文件meld.js中,体积非常小。
核心玩法:5分钟给任意函数加日志
场景:想在doSomething方法返回后打印结果,但不想动原代码 👇
var myObject = { doSomething: function(a, b) { return a + b; } }; // 在返回成功后自动记录日志 var remover = meld.afterReturning(myObject, 'doSomething', function(result) { console.log('doSomething 返回: ' + result); }); myObject.doSomething(1, 2); // 控制台输出: "doSomething 返回: 3"再挂一个"执行前"的日志,只需把afterReturning换成before:
meld.before(myObject, 'doSomething', function(a, b) { console.log('入参: ' + a + ', ' + b); });一行 advice,日志就有了,原函数一行未改 ✅
6种advice速查表:按需选择
| Advice | 触发时机 | 收到的参数 | 典型用途 |
|---|---|---|---|
before | 函数执行前 | 与原函数相同 | 参数校验、入参日志 |
on | 执行完立刻 | 与原函数相同 | 调用统计、监控埋点 |
afterReturning | 正常返回后 | 返回值 | 结果日志 |
afterThrowing | 抛出异常后 | 异常对象 | 错误上报 |
after | 返回或抛异常都执行 | 返回值或异常 | 兜底清理 |
around | 完整包裹原函数 | joinpoint(含proceed) | 计时、缓存、修改参数/返回值 |
💡 新手建议:只想打日志,before+afterReturning组合基本够用;需要改返回值或做缓存时再上around。
批量加日志:用点切(pointcut)一次匹配多个方法
第二个参数支持 4 种匹配方式,轻松覆盖整组方法:
| 匹配方式 | 示例 | 效果 |
|---|---|---|
| 字符串 | 'save' | 精确匹配单个方法 |
| 数组 | ['save', 'update'] | 匹配数组中所有方法 |
| 正则 | /^fetch/ | 匹配fetch开头的所有方法 |
| 函数 | 返回方法名数组的函数 | 完全自定义规则 |
// 一条 advice 覆盖所有 fetch* 方法 meld.before(myObject, /^fetch/, function() { console.log('开始请求...'); });内置切面:trace、memoize、cache 开箱即用
除了手动写 advice,meld 还内置了 3 个"组合拳"切面,一行接入:
- trace(
aspect/trace.js):自动打印每个方法的 CALL / RETURN / THROW,排查调用链神器 🔍 - memoize(
aspect/memoize.js):相同参数自动记忆结果,第二次调用直接返回缓存 - cache(
aspect/cache.js):可指定任意存储介质的灵活缓存
var trace = require('meld/aspect/trace'); meld(myObject, trace()); // 所有方法的调用、返回、异常自动打日志随时关闭日志:remover.remove()
对对象方法添加 advice 时,返回值是"移除器"。调试完日志不再需要?一行还原现场:
var remover = meld.afterReturning(myObject, 'doSomething', fn); // ... 调试期间 remover.remove(); // 日志立刻消失,业务代码干干净净⚠️ 小提示:advice 直接加在独立函数或构造函数上时,返回的是一个新函数,原函数保持不变,不用"移除",直接换回原函数即可。
进阶学习路线
想继续深入,按顺序阅读仓库内文档即可(无需安装,纯 Markdown):
docs/api.md—— 完整 API,每种 advice 的参数与返回值docs/reference.md—— 概念参考:joinpoint、advice 执行顺序、函数/构造函数切面示例docs/aspects.md—— 内置切面详解,含自定义 reporter 和 key 生成器test/目录 —— 每类 advice 都有对应的测试用例,照着读比看文档更快
总结
meld.js 把"加日志、做监控、上缓存"这些横切关注点从业务代码里彻底剥离:装一行、写三行、随时移除。给任意函数加日志真的只要 5 分钟,剩下的交给 AOP ✨
【免费下载链接】meldAOP for JS with before, around, on, afterReturning, afterThrowing, after advice, and pointcuts项目地址: https://gitcode.com/gh_mirrors/meld1/meld
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考