解决qiankun框架子应用打包后css里的图片加载404失败问题

详细实现方式请前往https://www.passerma.com/article/93

官网解决办法

  1. 所有图片等静态资源上传至 cdn,css 中直接引用 cdn 地址(推荐)
  2. 借助 webpack 的 url-loader 将字体文件和图片打包成 base64(适用于字体文件和图片体积小的项目)(推荐)

官网解决办法跳转:微应用打包之后 css 中的字体文件和图片加载 404

第三种方法

可以通过重写 qinakun 的 fetch 方法直接修改请求到的 css 文件里的资源路径

javascript 复制代码
function rewriteCssUrls(cssContent: string, baseUrl: string) {
  return cssContent.replace(
    /url\((?:'|")?(.*?)['"]?\)/g,
    (match, p1) => {
      const url = p1.trim();

      // 已经是 base64 / http(s) / protocol-relative,不处理
      if (/^(?:data:|https?:\/\/|\/\/)/i.test(url)) {
        return match;
      }

      const urlObj = new URL(url, baseUrl);

      return `url(${urlObj.href})`;
    }
  );
}

registerMicroApps([
  {
    name: 'sub1',
    entry: 'http://127.0.0.1:5500/dist/',
    container: '#sub1',
    activeRule: () => true,
  }
]);

start({
  fetch: (url, opt) => {
    return fetch(url, opt).then(async response => {
      let responseText = await response.text();
      const urlObj = new URL(url.toString());
      if (urlObj.pathname.endsWith('.css')) {
        responseText = rewriteCssUrls(responseText, urlObj.href.split('/').slice(0, -1).join('/') + '/');
      }
      return new Response(responseText, {
        status: response.status,
        statusText: response.statusText,
        headers: response.headers,
      });
    });
  }
});

可以看到实际加载的文件已经是正确目录了

原始 css 文件是相对路径

修改过后实际引入的是相对于子应用的路径了

详细实现方式请前往https://www.passerma.com/article/93

相关推荐
小蜜蜂dry15 小时前
nestjs实战-权限一: 菜单模块
前端·后端·nestjs
用户58124415415715 小时前
GemDesign MCP协议详解:从原型到代码的完整技术链路
前端
半个烧饼不加肉16 小时前
JS 底层探究-- 事件循环
开发语言·前端·javascript
goDeep16 小时前
useMemo 和 useCallback 的区别,我终于搞懂了
前端
小亮学前端16 小时前
在1Panel中部署Nuxt项目
前端·vue.js
产品研究员16 小时前
AI生成可用的React交互代码实测:Lovable vs Stitch vs Paico
前端·react.js·aigc
labixiong16 小时前
Prompt 工程:当一段文字学会了思考、行动与统治
前端·ai编程
biubiubiu_LYQ16 小时前
入门开发者必学篇之JS事件循环:为什么你的代码输出总翻车?
前端·javascript
程序员黑豆16 小时前
AI全栈开发之Java:怎么安装JDK
前端·ai编程·全栈
周杰伦fans16 小时前
AutoCAD C# 二次开发:如何精确监听工作空间切换事件
前端·c#