解决阿里qiankun微应用资源无法加载

news2025/6/9 4:47:38

公司老项目多了,却想用新版本的框架,最好的解决办法就是用微前端。
本文说下我们在用阿里微前端框架qiankun,遇到的一些问题,以及一些巧妙的解决办法。

背景

因为接入微前端很长时间了,导致现在的微应用变成了实际意义上的主应用,主应用反而没有多少功能。于是,想着能不能把两个项目的角色换一下,老的主应用项目,变成微应用;微应用项目变成主应用。这样做有两个好处:

  1. 如果当前需求不涉及老业务,微应用的老代码就不用发版了。
  2. 可以顺便升级项目的路由、鉴权等基础逻辑。

于是,开整。

遇到问题

很快,升级工作进行的差不多了,提测的过程中,发现有些资源文件无法加载,如下图:

alt于是快速定位,发现是老代码变成微应用之后,在加载资源时,路径还是走主应用。比如:

  • 主应用: http: //my.proj.com/main-proj/static/select.png
  • 微应用: http: //my.proj.com/micro-proj/static/select.png

本来应该是下面的路径才对,却显示成上面的路径,所以找不到资源。

官方答疑

其实这个问题很多人有遇到 ,于是去官方看下有没有解决方案:
一看还真有,在官方常见问题中有提到:

alt添加publicPath 、调整静态资源的地址和转Base64.

尝试解决

首先,我们真实环境,老项目是用vue1.x是5年前的项目,我看了下,vue-router还是0.7.x的版本,那个时候,路由配置还没有base,也就是官方教程里的配置:

在这里插入图片描述vue-router0.7.x版本源码:

alt即使你按照官方的配置走了,也是不起作用的,因为早期版本不支持。找不到base相关的代码。

那为什么不升级老项目呢?

这个问题我也想过,只是项目太复杂且工作量太大,我情愿找到一个能解决资源路径的办法也不想去动老代码。

继续想办法

如果启动的时候配置不了base,那打包的时候行吗?答案是可以,但是有问题。我尝试在webpack中添加publicpath。

module.exports = function (config) {
    const webpack = require(path.resolve(config.mumbleDir, './node_modules/webpack'));
    const cfg = {
        ......
        module: {
            noParse: [/vue-router\.js/]
        },
        devServer: {
            headers: {
                'Access-Control-Allow-Origin': '*'
            }
        },
        output: {
            filename: '[name].js', // 输出文件名
            library: `${name}-[name]`, // 暴露给全局变量的名称
            libraryTarget: 'umd', // 导出库方式
            umdNamedDefine: true, // 是否将AMD模块命名
            publicPath: `${
            config.env === 'develop' 
            ? 'http://my.proj.com/micro-proj' 
            : 'http://my.prod.proj.com/micro-proj'
            }/static/`
        }
    };
    return cfg;
};

通过这样的配置,可以部分资源能够使用,为啥说部分资源呢?因为老的webpack在打包静态资源的时候有些资源在Css文件中的路径是相对路径。

往后讲,我们也有CDN资源,但是这个只用于对外的项目,内部项目一般都是资源打包,所以不太妥。
base64也解决不了问题,因为有些字体就很大,不适合用这种方式。

新的思路

突然想到,如果我能通过webpack插件来把资源都改成微应用路径不就行了?于是找了个插件string-replace-webpack-plugin

var StringReplacePlugin = require("string-replace-webpack-plugin");
module.exports = {
   module: {
      loaders: [
         // configure replacements for file patterns
         { 
            test: /index.html$/,
            loader: StringReplacePlugin.replace({
                replacements: [
                    {
                        pattern: /<!-- @secret (\w*?) -->/ig,
                        replacement: function (match, p1, offset, string) {
                            return secrets.web[p1];
                        }
                    }
                ]})
            }
      ]
   },
   plugins: [
      // an instance of the plugin must be present
      new StringReplacePlugin()
   ]
}

配置好了没有一点反应,不知道是不是因为老项目的webpack版本太低还是其他原因。然后还想到,我们项目有生产和测试环境,测试环境还有好多个,这种绝对路径替换的方案也不太行的通。

巧妙解决

在上面的思路基础上,再回想下现在的现象,就是资源文件总是会跑到主应用的路径上去,那如果把微应用的资源移到主应用中去,不就能找到了?

select{
    width: 200px;
    height: 30px;
    padding: 4px 10px;
    border: $border;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background-image: url("/select.png");
    background-repeat: no-repeat;
    background-position: right 10px center;
    background-color: $white;
}

资源文件用绝对路径,同时,把资源放到主应用的public下面(基于框架,我们的框架放到这个目录会自动打包Copy到Dist)
alt
最后,顺利加载:

alt

总结

在官方的解决方案上找不到想要的结果,就只能自己因地制宜了。希望这个思路可以帮到你们,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python接口自动化测试之UnitTest详解

基本概念 UnitTest单元测试框架是受到JUnit的启发&#xff0c;与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化&#xff0c;配置共享和关机代码测试。支持将测试样例聚合到测试集中&#xff0c;并将测试与报告框架独立。 它分为四个部分test fixture、TestC…

【LeetCode】149. 直线上最多的点数

149. 直线上最多的点数&#xff08;困难&#xff09; 枚举直线 哈希表统计 思路 遍历每两个点之间的连线&#xff0c;然后计算这条连线上有多少个点。 具体步骤如下&#xff1a; 初始化最大点数为 0。遍历每个点&#xff0c;用它和其他点计算斜率。如果两个点的x坐标相同&…

7月大概率加息25bp!美股螺旋式下跌,加密市场“迎难而上”!

