web-view 必须使用已配置的 HTTPS 业务域名,禁用 HTTP、IP、localhost 等;需校验文件、主体认证、基础库 ≥1.6.4;URL 参数须 encodeURIComponent;bindmessage 仅销毁时触发,非实时通信;web-view 全屏覆盖,不支持混排。

不能直接用 HTML 文件路径或本地文件协议加载 web-view,必须走 HTTPS 域名,且该域名已配置为小程序“业务域名”——否则白屏、报错 net::ERR_CONNECTION_REFUSED 或直接不渲染。
web-view 的 src 必须是 HTTPS 域名,且已在后台完成业务域名配置
微信强制要求所有 web-view 加载的网页地址必须属于已备案、已校验的 HTTPS 域名。HTTP、IP 地址、localhost、file://、以及未添加到「开发设置 → 业务域名」里的任何域名,一律拒绝加载。
- 配置路径:微信公众平台 → 小程序后台 → 开发 → 开发设置 → 业务域名 → 下载校验文件(如
MP_verify_xxxx.txt)→ 上传至你 H5 域名的根目录(例如https://h5.example.com/MP_verify_xxxx.txt可直连访问)→ 保存生效 - 个人类型小程序不支持 web-view,仅企业/政府/媒体等认证主体可用
- 基础库版本必须 ≥ 1.6.4,开发者工具需更新到最新稳定版(2026 年建议 ≥ 1.08.2604000)
- 调试时可临时勾选「不校验合法域名」,但真机测试和上线前必须关闭该选项,否则用户端必然失败
src 参数传递要 encode,中文和特殊字符必须 encodeURIComponent
iOS 端对 URL 中未编码的中文、空格、&、= 等字符极其敏感,常见现象是页面白屏、加载中断或 bindload 不触发。Android 虽稍宽容,但统一处理更稳妥。
- 小程序端拼接 URL 时务必用
encodeURIComponent:const h5Url = `https://h5.example.com/page?uid=${encodeURIComponent(uid)}&name=${encodeURIComponent('张三')}`; - H5 页面获取参数时,用
decodeURIComponent解码,不要依赖浏览器自动处理 - 避免在 URL 中使用 fragment(# 后内容)传关键数据,iOS 下部分场景会丢失;query 参数更可靠
- 如果 H5 页面本身依赖 hash 路由(如 Vue Router history 模式),可在 src 后加
#wechat_redirect提升 iOS 兼容性
bindmessage 不是实时通信通道,别当 postMessage 用
bindmessage 仅在 H5 页面销毁(如用户点击返回、跳转新页、web-view 组件被卸载)时批量触发,不是事件监听器。H5 调用 wx.miniProgram.postMessage 后,小程序不会立刻收到,而是攒着等销毁时刻统一派发。
立即学习“前端免费学习笔记(深入)”;
- 适合传递终态数据:登录凭证、表单提交结果、支付完成状态等“一次性结论”
- 不适合做实时交互:比如聊天消息、滚动位置同步、按钮点击反馈等,这类需求得换方案(如 URL query 跳转、localStorage + 页面 reload、或后端中转)
- H5 端调用
postMessage前,务必检查typeof wx !== 'undefined' && wx.miniProgram,防止非微信环境报错 - 小程序端接收时,
e.detail.data是数组(即使只发一次),需遍历处理:e.detail.data.forEach(item => { /* ... */ })
web-view 会覆盖整个页面,无法与小程序原生组件混排
web-view 是全屏容器,层级最高,会遮盖 view、button、自定义 tabBar 等一切同层元素。它不支持 flex 布局嵌套、position 定位偏移,也不响应 z-index。
- 若需顶部导航栏,只能靠 H5 自己渲染;小程序侧可通过
navigationStyle: custom隐藏原生导航,再让 H5 页面接管顶部样式 - 下拉刷新、分享按钮、右上角胶囊按钮等原生能力仍可用,但无法在 H5 内直接控制其显隐
- 无法实现“H5 内容 + 底部小程序按钮”的混合布局,这是设计限制,不是 bug
- 页面切换建议用
wx.navigateTo打开新 web-view 页面,而非在当前页动态改src—— 动态改 src 在某些安卓机型上会触发白屏重绘
最常被忽略的一点:web-view 加载失败时,既不会抛 JS 异常,也不会触发 binderror(该事件早已废弃),唯一可观测信号是 bindload 不执行 + 控制台静默。此时应优先查域名配置、HTTPS 证书有效性、校验文件可访问性,而不是调代码逻辑。



















