事件系统(on / off / emit)
| 方法 | 签名 | 说明 |
|---|---|---|
wad.on | on(name, fn) → wad | 订阅事件,可链式 |
wad.off | off(name, fn) → wad | 取消订阅 |
wad.emit | emit(name, data) → wad | 广播,三个上下文互通 |
wad.onAny | onAny(fn) → unbind | 全量监听 |
生命周期事件
| 事件 | 触发时机 | 参数 |
|---|---|---|
attach | 插件加载到当前小程序上下文 | { appid, version } |
detach | 从当前配置移除(停用 / 卸载 / 切小程序) | 无 |
pageChange | 页面路由变化 | { route, options, appid } |
storageWrite | 业务调用 storage 写 API | { op, key, value, plugin } |
network | 捕获到 HTTP / WS 摘要 | { url, method, status, kind, ws, dir, len, id, at } |
nativeReq | JSAPI 请求进入 native 边界 | { api, appid, seq, body } |
nativeResp | native 响应回到 JSAPI 之前 | { api, appid, seq, body } |
| 自定义 | wad.emit | data 原样 |
attach 会重复触发
安装、更新、启停、appid 过滤变化都会重新触发 attach。初始化逻辑要幂等。
完整示例
js
// 逻辑层
wad.on('attach', function (appid) {
wad.log('注入到 ' + appid);
// 一次性初始化:包装 wx API、绑定事件等
});
wad.on('detach', function () {
wad.log('插件已卸载');
// 必须还原包装、清理定时器
});
wad.on('pageChange', function (p) {
wad.log('路由: ' + p.route + ' 参数: ' + JSON.stringify(p.options));
});network:首次订阅自动开捕获
js
// 面板或逻辑层;订阅时 SDK 自动 net.subscribe,
// 最后一个订阅者离开时宿主自动还原捕获状态。
wad.on('network', function (e) {
if (e.status >= 400) {
wad.ui.toast('请求失败 ' + e.status + ': ' + e.url.slice(0, 60));
}
});storageWrite:监控业务写入
js
wad.on('storageWrite', function (e) {
// e.op: 'set' | 'remove' | 'clear'
if (e.key.indexOf('token') >= 0) {
wad.log('token 被写入: ' + e.value);
}
});插件自己命名空间的写入不会触发这个回调,避免自反馈。
nativeReq / nativeResp:改写 JSAPI
nativeReq 在请求出栈前触发,nativeResp 在响应回给业务之前触发。返回一个 JSON 对象即可替换 body:
js
wad.on('nativeReq', function (d) {
// d = { api, appid, seq, body } body 是业务 JSON 字符串
var o = JSON.parse(d.body);
o.__probe = 1;
return o; // 返回对象 = 用新 body 发出去
});
wad.on('nativeResp', function (d) {
if (d.api === 'operateWXData') {
var o = JSON.parse(d.body);
o.__from = 'wad';
return o; // 返回对象 = 改写响应
}
});规则:
- 必须先订阅:宿主只对声明过
nativeReq/nativeResp的插件派发; - 按 appid 过滤:插件配置的
appids为*或包含当前 appid 才会收到; - 链式:后一个插件看到前一个插件的输出;
- 超时降级:单插件 260ms、单请求总预算 900ms,超时用当前结果继续,不阻塞网络;
- 只有 JSON 对象 / 数组文本会被采纳,其它返回值视为「没改」。
性能
每派发一次就是一次 Runtime.evaluate 往返。不要在没有过滤的情况下对全量请求做重活。
appids 过滤
插件默认对所有小程序生效。宿主只对「启用 + appid 命中」的插件派发事件:
http
POST /v1/plugins/<id>/appids
{ "appids": "wx1234567890abcdef,wxaaaaaaaaaaaaaaaa" }* 表示全部。完整的注入与重试时序见 生命周期与回调。
自定义事件:三端互通
js
// 逻辑层发
wad.emit('my-metric', { cpu: 12.5 });
// 面板收
wad.on('my-metric', function (data) { render(data); });
// 渲染层发 → 逻辑层收
wad.logic.emit('from-dom', { width: innerWidth });注意
emit的 data 必须 JSON 可序列化;- 事件名任意字符串,建议加插件前缀;
off需要传同一个函数引用,匿名函数无法解绑。要解绑就先存引用,或者用onAny返回的解绑函数。