今年6月&#xff0c;美股标普500指数走出了自1948年以来最长的熊市&#xff0c;进入新的牛市&#xff0c;美联储暂停加息给全球资本市场一个喘息的机会。尽管如此&#xff0c;美国目前经济基本面的情况仍不及预期&#xff0c;股市其上涨态势恐怕将会迎来一轮调整。 以Solita Ma…

资深开发竟然不清楚int(1)和int(10)的区别

一、困惑 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接下来是一通解释。…

做一个小程序需要多少钱

做一个小程序要多少钱&#xff0c;这种分2种类型 定制版 定制版就是按着客户的需求来做了。首先是聊需求&#xff0c;然后画思维导图&#xff0c;做原型图&#xff0c;做完原型图&#xff0c;就是做UI设计&#xff0c;然后做前端&#xff0c;后端。这个费用下来大概几千元到几…

Rust 第五天—代码组织管理

通过之前的内容介绍,对Rust或多或少有了一些了解.也许现在还不能写出“像样子”的项目,但是把大量代码堆积写在一个文件中依旧是不可取的.今天的内容相对轻松一些,聊聊Rust的包和模块 Rust的模块系统可以划分为Package,Crate,Module,具体可以总结如下: Package:整个项目Crate…

【hadoop】Linux安装和配置

安装 RedHat Linux 7.4 创建新的虚拟机 选择“自定义&#xff08;高级&#xff09;” 选择“下一步” 选择“稍后安装操作系统” 选择操作系统的类型 设置虚拟机名称和保存路径 下一步 下一步 设置网络类型&#xff0c;选择“使用仅主机模式网络” 下一步 下一步 下一步 设置硬…

pytorch笔记:归一化

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN layer normalization 是针对单个样本&#xff0c;训练和测试的时候行为一致LN 相对于 BN 更适合 RNN&#xff0c;可以降低训练时间LN 中不同样本有不同的归一化参数&#xff0c;以层计算 a 是输入&#xff0c;f 是每层具…

【LeetCode周赛】2022上半年题目精选集——思维题

文章目录 2211. 统计道路上的碰撞次数&#xff08;栈 || 脑筋急转弯&#xff09;解法1&#xff1a;自己想的——使用栈解法2——思维&#xff1a;去掉左右两边往左右开的车代码写法1——找左右端点代码写法2——正则表达式去除流处理api补充&#xff1a;replaceAll() 和 正则表…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述&#xff1a; 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”&#xff0c;同步转载于此。 背景 源码&#xff1a;…

8、动手学深度学习——现代卷积神经网络:AlexNet

1、学习表征 在2012年前&#xff0c;图像特征都是机械地计算出来的。事实上&#xff0c;设计一套新的特征函数、改进结果&#xff0c;并撰写论文是盛极一时的潮流 另一组研究人员&#xff0c;包括Yann LeCun、Geoff Hinton、Yoshua Bengio、Andrew Ng、Shun ichi Amari和Juer…

Java阶段四Day11

Java阶段四Day11 文章目录 Java阶段四Day11Spring AOPElasticsearch1. 关于各种数据库的使用2. 关系型数据库中的索引3. 安装与启动elasticsearch4. 访问elasticsearch5. 使用elasticsearch分词6. elasticsearch文档的相关概念7. 使用elasticsearch添加数据7.1. 添加文档7.2. 查…

Spring Boot 中的分布式追踪及使用

Spring Boot 中的分布式追踪及使用 随着互联网应用程序的复杂性不断增加&#xff0c;分布式系统已经成为了许多企业级应用程序的标配。在分布式系统中&#xff0c;由于服务之间的调用关系错综复杂&#xff0c;很难追踪到一个请求在整个系统中的执行路径和时间&#xff0c;这就…

Python如何提高工作效率,轻松实现读取分数,计算出最高/低分

前言 Python如何读取分数&#xff0c;计算最高/低分 与平均分&#xff1f; 今天这篇文章就来带你学习学习如何实现这个功能~ 环境使用: Python 3.8 解释器 Pycharm 编辑器 涉及知识点 文件读写基础语法字符串处理循环遍历 代码展示 模块 import platform定义获取最高分、最…

AI 语音 - 人声歌曲合成

前情提要 2023-07-02 周日 杭州 阴晴不定 小记: 天生五音不全&#xff0c;唱歌永远找不到调&#xff0c;使用下 AI 通过音色合成下吧&#xff0c;目前才训练 15000 步左右&#xff0c;我准备的数据集其实满打满算也只有 40min 左右的数据集&#xff0c;为了数据预处理有删减了…

基于openvino+yolov5的模型量化记录(PTQ模式)

本文主要是记录学习openvino_notebootk 302-pytorch-quantization-aware-training文档的一些收获&#xff0c;对于yolov5在cpu部署感兴趣的可以参考下。 此文档的目的是为了了解openvino如何降低模型部署的推理时间&#xff0c;同时尽可能保证精度。 此文档一共提供了两种PT…

【Flutter】Flutter 使用 Stream Transform 包处理流操作

文章目录 一、 前言二、 Stream Transform 包简介三、 安装和版本信息四、 Stream Transform 的基本使用1. 扩展方法2. 异步映射 五、 示例&#xff1a;使用 Stream Transform 实现实时搜索功能六、 总结 一、 前言 欢迎来到我的博客&#xff01;我是小雨青年&#xff0c;这是…

基于docker的ubuntu云服务器jupyter深度学习环境配置指南

step1 安装docker 文档中的命令如下&#xff1a; sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings…

驱动 控制开发版3盏灯、蜂鸣器、风扇、马达

head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; //查看开发扩展板原理图可知 //蜂鸣器 PB6 //风扇 PE9 //马达 PF6 //LED1 PE…