qiankun微服务搭建遇到的坑

news2024/11/19 13:41:46

目录

1.子应用vue.config中的headers设置成可跨域请求

2.output设置成library,打包成umd库格式

3.父应用使用了babel-pollfill,子应用不要在在bable-pollfill

4.iconfont.js要取消样式隔离才能生效

5.关于nginx的配置

6.主应用和各应用相同依赖的版本号一定要一样,不然会有莫名其妙的BUG

7.项目中使用了三方插件时涉及跨域的问题

8.主应用、微应用部署在不同的服务器上,微应用更新后,浏览器读取缓存问题

9.主应用、微应用部署在不同服务器上,主应用读取不到微应用静态资源文件,读取的时主应用的静态资源文件

10.hash模式下无法激活子应用

11.微应用文件更新之后,访问的还是旧版文件

12.微应用打包之后 css 中的字体文件和图片加载 404

13.微应用 JSONP 跨域错误怎么处理?

14.如何解决拉取微应用 entry 时 cookie 未携带的问题


最近博主在开发一个微服务架构搭建的编程导航,方便大家学习交流。程序员导航是一个以Angular13.0,vue3.x, React16前端技术框架开发的一站式程序员学习工作娱乐导航网站,以让程序员更便捷为使命,始终围绕程序员需求,为程序员提供最新工具导航的便捷性服务网站!

下面说说本人在做qiankun微前端改造时遇到的一些坑,希望对大家有帮助。

1.子应用vue.config中的headers设置成可跨域请求

 headers: {
            //因为qiankun内部请求都是fetch来请求资源,所以子应用必须允许跨域
            "Access-Control-Allow-Origin": "*",
        },

2.output设置成library,打包成umd库格式

 configureWebpack: {
        output: {
            // 把子应用打包成 umd 库格式
            library: `${name}`,
            libraryTarget: 'umd',
            jsonpFunction: `webpackJsonp_${name}`,
        },
    }

3.父应用使用了babel-pollfill,子应用不要在在bable-pollfill

config.entry.app = [./src/main.ts]

4.iconfont.js要取消样式隔离才能生效

sandbox - boolean | { strictStyleIsolation?: boolean } - 可选,是否开启沙箱,默认为 true。

5.关于nginx的配置

# 主应用
location / {
    if ($request_uri ~* '/$|\.html$') {
        add_header Cache-Control no-store;
    }

    root /opt/pumpkin/fronted/;
    index index.html;
    try_files $uri $uri/ /index.html;
}
# cloud子应用
location /cloud/ { 
    if ($request_uri ~* '/$|\.html$') {
        add_header Cache-Control no-store;
    }
    alias /opt/pumpkin/fronted/;
    index index.html;
    try_files $uri $uri/ /index.html;
}
# mall子应用
location /mall/ {
    if ($request_uri ~* '/$|\.html$') {
        add_header Cache-Control no-store;
    }
    alias /opt/pumpkin/fronted/;
    index index.html;
    try_files $uri $uri/ /index.html;
}
# portal子应用
location /portal/ {
    if ($request_uri ~* '/$|\.html$') {
        add_header Cache-Control no-store;
    }
    alias /opt/pumpkin/fronted/;
    index index.html;
    try_files $uri $uri/ /index.html;
}

由于都是history的路由模式,所以:

每个应用配置都要加上try_files $uri $uri/ /index.html;否则会出现刷新报404错误
每个子应用都要单独配置location,否则在访问/cloud,/mall,/portal时刷新会报404

6.主应用和各应用相同依赖的版本号一定要一样,不然会有莫名其妙的BUG

7.项目中使用了三方插件时涉及跨域的问题

项目中使用了三方组件,会出现在子应用中无法使用的情况 ,在看源码时发现子应用的document.body中添加script标签失败没报错,但无法正确添加到body中,类似性质的问题还有美洽客服的引用,pdfjs的引用两种解决方法。


// 方脚本调用解决沙箱跨域问题
const opts: any = {
  prefetch: false,
  singular: true,
  fetch: window.fetch,
  excludeAssetFilter: (assetUrl: string) => {
    console.log("三方件扩展应用", assetUrl);
    if (
      assetUrl.includes("changyan") ||
      assetUrl.includes("zone.js") ||
      assetUrl.includes("kuaizhan")
    ) {
      return true;
    }
  },
};

start(opts);

8.主应用、微应用部署在不同的服务器上,微应用更新后,浏览器读取缓存问题

解决方案:服务器需要给微应用的配置一个响应头,意思就是每次请求都检查是否更新。

Nginx为例:

location = /index.html {
    add_header Cache-Control no-cache;
}

