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

公司老项目多了,却想用新版本的框架,最好的解决办法就是用微前端。
本文说下我们在用阿里微前端框架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 presentnew 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.hqwc.cn/news/9809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ikbc键盘2.4G接收器丢失,重新对码

我的键盘&#xff1a;ikbc W200 1.键盘关掉重开&#xff1b; 2.新接收器插在电脑上&#xff1b; 3.电脑上打开软件&#xff0c;点开始对码&#xff0c;一会就连接上了。 对码软件放在这里&#xff1a; 我用夸克网盘分享了「IKBC 对码.rar」&#xff0c;点击链接即可保存。打开…

进程(process)、线程(thread)、协程 (Coroutine) 的区别

说到协程(Coroutine)&#xff0c;我们必须提到两个名称相似的东西。 在操作系统&#xff08;os&#xff09;级别&#xff0c;有进程&#xff08;process&#xff09;和线程&#xff08;thread&#xff09;两个&#xff08;仅从我们常见的讲&#xff09;实际的“东西”&#xff…

redis面试题

面试题汇总 Redis的使用场景什么是缓存穿透&#xff0c;有什么解决方案&#xff1f;能否介绍一下布隆过滤器布隆过滤器&#xff1f; 什么是缓存击穿 ? 怎么解决 ?什么是缓存雪崩 ? 怎么解决 ?redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#…

【C++】C++11的新特性

文章目录 1. C11简介2. 统一的列表初始化2.1 {}统一初始化2.2 std::initializer_list 3. 声明的新方式和范围for循环3.1 decltype3.2 auto&nullptr&范围for循环 4. STL的变化4.1 新容器4.2 新接口 1. C11简介 ​ 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1…

MySQL中这些关键字的用法,佬们get到了嘛

前言&#xff1a; 最近粉丝问了一个问题&#xff0c;是关于Limit分页的用法&#xff0c;他没有理解清楚&#xff0c;因此本篇文章主要讲解MySQL的关键字的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c…

【Unity】HyBridCLR初探

完成目标: 创建热更新程序集加载热更新程序集,并执行其中热更新代码,打印 Hello, HybridCLR修改热更新代码,打印 Hello, World准备环境​ 安装Unity HybridCLR也支持2019.4.x,但新手请先按照下面要求跑通流程后,再根据安装HybridCLR文档尝试2019.4.x。 安装 2020.3.26+…

基本介绍实施工程师,以及实施工程师在软件开发的作用

一.软件实施介绍 1.什么是软件实施&#xff1f; 软件实施是指将软件开发完成后&#xff0c;按照计划进行部署和安装&#xff0c;使软件能够在目标环境中正常运行的过程。下面是软件实施的一般步骤&#xff1a; 1. 规划和准备&#xff1a;确定实施的范围、目标和计划&#xff0…

Oracle中的连接方式

Oracle中的连接方式 对于数据库中表与表之间的连接&#xff08;内连接、外连接&#xff09;都可以看成集合之间的运算操作。 内连接 select * from a_table a inner join b_table b on a.id b.id; 相当于求两个集合中满足条件的结果&#xff0c;即交集。 外连接 左/外连接&a…

清华青年AI自强作业hw5:基于CNN实现CIFAR10分类任务

清华青年AI自强作业hw5&#xff1a;基于CNN实现CIFAR10分类任务 简述作业实现遇到的问题相关链接 一起学AI系列博客&#xff1a;目录索引 简述 hw5作业为利用深度卷积神经网络实现CIFAR_10数据集十分类问题&#xff0c;帮助理解CNN的前向传播结构。 CIFAR-10是一个常用的彩色图…

能够辅助用户分类管理个人任务的备忘录哪款比较好?

当我回忆起自己曾经忙碌的日子&#xff0c;我意识到在处理多种事务时&#xff0c;一个高效的分类管理系统是多么的重要。在那段时间里&#xff0c;我不仅要应对工作上的各种任务&#xff0c;还要处理个人事务和日常琐事。随着任务的增加&#xff0c;我发现自己越来越难以有效地…

基于深度学习的高精度红外行人车辆检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度红外行人车辆检测识别系统可用于日常生活中或野外来检测与定位红外行人车辆目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的红外行人车辆目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系…

Tomcat部署及优化

一、Tomcat概述1.1 Tomcat介绍1.2 servlet介绍1.3 JSP介绍 二、Tomcat核心组件2.1 Tomcat三大容器2.2 Tomcat功能组件结构2.2.1 Container结构分析 2.3 Tomcat处理请求过程 三、Tomcat服务部署3.1 关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下3.2 安装JDK3.3…