Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

子应用向body添加script标签失败 #812

Closed
cpa0701 opened this issue Aug 1, 2020 · 19 comments
Closed

子应用向body添加script标签失败 #812

cpa0701 opened this issue Aug 1, 2020 · 19 comments

Comments

@cpa0701
Copy link

cpa0701 commented Aug 1, 2020

提问之前强烈建立您能先阅读一下《提问的智慧》

What happens?

在子应用中使用vue-baidu-map,无法正常加载

在看源码时发现子应用的document.body中添加script标签失败没报错,但无法正确添加到body中,请问下有解决方法吗?

最小可复现仓库

image

为节约大家的时间,无复现步骤的 ISSUE 会被关闭,提供之后再 REOPEN

复现步骤,错误日志以及相关配置

相关环境信息

  • qiankun 版本
  • 浏览器版本
  • 操作系统
@cpa0701 cpa0701 changed the title 子应用关于window的操作无法生效 子应用向body添加script标签失败 Aug 1, 2020
@justJokee
Copy link

justJokee commented Aug 4, 2020

2.0.16及以前的版本可以自定义fetch方法,动态追加地图,模糊匹配百度地图的url,然后新建script插入到header中,以下代码可模拟原生地图使用,仅供参考:

const list = [
  'https://api.map.baidu.com'
]
const save = [
  'https://api.map.baidu.com/getscript'
]
export function qiankunFetch(url,args){
  let hijack = false
  list.some(item =>{
    if(url.includes(item)){
      hijack = true
      insertEle(url)
      return true
    }
  })
  if(hijack) return Promise.resolve()
  return window.fetch(url, ...args)
}


function insertEle(url){
  let head = document.getElementsByTagName('head')[0]
  let ele = document.createElement('script')
  let id = +new Date() + Math.random()

  ele.src = url
  ele.id = id
  head.append(ele)
  ele.onload = function(){
    let removeFlag
    save.some((item) =>{
      if(url.includes(item)){
        removeFlag = true
        return true
      }
    })
    if(!removeFlag) head.removeChild(document.getElementById(id))
  }
}

@kuitos
Copy link
Member

kuitos commented Aug 4, 2020

可以设置 excludeAssetFilter https://qiankun.umijs.org/zh/api#loadmicroappapp-configuration
image

excludeAssetFilter: url => url.indexOf('api.map.baidu.com') !== -1

@kuitos kuitos closed this as completed Aug 4, 2020
@cpa0701
Copy link
Author

cpa0701 commented Aug 4, 2020

可以设置 excludeAssetFilter https://qiankun.umijs.org/zh/api#loadmicroappapp-configuration
image

excludeAssetFilter: url => url.indexOf('api.map.baidu.com') !== -1

好的,let me try try

@cpa0701
Copy link
Author

cpa0701 commented Aug 4, 2020

可以自定义fetch方法,动态追加地图,模糊匹配百度地图的url,然后新建script插入到header中,以下代码可模拟原生地图使用,仅供参考:

const list = [
  'https://api.map.baidu.com'
]
const save = [
  'https://api.map.baidu.com/getscript'
]
export function qiankunFetch(url,args){
  let hijack = false
  list.some(item =>{
    if(url.includes(item)){
      hijack = true
      insertEle(url)
      return true
    }
  })
  if(hijack) return Promise.resolve()
  return window.fetch(url, ...args)
}


function insertEle(url){
  let head = document.getElementsByTagName('head')[0]
  let ele = document.createElement('script')
  let id = +new Date() + Math.random()

  ele.src = url
  ele.id = id
  head.append(ele)
  ele.onload = function(){
    let removeFlag
    save.some((item) =>{
      if(url.includes(item)){
        removeFlag = true
        return true
      }
    })
    if(!removeFlag) head.removeChild(document.getElementById(id))
  }
}

好的,谢谢,我先试试

@Carolineliu
Copy link

hello,想请问下我做了同样的设置,还是显示跨域
父应用
image
子应用
image

