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