fix(map): 按百度官方规范修正 SDK 加载,并加诊断页定位线上加载失败
客户要求「地图必须能用」,重新排查后修正三处:
1. 加载前设置 window.BMAP_PROTOCOL = 'https' 与 BMapGL_loadScriptTime
百度官方要求在加载 SDK 前声明协议,否则 SDK 内部按默认协议拼子资源地址,
HTTPS 页面下会被当成混合内容拦截。SDK 里实测引用了 apimaponline0-3.bdimg.com、
webmap0.bdimg.com、apisv0/1.bdimg.com 等多个资源域名,协议不对会连锁失败。
2. 去掉 script.async = true
SDK 内部用 document.currentScript 定位自身地址(getscript 里出现 3 次),
async 脚本执行期间 currentScript 为 null,会让它走 fallback 分支。
3. 首次失败自动重试一次
跨省/移动网络偶发抖动时,重试往往能过。
另外新增 public/bmap-test.html 诊断页(部署后访问 /bmap-test.html):
用与正式代码完全相同的加载方式,逐步输出
浏览器 UA / 页面协议 / 是否在线 / 请求 URL
→ load 或 error 事件
→ window.BMapGL 是否挂载
→ 能否真正创建地图并渲染
并附上可直接在地址栏打开的 URL 做对比测试。
拿到客户这个页面的日志,就能区分是网络拦截、Key 白名单还是代码问题。
注:getscript 实测(含模拟 Chrome UA + 线上 Referer)返回 HTTP 200 / 875KB 完整 SDK /
business:0 / unauth:0,Key 本身有效。