可以设置 excludeAssetFilter https://qiankun.umijs.org/zh/api#loadmicroappapp-configuration
image

excludeAssetFilter: url => url.indexOf('api.map.baidu.com') !== -1

@ZouHuaYi
Copy link

我也是设置了没有用,怎么弄啊!楼上

@yenkos
Copy link

yenkos commented Apr 27, 2021

一摸一样的问题,害

@yenkos
Copy link

yenkos commented Apr 27, 2021

这个地图插件源码有个getMapScript方法是这样写的
const $script = document.createElement('script')
$script.src = https://api.map.baidu.com/api?v=2.0&ak=${ak}&callback=_initBaiduMap
global.document.body.appendChild($script)

改成这样就可以
const $script = document.createElement('script')
$script.src = https://api.map.baidu.com/api?v=2.0&ak=${ak}&callback=_initBaiduMap
global.document.body.appendChild($script)

@Jina88
Copy link

Jina88 commented Aug 6, 2021

父应用 main.js 设置 excludeAssetFilter
image

start({ prefetch: false, singular: true, fetch: window.fetch, excludeAssetFilter: (assetUrl) => { const whiteList = []; const whiteWords = ['baidu', 'map'] if (whiteList.includes(assetUrl)) { return true } return whiteWords.some(w => { return assetUrl.includes(w) }) } } );

子应用 在map使用之前
let script = document.getElementById('scriptMap'); if (!script) { window.BMap_loadScriptTime = (new Date).getTime(); script = document.createElement('script'); script.id = 'scriptMap'; script.src = 'http://api.map.baidu.com/getscript?v=2.0&ak=ak&services=&t='; script.type="text/javascript" document.body.append(script); }
注意qiankun版本更新至2.0.17及以上

@ilbefun
Copy link

ilbefun commented Dec 10, 2021

楼上的都试过了没用啊,我该怎么办?

@a15218378694
Copy link

楼上的都试过了没用啊,我该怎么办?

请问解决了吗

@a15218378694
Copy link

这个地图插件源码有个getMapScript方法是这样写的 const $script = document.createElement('script') $script.src = https://api.map.baidu.com/api?v=2.0&ak=${ak}&callback=_initBaiduMap global.document.body.appendChild($script)

改成这样就可以 const $script = document.createElement('script') $script.src = https://api.map.baidu.com/api?v=2.0&ak=${ak}&callback=_initBaiduMap global.document.body.appendChild($script)

没看出改动呀

@a15218378694
Copy link

2.0.16及以前的版本可以自定义fetch方法, 新的版本就不行了 ? 我现在这边是拦截不到百度地图的请求呢

@gongshun
Copy link
Collaborator

如你用的是 vue-baidu-map 插件,那就直接用 excludeAssetFilter 过滤

如果是直接用的百度地图 js,不能直接用 script 标签插入,需要改为异步插入,然后才能用 excludeAssetFilter 过滤

function loadScript() { 
  var script = document.createElement("script"); 
  script.src = "https://api.map.baidu.com/api?v=20&type=webgl&ak=您的密钥&callback=initialize";
  document.body.appendChild(script); 
} 

@huangxu510
Copy link

同样遇到了这个问题《子应用向body添加script标签失败》,请问楼主解决了没

@a15218378694
Copy link

jsonp函数放主应用, 子应用调用这个方法请求

@Slebee
Copy link

Slebee commented Jun 20, 2022

同样的问题,子应用引入的第三方lib中使用了jsonp出现了跨域问题,使用乾坤插件的时候主应用设置excludeAssetFilter不生效,自定义fetch也没反应,但是,不用乾坤插件excludeAssetFilter就没有问题,给类似情况的做个参考

@ranmeizi
Copy link

果然有用哦 GL 要filter
api.baidu.com
mapOnline0
这两个关键字

@huangche007
Copy link

@ranmeizi 你上面说的“GL 要filter
api.baidu.com
mapOnline0
这两个关键字”这句话是啥意思来着。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests