插件与扩展
插件是 WeAppDev 的扩展系统。装插件不用打包、不用签名 —— 一个 HTML 文件就够了。
它和浏览器扩展的思路不一样:小程序没有统一的 DOM,逻辑层和渲染层还是两个进程。所以一个插件要开三个入口:浮窗面板、逻辑层脚本、渲染层脚本,分别使用三个全局变量 wadPanelLayer / wadLogicLayer / wadRenderLayer,跨层那一段由宿主转发。
从哪进
| 入口 | 路径 |
|---|---|
| 插件管理 | 开发者工具 → 插件 |
| 小程序浮窗 | 打开小程序 → 右上角「⋯」→ 插件 |
| 插件市场 | 插件页底部 Tab / 管理页 |
安装
点击插件页右上角的「+」,支持三种方式:
- 粘贴 HTML:直接把单文件插件的内容贴进去;
- 远程 URL:填一个可访问的 HTML 地址;
- 本地文件:选择一个
.html或.zip。
zip 包的结构:
my-plugin.zip
├── plugin.html # 入口,必需
├── logo.png # 可选,插件图标
└── README.md # 可选,详情页说明安装前会做一次 Chromium 语法预检:所有内联脚本先用 new Function(src) 编译,语法错误直接拒绝,不会写盘。
管理
插件列表支持搜索(名称 / 包名 / 作者)、分类筛选、启用开关、查看详情、卸载。
- 同一个包名重复安装会覆盖升级;
- 同时启用的插件上限是 120 个;
- 顶部总开关可以一次性停用全部插件。
插件市场
管理员可以在后台把插件打包上传,填写分类、版本、更新说明。客户端在「插件市场」里浏览、一键安装和更新。
市场里的每个插件同样会经过语法预检;安装后仍然是本地文件,不依赖远程运行。
它依赖调试通道
插件的逻辑层与渲染层注入都走 CDP。因此:
- 调试通道关闭时,插件零注入:面板还能打开,但
logic / storage / network都不工作; - 打开小程序时才注入;切换小程序会重新注入;
- 同一代逻辑层连续失败 2 次、渲染层连续失败 3 次,会自动停止注入,下一代重试。
这是有意设计的边界:任何时候关掉调试,就回到「什么都没发生」的状态。
生命周期
| 事件 | 时机 |
|---|---|
attach | 插件注入到当前小程序上下文(每次注入都重发:启停 / 白名单变化 / 换页重注入) |
detach | 停用、卸载或切换小程序(页面导航销毁不派 detach) |
pageChange | 页面路由变化 |
storageWrite | 业务调用 wx.setStorage* |
| network | 捕获到 HTTP / WS 摘要(订阅用 capture.watch 或逻辑层 onNetwork,on('network') 已移除) |
写插件时,DOM 修改要做成幂等(每次注入都重新收敛);detach 只在停用/卸载/切小程序时触发,页面导航销毁不派发。完整时序见 生命周期与回调。
示例插件
App 首次启动会安装三个可卸载的系统预置插件(1.0.0,均支持导出分享):
| 插件 | 能力 |
|---|---|
界面元素修改 text-editor | 给页面文字加虚线框,点击直接改文案;可禁止原点击事件;跨页面保持,关闭立即还原 |
定位调试 location-editor | 接管 wx.getLocation / wx.getFuzzyLocation,返回自定义经纬度;面板可读取系统真实坐标,并与小程序实际拿到的坐标对照 |
缓存管理 storage-inspector | 查看/新增/删除小程序 Storage,实时监听 storageWrite |
市场里另有 云网关捕获(gateway-capture,加密包,捕获 get_service_info 下发的 key 并解密流量)、跳一跳无敌(jump-invincible,动作断点自动改落点/自定义分数,一次性生效无暂停感)、JSLogin 替换(login-code-switcher)等插件可一键安装。预置插件卸载后,可从市场重新装回。
其余示例还包括网络观察、网络重写规则、存储检查、路由监控、面板组件库等。插件也可以把 CSS、图片、外部 JS、WASM 一起打进 zip,见 资源与 WASM。