news 2026/8/23 16:49:50

meld.js快速上手指南:5分钟给任意函数加日志,不改一行代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
meld.js快速上手指南:5分钟给任意函数加日志,不改一行代码

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 meld
var 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 个"组合拳"切面,一行接入:

  • traceaspect/trace.js):自动打印每个方法的 CALL / RETURN / THROW,排查调用链神器 🔍
  • memoizeaspect/memoize.js):相同参数自动记忆结果,第二次调用直接返回缓存
  • cacheaspect/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):

  1. docs/api.md—— 完整 API,每种 advice 的参数与返回值
  2. docs/reference.md—— 概念参考:joinpoint、advice 执行顺序、函数/构造函数切面示例
  3. docs/aspects.md—— 内置切面详解,含自定义 reporter 和 key 生成器
  4. 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 16:43:07

Reia开发者路线图:开源RPG MMO未来更新计划与功能预览指南

Reia开发者路线图:开源RPG MMO未来更新计划与功能预览指南 【免费下载链接】Reia RPG game action-adventure MMO built with Godot and Rust. 项目地址: https://gitcode.com/gh_mirrors/re/Reia Reia 是一款基于 Godot 4.x Rust 构建的开源动作冒险 RPG MM…

作者头像 李华
网站建设 2026/8/23 16:41:56

TRON账户模型与交易机制详解:3种创建账户方式与UTXO有何不同

TRON账户模型与交易机制详解:3种创建账户方式与UTXO有何不同 【免费下载链接】documentation Documentations of project TRON 项目地址: https://gitcode.com/gh_mirrors/documentat/documentation 本文带你系统了解 TRON账户模型 与 交易机制:T…

作者头像 李华
网站建设 2026/8/23 16:41:50

JetBrains 试用期重置:30 天评估倒计时恢复的 2 条路线

JetBrains 试用期重置:30 天评估倒计时恢复的 2 条路线 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你正在写代码,右下角弹出灰色倒计时:试用期只剩 3 天。随后部分功能被锁…

作者头像 李华