解决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

相关推荐
摸鱼的春哥13 小时前
春哥的Agent通关秘籍13:实现RAG查询
前端·javascript·后端
明月_清风13 小时前
滚动锁定:用户向上翻看历史时,如何阻止 AI 新消息把它“顶”下去?
前端·javascript
明月_清风13 小时前
当高阶函数遇到 AI:如何自动化生成业务层面的逻辑拦截器
前端·javascript·函数式编程
moshuying1 天前
别让AI焦虑,偷走你本该有的底气
前端·人工智能
GIS之路1 天前
ArcPy,一个基于 Python 的 GIS 开发库简介
前端
可夫小子1 天前
OpenClaw基础-为什么会有两个端口
前端
喝拿铁写前端1 天前
Dify 构建 FE 工作流:前端团队可复用 AI 工作流实战
前端·人工智能
喝咖啡的女孩1 天前
React 合成事件系统
前端
从文处安1 天前
「九九八十一难」组合式函数到底有什么用?
前端·vue.js
用户5962585736061 天前
戴上AI眼镜逛花市——感受不一样的体验
前端