qiankun 部署微前端-vue2(一)

news2024/11/30 14:44:46

        自从前后端分离以来,一直都有个困惑,就是随着项目的功能的不断拓展,项目变得不断臃肿,每次打包编译,都要把整个项目编译,非常耗时。如果前端也能像后端一样,在项目搭建初期,有类似微服务的功能,那就好了。现在qiankun 可以实现前端项目的微前端功能。

        qiankun官网:qiankun - qiankun

        最近在开发vue2的项目,前端主框架依赖于若依,于是就拿着现有项目试了一下。几番周折,终于成功了。

        部署步骤可以移步到官网,下面是自己改造的主要步骤。

        主应用:

       (主应用除了官方贴出的配置信息外,还有路由权限(路由守卫)的修改,否则就会进入404页面了,这个问题困扰我很久)

        一、安装依赖包qiankun 

yarn add qiankun

        二、修改 main.js

import { registerMicroApps, start } from 'qiankun';
/**
* Step1 定义对应的微前端应用
*/
const apps = [
  {
    name: 'subapp',
    entry: '//localhost:9091', // 子应用实际启动地址
    container: '#subapp-viewport',// 子应用在主应用展示容器的id
    activeRule: '/subapp', // 引入子应用的路由地址
  },
];
/**
* Step2 注册
*/
registerMicroApps(apps, {
  beforeLoad: [
    (app) => {
      console.log(`${app.name}的beforeLoad阶段`);
    },
  ],
  beforeMount: [
    (app) => {
      console.log(`${app.name}的beforeMount阶段`);
    },
  ],
  afterMount: [
    (app) => {
      console.log(`${app.name}的afterMount阶段`);
    },
  ],
  beforeUnmount: [
    (app) => {
      console.log(`${app.name}的beforeUnmount阶段`);
    },
  ],
  afterUnmount: [
    (app) => {
      console.log(`${app.name}的afterUnmount阶段`);
    },
  ],
});

/**
* Step3 设置默认进入的子应用
*/
 setDefaultMountApp('/subapp');

/**
* Step4 启动应用
*/
start();

三、App.vue 中添加容器(显示对应子应用的容器)

<template>
  <div id="app">
     
    <router-view />
    <div id="subapp-viewport"></div>
  </div>
</template>

   四、配置代理

           由于通过主应用IP地址访问子应用,此时子应用接口地址默认调用的主应用的配置的相关配置。在主应用 vue.config.js用添加 。具体微应用代理地址说明

 proxy: {
        // 微应用的代理
      ['/subapp'+process.env.VUE_APP_BASE_API]: {
        target: `http://1.1.1.1:7070`, // 调用后端服务的地址
        changeOrigin: true,
        logLevel: 'debug',// 可以在控制台中看到调用接口代理后的真实地址
        pathRewrite: {
          ["^/subapp" + process.env.VUE_APP_BASE_API]: process.env.VUE_APP_BASE_API,
        },
      },
        // 主应用代理地址
      [process.env.VUE_APP_BASE_API]: {
        target: `http://1.1.1.2:6070`,// 调用后端服务的地址
        changeOrigin: true,
        logLevel: 'debug',
        pathRewrite: {
          ["^" + process.env.VUE_APP_BASE_API]: process.env.VUE_APP_BASE_API,
        },
      },
      
    },

子应用:

子应用主要是对路由信息的修改【子应用不需要安装qiankun包】。

一、新增 src/public-path.js (可以去官网复制粘贴内容)

if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
    console.log(window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__);
}

二、修改main.js

在mian.js最顶部引入public-path.js

 把vue实例化 封装成render函数,由于子应用可以独立运行,也可以通过主应用打开,此时需要借助qiankun 插件主应用的为window添加的全局变量 __POWERED_BY_QIANKUN__ 来判断进入子应用的模式。