9.主应用、微应用部署在不同服务器上,主应用读取不到微应用静态资源文件,读取的时主应用的静态资源文件

module.exports = {
    output: {
        publicPath: `/app1/`,
    },
};

10.hash模式下无法激活子应用

const getActiveRule = (hash) => (location) => location.hash.startsWith(hash);

11.微应用文件更新之后,访问的还是旧版文件

服务器需要给微应用的 index.html 配置一个响应头:Cache-Control no-cache,意思就是每次请求都检查是否更新。

以 Nginx 为例:

location = /index.html {
  add_header Cache-Control no-cache;
}

12.微应用打包之后 css 中的字体文件和图片加载 404

原因是 qiankun 将外链样式改成了内联样式,但是字体文件和背景图片的加载路径是相对路径。

而 css 文件一旦打包完成,就无法通过动态修改 publicPath 来修正其中的字体文件和背景图片的路径。

主要有以下几个解决方案:

所有图片等静态资源上传至 cdn,css 中直接引用 cdn 地址(推荐)

借助 webpack 的 url-loader 将字体文件和图片打包成 base64(适用于字体文件和图片体积小的项目)(推荐)

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif|webp|woff2?|eot|ttf|otf)$/i,
        use: [
          {
            loader: 'url-loader',
            options: {},
          },
        ],
      },
    ],
  },
};

vue-cli3 项目写法

module.exports = {
  chainWebpack: (config) => {
    config.module.rule('fonts').use('url-loader').loader('url-loader').options({}).end();
    config.module.rule('images').use('url-loader').loader('url-loader').options({}).end();
  },
}

13.微应用 JSONP 跨域错误怎么处理?

qiankun 会将微应用的动态 script 加载(例如 JSONP)转化为 fetch 请求,因此需要相应的后端服务支持跨域,否则会导致错误。

在单实例模式下,你可以使用 excludeAssetFilter 参数来放行这部分资源请求,但是注意,被该选项放行的资源会逃逸出沙箱,由此带来的副作用需要你自行处理。

若在多实例模式下使用 JSONP,单纯使用 excludeAssetFilter 并不能取得好的效果,因为各应用被沙箱所隔离;你可以在主应用提供统一的 JSONP 工具,微应用调用主应用提供的该工具来曲线救国。

14.如何解决拉取微应用 entry 时 cookie 未携带的问题

因为拉取微应用 entry 的请求都是跨域的,所以当你的微应用是依赖 cookie (如登陆鉴权)的情况下,你需要通过自定义 fetch 的方式,开启 fetch 的 cors 模式:

如果你是通过 registerMicroApps 加载微应用的,你需要在 start 方法里配置自定义 fetch,如:

import { start } from 'qiankun';

start({
  fetch(url, ...args) {
    // 给指定的微应用 entry 开启跨域请求
    if (url === 'http://app.alipay.com/entry.html') {
      return window.fetch(url, {
        ...args,
        mode: 'cors',
        credentials: 'include',
      });
    }

    return window.fetch(url, ...args);
  },
});

如果你是通过 loadMicroApp 加载微应用的,你需要在调用时配置自定义 fetch,如:

import { loadMicroApp } from 'qiankun';

loadMicroApp(app, {
  fetch(url, ...args) {
    // 给指定的微应用 entry 开启跨域请求
    if (url === 'http://app.alipay.com/entry.html') {
      return window.fetch(url, {
        ...args,
        mode: 'cors',
        credentials: 'include',
      });
    }

    return window.fetch(url, ...args);
  },
});

如果你是通过 umi plugin 来使用 qiankun 的,那么你只需要给对应的微应用开启 credentials 配置即可:

export default {
  qiankun: {
    master: {
      apps: [
        {
          name: 'app',
          entry: '//app.alipay.com/entry.html',
+         credentials: true,
        }
      ]
    }
  }
}

微服务体验连接:富朝阳的博客

欢迎在评论区交流。

如果文章对你有所帮助,❤️关注+点赞❤️鼓励一下博主会持续更新。。。。

我的博客原文:qiankun微服务搭建遇到的坑

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

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

相关文章

【周赛364-单调栈】美丽塔 II-力扣 2866

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

