我爱模板网在使用qiankun.js开发时,子应用用到了百度地图,所以在index.html中引入了百度库:
<script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=6L6IWCvDj1mHKBR6GBmTPhVmTuR0Q4Rp"></script>
此时运行项目会报:
Uncaught TypeError: application 'workFlow' died in status LOADING_SOURCE_CODE: Failed to fetch
截图如下:

chrome network显示如下:

这个报错是百度地图api的跨域问题。
解决方案一
将下面的js在主应用中引入
<script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=6L6IWCvDj1mHKBR6GBmTPhVmTuR0Q4Rp"></script>
解决方案二
1、主应用
修改主应用中的start方法
start()
修改为
start({
prefetch: false,
excludeAssetFilter: assetUrl => {
const whiteList = ['https://api.map.baidu.com/api?v=3.0&ak=您的key&_custom-exclude_=MAIN']
const whiteWords = ['_custom-exclude_=MAIN']
if (whiteList.includes(assetUrl)) {
return true
}
return whiteWords.some(w => {
return assetUrl.includes(w)
})
}
})说明:
excludeAssetFilter - (assetUrl: string) => boolean - 可选,指定部分特殊的动态加载的微应用资源(css/js) 不被 qiankun 劫持处理
2、子应用
新建utils/loadScript.js
export default {
init: function (){
return new Promise((resolve, reject) => {
// 如果已加载直接返回
if(typeof BMap !== "undefined") {
resolve(BMap);
return true;
}
// 百度地图异步加载回调处理
window.bMapInit = function () {
// console.log("百度地图脚本初始化成功...");
resolve(BMap);
};
// 插入script脚本
let scriptNode = document.createElement('script');
scriptNode.src = 'https://api.map.baidu.com/api?v=3.0&ak=您的key&_custom-exclude_=MAIN&callback=bMapInit';
document.body.appendChild(scriptNode);
});
},
}说明:大部分cdn引入的js,只需要动态加载就可以了。百度地图api js 比较特殊,它里面还引入了其他js,不采用这种方式,会导致 BMap is undefined
3、使用:
import BMap from '../utils/loadScript.js'
BMap.init().then(BMap => {
this.map = new BMap.Map("map")
this.map.centerAndZoom(new BMap.Point(this.center.lng, this.center.lat), 10)
this.map.addControl(
new BMap.MapTypeControl({
mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP],
})
)
this.map.enableScrollWheelZoom(true)
//...
)}