核心 API(身份 / instance / ready / log)
三个上下文各有自己的全局变量(wadLogicLayer / wadRenderLayer / wadPanelLayer),但它们都带同一套元信息与基础能力:身份常量、实例快照、ready、log。本章是三者共有的部分。
本页你将学到
- 每个全局变量上有哪些身份常量(id / appid / instanceId…);
instance()快照里有什么;ready与onReady的时机差异;- 统一的错误码约定。
身份与常量
字段一览
一句话:每个全局变量都自带「我是谁」的常量,直接读属性,不发请求。
| 属性 | 类型 | 层 | 说明 |
|---|---|---|---|
apiVersion | '1.0' | 三层 | 插件 API 版本 |
layer | 'logic'|'render'|'panel' | 三层 | 当前运行的层 |
id | string | 三层 | 插件 id(meta wad:package) |
appid | string | 三层 | 当前小程序 APPID(未注入到小程序时空串) |
version | string | 逻辑/渲染;面板 | 逻辑/渲染为插件版本名(meta wad:version);面板为 SDK 版本 '1.0',插件版本用 instance().version |
instanceId | string | 三层 | 本层实例标识,见下表 |
clientId | string | 面板 | 总线分配的本次连接 id(面板重开就换) |
theme | 'light' | 面板 | 面板固定亮色 |
| 层 | instanceId | 说明 |
|---|---|---|
| 逻辑层 | 'logic' | 一个小程序上下文里同一插件只有一份逻辑层实例 |
| 渲染层 | 'render-xxxxxx' | 每次页面注入随机生成 |
| 面板层 | = clientId | 面板每次打开是全新 WebView |
// 逻辑层
console.log(wadLogicLayer.id, wadLogicLayer.version, wadLogicLayer.appid);注意点:instance() 只返回 id/pluginId/name/version/appid/layer/page/instanceId/apiVersion,不含 author/description;面板可读完整元信息 wadPanelLayer.plugin / info().plugin。
instance() → object
当前插件实例快照(本地取值,不经过 RPC)。
// 面板
wadPanelLayer.instance();
// { id, pluginId, name, version, appid, layer: 'panel', instanceId, apiVersion: '1.0' }
// 逻辑层(多 page 字段:当前页面路由)
wadLogicLayer.instance();
// { id, name, version, appid, layer: 'logic', instanceId: 'logic', page: 'pages/index/index', apiVersion: '1.0' }
// 渲染层(page = location.href)
wadRenderLayer.instance();
// { id, name, version, appid, layer: 'render', instanceId: 'render-x3k9p2', page: 'http://…', apiVersion: '1.0' }注意点:面板缺 name 时回退为 id;逻辑层 page 取 getCurrentPages() 栈顶路由,取不到为空串。
ready 与 onReady
ready → Promise
就绪 Promise。resolve 结果缓存,随时 .then 都安全。
- 面板:总线首次连上后 resolve(断线自动重连 1.5s,不影响已 resolve 的缓存);
- 逻辑层 / 渲染层:注入完成即兑现,脚本顶层可直接用全局变量。
// 面板:任何地方都可以直接挂,不用关心时序
wadPanelLayer.ready.then(function () { wadPanelLayer.log('bus online'); });onReady(fn)
钩子糖版本,返回解绑函数(详见 生命周期与回调)。
const off = wadPanelLayer.onReady(function () {
wadPanelLayer.log('bus online');
});log(...)
三层通用,写到 App「插件」页日志面板(面板层还会同步打到 console)。
wadPanelLayer.log('hello', {a: 1}, [1, 2]);注意点:参数会逐个 String() 拼接,对象传引用即可(SDK 里做了 try/catch)。
面板总线辅助 API
| API | 返回 | 说明 |
|---|---|---|
connected() | boolean | 总线 WebSocket 是否已连上 |
info() | {id, appid, plugin} | 本地读取,不发 RPC |
call(method, ...args) | Promise | 直接发总线 RPC(宿主方法名,如 logic.call) |
rpcWithTimeout(method, args, ms) | Promise | 带自定义超时的总线 RPC(args 必须是数组) |
onAny(fn(name, data, meta)) | 解绑函数 | 订阅所有 messaging 事件 |
call/rpcWithTimeout 是底层逃生口;日常请用 logicLayer.* / renderLayer.* / capture.* / debugger.* 的封装。
错误约定
所有 reject 的 Error 都带 .code,可直接分支处理:
| code | 含义 |
|---|---|
TIMEOUT | RPC 超时(总线 4s;面板 SDK 客户端兜底 6s;HTTP 请求 60s) |
BUS_DISCONNECTED | 总线断开(自动重连中) |
E_LAYER_ONLY | 调用了本层不支持的 API(见 三层 API 对比) |
PLUGINS_DISABLED / CDP_DISABLED / LOGIC_UNAVAILABLE / RENDER_UNAVAILABLE | 宿主拒绝/未就绪 |
NOT_FOUND | 插件/资产不存在 |
补充:E_STORE_TIMEOUT 是 logic/render sharedStorage 的 Error message(15s),不是 .code;SEND_FAILED 不存在,面板出站 >200KB 会排队并最终 TIMEOUT。
wadPanelLayer.logicLayer.page().catch(function (e) {
if (e.code === 'E_LAYER_ONLY') wadPanelLayer.log('本层不支持');
});