华为OD机试 - 相同数字组成图形的周长 - 矩阵(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》。 刷的越多…

windows下查看端口及占用端口的进程

1、使用命令查看端口,这里查看10000端口 netstat -aon|findstr "10000" 2、使用tasklist命令查看进程 tasklist|findstr "9640"

基于Spring Boot的在线考试系统springboot19

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

驱动开发:STM32F7控制AD5663模拟量输出

AD5663是ADI公司的一款DAC模块,用以实现两路模拟量信号输出。该芯片通过SPI通信来驱动。下面讲解使用STM32F7主控芯片来控制AD5663模拟量输出的流程。 配置STM32F7 SPI通信管脚 STM32CubeMX生成SPI驱动代码 /* SPI3 init function */ void MX_SPI3_Init(void) {/*…

4年从外包到外企,一个测试老鸟的自述

4年前,我拖着行李箱来到北京,成为了一名北漂,离开了校园的庇护,只身一人,想要在这片陌生的地方闯出一番名堂,可最后却不得人意,面临着所有北漂群体的共同困局,没有归属感&#xff0c…

快速构建开发工具2.0

痛点:使用c开发过程中;尽管CMAKE很强大,方便帮助我们编译好第三方库,但是对第三方库的管理,以及快速搭建开发环境,以及第三方库互相搭配使用并进行demo验证上个人觉得,还是繁琐! 所以写了个小工具,来省略这个过程; 这个工具长这个样子: 他能做什么: 1.只需要勾勾选选,就可以将用…

【Element-UI】Mock.js,案例首页导航、左侧菜单

目录 一、引言 二、Mock.js 1、什么是Mock.js 2、安装配置 2.1、安装 2.2、引入 3、Mock.js的使用 3.1、定义测试数据文件 3.2、mock拦截ajax请求 3.3、模拟测试 三、首页导航、左侧菜单 1、页面搭建 1.1、图标定义 1.2、AppMain.vue 1.3、LeftNav.vue 1.4、To…

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一论著想象和世界一样宽广

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一论著想象和世界一样宽广

Android实现App增量更新代码实现。

一、增量更新实现思路 1)服务端生成patch差分包: 值得注意的是,需要对用户安装的不同版本,生成不同的差分包,为了是让用户安装的所有版本都升级为最新的版本。 2)客户端请求差分包: 客户端在请求…

小样本规模船型优化策略的选择研究

天洑软件基于自研智能优化软件AIPOD在船舶行业的应用发表论文《小样本规模船型优化策略的选择研究》刊录于核心期刊《中国造船》。全文如下: 小样本规模船型优化策略的选择研究 陈骏喆,姜 栋,张 儒,张 明 (南京天洑…

PIP安装

首先进入这个网站 https://pypi.org/project/pip/#files 选择如图所示的安装包 解压刚才下载的pip安装包打开cmd( 使用winR 输入cmd) 如图切换到pip文件夹下面 输入python setup.py install 按enter回车键

翻译像机翻?4点教会你ChatGPT高质量翻译

如果完全靠自己的英文和中文水平,要达到这样的翻译速度和质量那是不太可能的,主要还是得益于ChatGPT的帮助,首先用GPT-4的API粗翻,再用ChatGPT Plus精翻。很多人都用过ChatGPT翻译,但翻译出来的结果比起Google翻译和De…

排序:插入排序算法分析以及相关优化(折半插入排序)

1.算法思想︰ 每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。 直接插入排序:顺序查找找到插入的位置,适用于顺序表、链表。 2.算法实现 //直接插入排序 void InsertSort(int A[], int n) {int i, j, tem…

12.InnoDB记录结构

title: “InnoDB记录结构” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” InnoDB记录结构 innoDB存储引擎介绍 存储引擎的作用就是内存和磁盘打…

python随手小练2

题目: 今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,为何? (即:一个数除3余2,除5余3,除7余2) 具体操作: xint(input(&quo…

AI编写文案工具哪些好用且免费

什么是AI编写文案工具?AI编写文案工具基于自然语言处理技术的应用程序,它们旨在协助用户创建各种类型的文案,从广告、营销材料到新闻稿和博客文章,都可以得心应手。这种技术的崛起源于对写作效率和质量的不断追求。 AI编写文案工具…

做销售管理分析需要看哪些关键指标?

做销售管理分析需要看哪些关键指标? 销售管理分析时抓取关键指标,有着能够【分析和判断销售趋势、为销售决策提供数据支持、优化销售流程和客户管理】等的好处 在了解了分析关键指标的目的之后,我们就可以根据企业的需求来确定关键指标&…

淘宝/天猫获得店铺的所有商品 API 返回值说明

淘宝API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 通过开放接口,开发者可以不改变现有系统,直接在原有系统上实现新功能。 在开发过程中,使用淘宝API接口可以帮助开发者快速搭建自己的应用,实…

2023年Java毕业设计题目如何选题?Java毕业设计选题大全

大家好,我是程序员徐师兄,最近有很多同学咨询,说毕业设计了,不知道选怎么题目好,有哪些是想需要注意的。 确实毕设选题实际上对很多同学来说一个大坑, 每年挖坑给自己跳的人太多太多。选到合适的题目的话&…