当前位置: 首页 > news >正文

qiankun微应用加载第三方js、sdk跨域报错

当我们在qiankun微应用,引入第三方js脚本时会产生跨域问题并报错,看qiankun的解释:常见问题 - qiankun

 qiankun会把静态资源的加载拦截,改用fetch方式获取资源,所以要求这些资源支持跨域。

虽然qiankun也提供了解决方案,但支持跨域的方式也颇为复杂,有没有更简单的方式,纯前端实现?

幸在qiankun提供了excludeAssetFilter  API 说明 - qiankun

解决方案:

步骤1 — 将资源写入主应用(基座) excludeAssetFilter 的放行规则里

步骤2 — 将资源加载方式改为动态加载

假如,我们需要加载的第三方脚本链接是 https://xxxx.yyy.com/sdk/xxx-1.0.0.js

 可以在如下主应用里通过定义白名单脚本链接 whiteList ,直接放行该脚本。

 当我们需要放行的第三方脚本越来越多,需要在 whiteList 里人工添加需要放行的脚本链接,后续维护成本高。

可以通过制定一个协议,如下,协议关键字 _custom-exclude_=MAIN

微应用里需要放行的资源,开发者自行在链接上带上放行协议关键字即可。一劳永逸。

start({
  prefetch: false,
  excludeAssetFilter: assetUrl => { // 指定部分特殊的动态加载的微应用资源(css/js) 不被 qiankun 劫持处理
    // 自定义白名单链接
    const whiteList = ['https://xxxx.yyy.com/sdk/xxx-1.0.0.js', 'https://ccc.ttt.com/js/xxx-1.0.0.min.js']
    /**
     * 白名单协议:子应用下如需要放行动态加载的css/js资源,可以在链接上带上参数 _custom-exclude_=MAIN
     */
    const whiteWords = ['_custom-exclude_=MAIN'] // 白名单关键词:协议制定 _custom-exclude_=MAIN。
    if (whiteList.includes(assetUrl)) {
      return true
    }
    return whiteWords.some(w => {
      return assetUrl.includes(w)
    })
  },
  ......
})

 

子应用加载该脚本方式改为动态加载方式(可自行实现,或者直接使用示例代码)。
例如,新建如下文件
src/utils/loadScript.js

const loadScript = (url) => {
  let script = document.createElement('script')
  script.setAttribute('type', 'text/javascript')
  script.setAttribute('src', url)
  let head = document.getElementsByTagName('head')
  if (head.length) {
    head[0].appendChild(script)
  } else {
    document.documentElement.appendChild(script)
  }
}

loadScript('https://xxxx.yyy.com/sdk/xxx-1.0.0.js?_custom-exclude_=MAIN')  // 需要放行的脚本1
loadScript('https://ccc.ttt.com/js/xxx-1.0.0.min.js?_custom-exclude_=MAIN') // 需要放行的脚本2

src/main.js文件内引入上面的脚本即可

import '@/utils/loadScript'

 

 

相关文章:

  • Linux网络编程-网络层IP协议
  • 神经网络图像识别代码,编码解码神经网络
  • 5分钟从掌握到精通---进制转化
  • centos安装zabbix
  • 前缀和以及哈希表优化
  • 【JavaSE】多线程篇(一)线程的相关概念与线程的基本使用
  • 8、学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程
  • 数据库基本结论
  • Django-(3)
  • HyperLynx(十五)多板仿真
  • ElasticSearch(四):ES nested嵌套文档与父子文档处理
  • java 基于springboot员工实训项目管理系统
  • SaaS行业的六大安全问题
  • Geoserver+Cesium 发布带样式矢量数据
  • 【C语言】数据类型、存储类
  • #Java异常处理
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【剑指offer】让抽象问题具体化
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Django 博客开发教程 16 - 统计文章阅读量
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Facebook AccountKit 接入的坑点
  • iOS编译提示和导航提示
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java,console输出实时的转向GUI textbox
  • mysql_config not found
  • Python 反序列化安全问题(二)
  • SQLServer之索引简介
  • 从PHP迁移至Golang - 基础篇
  • 搭建gitbook 和 访问权限认证
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 入门到放弃node系列之Hello Word篇
  • 2017年360最后一道编程题
  • const的用法,特别是用在函数前面与后面的区别
  • 移动端高清、多屏适配方案
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • !$boo在php中什么意思,php前戏
  • #100天计划# 2013年9月29日
  • #单片机(TB6600驱动42步进电机)
  • $$$$GB2312-80区位编码表$$$$
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2022 CVPR) Unbiased Teacher v2
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C++17) optional的使用
  • (javascript)再说document.body.scrollTop的使用问题
  • (LeetCode) T14. Longest Common Prefix
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • ****Linux下Mysql的安装和配置
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET : 在VS2008中计算代码度量值