function render(props = {}) {
  const { container } = props;

  new Vue({
    router,
    store,
    render: (h) => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');

}

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

// 生命周期
export async function bootstrap() {
  console.log('[vue] vue app bootstraped');
}
export async function mount(props) {
  console.log('[vue] props from main framework', props);
   // 通过主应用引入时调用
  render(props);
}
export async function unmount() {
}

三、路由的修改

思考一下,对于子应用的中的菜单导航,在独立运行和在通过主应用点击对应的菜单,他们地址是要做出区别的,所以需要再实例化路由的时候,对运行环境做出判断,对路由 base属性添加属性值。

export default new Router({
    base: window.__POWERED_BY_QIANKUN__ ? `/subapp` : '/',
    mode: 'history', // 去掉url中的#
    scrollBehavior: () => ({ y: 0 }),
    routes: constantRoutes
})

需要特别注意的是,如果是主应用调用的子应用,此时base值就是主应用配置main.js中子自用用 activeRule的值。

 四、vue.config.js修改

由于主应用、子应用都是独立部署,主应用调用子应用功能时候,就会出现跨域的问题,所以需要在子应用中添加允许跨域

 devServer: {
    host: "",
    port: port,
	 headers: {
      'Access-Control-Allow-Origin': '*',
    },
    open: true,
    proxy: {
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: `http://10.10.10.10:2020`,
        changeOrigin: true,
        logLevel: 'debug',
        pathRewrite: {
          ["^" +process.env.VUE_APP_BASE_API]: process.env.VUE_APP_BASE_API,
        },
      },
    },
    disableHostCheck: true,
  },

配置子应用的打包模式

const packageName = require('./package.json').name;

module.exports = {
  output: {
    library: `${packageName}-[name]`,
    libraryTarget: 'umd',
    jsonpFunction: `webpackJsonp_${packageName}`,
  },
};

配置到此处,正常情况下就可以实现主应用中调用子应用的页面地址了,如登录界面(不需要调用后端接口的模块)。

如果要实现主应用中调用子应用,子应用中对应的接口信息能够正常返回后端数据,需要往下看

qiankun 部署微前端-vue2 (二)_wuyu0920的博客-CSDN博客

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

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

相关文章

C++11【包装器】

包装器&#x1f4d6;1. 为什么需要包装器&#x1f4d6;2. 如何使用包装器&#x1f4d6;3. bind函数&#x1f4d6;1. 为什么需要包装器 包装器也叫做适配器&#xff0c;C中的function本质是一个类模板&#xff0c;也是一个包装器. 为什么需要function呢&#xff1f; 我们来看…

ant-design-vue修改input组件样式

问题场景 不得不说ant-design-vue的样式是真的难改。。。今天尝试了很多种方案&#xff0c;都无疾而终。最终&#xff0c;通过全局scss文件引入的方式解决了。 几种方案&#xff1a; 直接行内样式&#xff0c;发现部分可以&#xff0c;部分不行将style 的scoped属性去掉&#…

非线性负载的主要分类及其特性

非线性负载的主要分类 通常而言&#xff0c;由线性元件原件组成的负载称为线性负载&#xff0c;线性负载的输出与输入呈线性关系&#xff0c;典型的线性负载如电阻、电容和电感等&#xff1b;而由非线性元件构成的负载为非线性负载&#xff0c;在正弦波电压供电时会产生非正弦…

Sentinel服务流控

Sentinel通过流量控制&#xff08;flow control&#xff09;以及熔断降级来保护系统资源 QPS超过阈值直接失败 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对流量进行控制&#x…

如何使用ABAQUS对新能源动力电池进行Pack分析

电池Pack的仿真&#xff0c;按照系统层次&#xff0c;可从电芯、模组、Pack和整车逐级分析。电芯主要集中于机械性能的材料拟合、激光焊接以及电-化学-热-机耦合建模&#xff0c;模组主要集中于跌落、振动以及模组冷却&#xff0c;Pack主要集中于**、冲击和振动以及Pack热管理&…

Token Merging: Your ViT But Faster

论文&#xff1a;https://arxiv.org/pdf/2210.09461.pdf 代码&#xff1a; https://github.com/facebookresearch/ToMe 这篇论文写的很棒呀&#xff0c;以摘要为例&#xff0c;第一句话指明ToMe的作用&#xff08;提高ViT-based模型的训练和推理速度&#xff09;和特色&#x…

java面试强基(21)

什么是线程和进程? 何为进程? ​ 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。 ​ 在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一个 J…

提质增效!北京筑龙助力蒙牛集团采招数智化升级

近两年&#xff0c;全球经济下行压力加剧&#xff0c;市场形势波动使得集团企业面临着很大的经营压力。随着数字经济时代的到来&#xff0c;利用数字技术重构价值链、重组业务流程&#xff0c;或创建新的生态系统平台成为集团企业数字化转型的契机。 蒙牛电子采购招标平台作为…

WEB网页设计期末作业个人主页——基于HTML+CSS制作个人简介网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

现实中的项目范围变更

大多数招投标或签合同的项目(TOG或TOB),范围变更是极少的,一旦发起范围变更申请,这个流程是非常复杂的,而且会有负面影响,尤其是TOG的项目。 项目范围变更,往往会引起项目金额变更,核减、增加、不变都有可能。 TOG项目的范围变更,常是因为政策变了、上级要求等不可…

(附源码)Springboot网上购物平台 毕业设计 141422

Springboot网上购物平台的开发 摘 要 随着Internet的使用越来越广泛&#xff0c;在传统的商业模式中&#xff0c;对于日常各类商品&#xff0c;人们习惯于到各种商家店铺购买。然而在快节奏的新时代中&#xff0c;人们不一定能为购买各类商品腾出时间&#xff0c;更不会耐心挑…

Docker管理工具Portainer忘记admin登录密码怎么办?

Portainer官网解决方法链接 https://docs.portainer.io/v/ce-2.11/advanced/reset-admin 炒鸡详细步骤&#xff01; 1.查看所有容器,包括未运行的 docker ps -a 2.找到Portainer对应信息 3.停止Portainer容器 docker stop portainerid 我这里就应该是 docker stop 507566…

Unity VFX图表初级到中级教程

Unity VFX图表初级到中级教程 从 Unity 学习新的视觉效果工具并开始制作一些很棒的魔法效果 课程英文名&#xff1a;Unity VFX Graph - Beginner To Intermediate 此视频教程共4.5小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全 下载地址 …

【脚本项目源码】Python制作提升成功率90%的表白神器

前言 明天就是拥抱情人节&#xff0c;情侣们会在公开的场合拥抱&#xff0c;向世人宣告你俩的爱意&#xff0c;也让这个寒冷的冬天变得格外温馨。到了年底依然能热情拥抱&#xff0c;也见证了两人情意如昔。 今天小鱼就给大家带来就是的利用Python制作表白神器&#xff0c;记…

年末消费高峰,警惕“大牌平替”的陷阱

就在眼前的双十二&#xff0c;接踵而来的圣诞跨年与春节&#xff0c;买买买的黄金时段&#xff0c;作为消费者&#xff0c;少不了要接受各式营销广告的狂轰滥炸。如今纷繁复杂的消费市场&#xff0c;大家都擦亮了眼睛追求性价比&#xff0c;如果你也曾被“五分之一价格买到大牌…

【云计算与大数据计算】分布式处理CPU多核、MPI并行计算、Hadoop、Spark的简介(超详细)

一、CPU多核和POISX Thread 为了提高任务的计算处理能力&#xff0c;下面分别从硬件和软件层面研究新的计算处理能力 在硬件设备上,CPU 技术不断发展,出现了SMP(对称多处理器)和 NUMA(非一致 性内存访问)两种高速处理的 CPU 结构 在软件层面出现了多进程和多线程编程。进程…

【王道计算机网络笔记】网络层-网络层概述和编址

文章目录IP数据报格式IP数据报分片例题IPv4地址分类的IP地址网络地址转换NAT子网划分与子网掩码无分类编址CIDR主要任务是把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务。网络层的传输单位是数据报&#xff0c;数据报是一个比较长的数据&#xff0c…

基于51单片机的智能热水器无线WiFi控制系统proteus仿真原理图程序

功能&#xff1a; 0.本项目采用STC89C52作为单片机系统的控制MCU 1.LCD1602液晶实时显示温度阈值、当前温度和定时时间 2.支持按键和红外遥控设置温度阈值和定时时间 3.通过传感器检测&#xff0c;判定当前值是否超过设定的阈值&#xff0c;然后对相关继电器进行控制 4.支持声光…

使用DevExpress WPF主题设计器轻松创建Office 2019绿色主题(二)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的The…

数据结构C语言版 —— 时间复杂度空间复杂度概念和计算

文章目录时间复杂度&空间复杂度1. 算法效率2. 时间复杂度1) 时间复杂度的概念2) 大O的渐近表示法3) 时间复杂度案例举例3. 空间复杂度1) 空间复杂度概念2) 计算实例时间复杂度&空间复杂度 1. 算法效率 算法效率分析一般分为两种&#xff0c;一种是时间效率&#xff0…