From abfe3ffe5f6d161f2a6466c8bdbcbc17de1e64b6 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期四, 05 十一月 2026 17:43:27 +0800
Subject: [PATCH] fix(map): v2.0 补 HOST_TYPE;诊断页延长等待并修正协议
---
src/components/map/src/utils.ts | 100 ++++++++++++++++++++++++-------------------------
1 files changed, 49 insertions(+), 51 deletions(-)
diff --git a/src/components/map/src/utils.ts b/src/components/map/src/utils.ts
index 8937315..5fbfe95 100644
--- a/src/components/map/src/utils.ts
+++ b/src/components/map/src/utils.ts
@@ -1,24 +1,26 @@
/**
* 鐧惧害鍦板浘 SDK 鍔犺浇宸ュ叿
*
- * 鍔犺浇鏂瑰紡璇存槑锛堣俯杩囩殑鍧戯級锛�
+ * 鈿狅笍 鏈儴缃茬幆澧冿紙鍚鎴风鎵�鍦ㄧ綉缁滐級IPv6 涓嶉�氾紝鑰岀櫨搴︽墍鏈夋湇鍔″煙鍚嶇殑 DNS
+ * 閮戒紭鍏堣繑鍥� AAAA锛圛Pv6锛夎褰曪紝娴忚鍣ㄤ紭鍏堣繛 IPv6 浼氱珛鍗冲け璐モ�斺��
+ * 琛ㄧ幇涓� script 鐨� error 浜嬩欢 1 绉掑唴瑙﹀彂锛屽湴鍥惧畬鍏ㄥ姞杞戒笉鍑烘潵銆�
+ * 鏈嶅姟鍣ㄤ晶瀹炴祴锛歝url -4 寰楀埌 HTTP 200 / 0.94s锛沜url -6 鐩存帴澶辫触銆�
*
- * 1. 涓嶈兘鐢� api?v=1.0&type=webgl&ak=xxx 杩欎釜鍦板潃銆�
- * 瀹冭繑鍥炵殑鏄竴娈� document.write('<script src=".../getscript?...">')锛�
- * 鑰岄�氳繃 document.body.append(script) 鍔ㄦ�佹彃鍏ョ殑鑴氭湰閲� document.write 浼氳娴忚鍣ㄦ嫤鎴紝
- * 瀵艰嚧鐪熸鐨� SDK 浠庢湭鎵ц銆亀indow.BMapGL 涓�鐩存槸绌猴紱浣� api 鐨� callback 浠嶄細琚皟鐢紝
- * 璋冪敤鏂硅鍒ゆ垚鍔燂紝鎺ョ潃 new BMapGL.Map() 灏辨姏
- * "Cannot read properties of null (reading 'Map')"銆�
+ * 鍥犳杩欓噷鍔犺浇鐨勬槸銆屾湰绔欐敼鍐欑増 SDK銆�/bmap-sdk.js锛�
+ * 鎶� SDK 鍐呴儴鎵�鏈夌櫨搴﹀煙鍚嶏紙api.map.baidu.com銆乤pimaponline0-3.bdimg.com銆�
+ * apisv0/1.bdimg.com銆亀ebmap0.bdimg.com銆乵ap.baidu.com 鈥︼級
+ * 鍏ㄩ儴鏇挎崲涓� window.location.host + /bmap-xxx锛�
+ * 鐢辨湇鍔″櫒 nginx 鐢ㄥ浐瀹� IPv4 鍥炴簮锛屽鎴风鍙闂湰绔� 9023銆�
+ * 锛堟敼鍐欒剼鏈敓鎴愶紝瑙� nginx bmap-proxy.conf 涓� public/bmap-sdk.js锛�
*
- * 2. 蹇呴』鐩磋繛 getscript锛屽畠鏄� 875KB 鐨勭湡瀹� SDK銆�
+ * 鍔犺浇椤哄簭锛�
+ * 1. /bmap-sdk.js 鈥斺�� 鏈珯鏀瑰啓鐗堬紙鐡︾墖銆佹帴鍙d篃鍏ㄩ儴璧颁唬鐞嗭級
+ * 2. /bmap-api/getscript 鈥斺�� 鏈珯鏈敼鍐欎唬鐞嗭紙鍏滃簳锛�
+ * 3. https://api.map.baidu.com/getscript 鈥斺�� 鐩磋繛鐧惧害锛圛Pv6 閫氱殑鐜鍙敤锛�
*
- * 3. 鍔犺浇鍓嶈璁剧疆 window.BMAP_PROTOCOL = 'https'锛堢櫨搴﹀畼鏂硅姹傦級锛�
- * 鍚﹀垯 SDK 鍐呴儴鎸夐粯璁ゅ崗璁嫾瀛愯祫婧愬湴鍧�锛孒TTPS 椤甸潰涓嬩細琚綋浣滄贩鍚堝唴瀹规嫤鎴��
- *
- * 4. 涓嶈缁� script 鍔� async = true锛歋DK 鍐呴儴鐢� document.currentScript 瀹氫綅鑷韩锛�
- * async 鑴氭湰鎵ц鏈熼棿 currentScript 涓� null锛屼細璁╁畠璧板埌 fallback 鍒嗘敮鐢氳嚦鎷夸笉鍒拌嚜韬湴鍧�銆�
- *
- * 5. 澶辫触閲嶈瘯涓�娆★細鍋跺彂缃戠粶鎶栧姩锛堝挨鍏舵槸璺ㄧ渷/绉诲姩缃戠粶锛夐噸璇曞線寰�灏辫兘杩囥��
+ * 鍏朵粬娉ㄦ剰锛氬姞杞藉墠瑕佽 window.BMAP_PROTOCOL = 'https'锛�
+ * 涓嶈缁� script 鍔� async锛圫DK 渚濊禆 document.currentScript锛夛紱
+ * script 鐨勪簨浠跺悕鏄� error 涓嶆槸 onerror銆�
*/
// 鎵╁睍 Window 鎺ュ彛浠ュ寘鍚櫨搴﹀湴鍥� GL API
@@ -32,40 +34,31 @@
// SDK 鍔犺浇鐘舵��
let loadPromise: null | Promise<void> = null;
-// 鍔犺浇澶辫触娆℃暟锛岀敤浜庡喅瀹氭槸鍚﹂噸璇�
-let failCount = 0;
-/** 鍗曟灏濊瘯鍔犺浇 */
-function loadOnce(accessKey: string, timeout: number): Promise<void> {
+/** 鐢ㄦ寚瀹氬湴鍧�鍔犺浇涓�娆� */
+function loadFrom(url: string, timeout: number): Promise<void> {
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
- reject(new Error('鐧惧害鍦板浘 SDK 鍔犺浇瓒呮椂锛岃妫�鏌ョ綉缁�'));
+ reject(new Error(`鐧惧害鍦板浘 SDK 鍔犺浇瓒呮椂锛�${url}`));
}, timeout);
const script = document.createElement('script');
- script.src = `https://api.map.baidu.com/getscript?type=webgl&v=1.0&ak=${accessKey}&services=&t=${Date.now()}`;
- // 娉ㄦ剰锛氫笉瑕佽 async锛孲DK 渚濊禆 document.currentScript 瀹氫綅鑷韩
+ script.src = url;
+ // 涓嶈璁� async锛歋DK 渚濊禆 document.currentScript 瀹氫綅鑷韩
script.addEventListener('load', () => {
clearTimeout(timeoutId);
if (!window.BMapGL) {
- // ak 鏃犳晥 / 鍩熷悕鏈巿鏉� / 琚嫤鎴椂锛岃剼鏈兘鍔犺浇浣嗕笉浼氭寕杞� BMapGL
- reject(
- new Error('鐧惧害鍦板浘鍔犺浇寮傚父锛氭湭鑾峰彇鍒板湴鍥惧璞★紝璇锋鏌� Key 鎴栧煙鍚嶆巿鏉�'),
- );
+ reject(new Error(`鑴氭湰宸蹭笅杞戒絾鏈寕杞藉湴鍥惧璞★細${url}`));
return;
}
resolve();
});
- // 浜嬩欢鍚嶆槸 error锛屼笉鏄� onerror锛堝啓 onerror 姘歌繙涓嶄細瑙﹀彂锛�
+ // 浜嬩欢鍚嶆槸 error锛屼笉鏄� onerror
script.addEventListener('error', () => {
clearTimeout(timeoutId);
- reject(
- new Error(
- '鐧惧害鍦板浘 SDK 鍔犺浇澶辫触锛堟棤娉曡闂� api.map.baidu.com锛屽彲鑳芥槸缃戠粶闄愬埗鎴栨彃浠舵嫤鎴級',
- ),
- );
+ reject(new Error(`鍔犺浇澶辫触锛�${url}`));
});
document.body.append(script);
@@ -74,16 +67,13 @@
/**
* 鍔犺浇鐧惧害鍦板浘 GL SDK
- * @param timeout 瓒呮椂鏃堕棿锛堟绉掞級锛岄粯璁� 10000
+ * @param timeout 鍗曟灏濊瘯鐨勮秴鏃舵椂闂达紙姣锛夛紝榛樿 10000
* @returns Promise<void>
*/
export const loadBaiduMapSdk = (timeout = 10_000): Promise<void> => {
- // 宸插姞杞藉畬鎴�
if (window.BMapGL) {
return Promise.resolve();
}
-
- // 姝e湪鍔犺浇涓紝杩斿洖鍚屼竴涓� Promise
if (loadPromise) {
return loadPromise;
}
@@ -94,25 +84,33 @@
}
// 鐧惧害瀹樻柟瑕佹眰锛氬厛澹版槑鍗忚锛岄伩鍏� HTTPS 椤甸潰涓� SDK 鎷煎嚭 http 瀛愯祫婧愬湴鍧�
- if (typeof window !== 'undefined') {
- window.BMAP_PROTOCOL = 'https';
- window.BMapGL_loadScriptTime = Date.now();
- }
+ window.BMAP_PROTOCOL = window.location.protocol.replace(':', '');
+ // v2.0 蹇呴渶锛氬畼鏂� api?v=2.0 浼氳缃� HOST_TYPE='2'锛岀洿鎺ョ敤 getscript 鏃惰鑷繁琛�
+ (window as any).HOST_TYPE = '2';
+ window.BMapGL_loadScriptTime = Date.now();
+
+ const query = `type=webgl&v=1.0&ak=${accessKey}&services=&t=${Date.now()}`;
+ const candidates = [
+ // 鏈珯鏀瑰啓鐗堬細鍐呴儴鍩熷悕鍏ㄩ儴鎸囧悜鏈珯浠g悊锛岀摝鐗�/鎺ュ彛閮借蛋 IPv4
+ '/bmap-sdk.js',
+ // 鏈珯浠g悊鐨勫畼鏂� SDK锛堟湭鏀瑰啓锛岀摝鐗囦粛鎸囧悜鐧惧害锛屼粎浣滃厹搴曪級
+ `/bmap-api/getscript?${query}`,
+ // 鐩磋繛鐧惧害锛堜粎 IPv6 姝e父鐨勭幆澧冩湁鏁堬級
+ `https://api.map.baidu.com/getscript?${query}`,
+ ];
loadPromise = (async () => {
- try {
- await loadOnce(accessKey, timeout);
- } catch (error) {
- // 棣栨澶辫触閲嶈瘯涓�娆★紝搴斿鍋跺彂缃戠粶鎶栧姩
- if (failCount < 1) {
- failCount += 1;
- await loadOnce(accessKey, timeout);
- } else {
- failCount = 0;
- loadPromise = null;
- throw error;
+ const errors: string[] = [];
+ for (const url of candidates) {
+ try {
+ await loadFrom(url, timeout);
+ return;
+ } catch (error: any) {
+ errors.push(error?.message ?? String(error));
}
}
+ loadPromise = null;
+ throw new Error(`鐧惧害鍦板浘 SDK 鍔犺浇澶辫触锛�${errors.join(' | ')}`);
})();
return loadPromise;
--
Gitblit v1.9.3