为什么要用微前端?如何使用乾坤微前端?

简介: 为什么要用微前端?如何使用乾坤微前端?

1.效果图:


从项目A到项目B,就像是普通的页面跳转一样,但其实是两个项目之间来回“横跳”

0d4c77ba112546a4af0d91dfaf23faf6.gif

2.为什么要用:


2.1.项目越来越大,不好维护时

2.2.如果你不忙,想使用最新的技术又不想影响开发。

 比如说我,现在的项目用的是vue2+ElementUI,使用了乾坤微前端后,可视化大屏用的是vue3.2+TS+vite,然后还有一个页面用的是react Hooks+ts,这样一个项目我就用了三套技术栈,对于提升技术很有帮助

2.3.比如好不容易找到一个轮子,发现人家用的技术栈和自己的项目不一样时

2.4.用起来简单不算麻烦,目前社区逐步成熟了

3.怎么用:


官网:qiankun - qiankun

官网有对于vue、react、以及其他的配置过程

我是以vue2+element UI+webpack为主项目,写一个副项目为vue3+element-plus+vite

3.1 原项目的步骤:


第一步,安装依赖,在你的原项目:

$ yarn add qiankun # 或者 npm i qiankun -S

第二步,main.js中,在你的原项目:

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import { registerMicroApps, start } from "qiankun"; //++++++++++
Vue.config.productionTip = false;//++++++++++
new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount("#app");
// 在主应用中注册子应用 //++++++++++
registerMicroApps([
  {
    name: "vueApp", //子应用名称-自己设置
    entry: "//localhost:8091", //子应用启动的地址-自己设置
    container: "#container", // 子应用在主应用的容器名称-自己设置
    activeRule: "/app-vue", // 路由地址,后面用push()或者route.link.to-自己设置
    props: {
      data: "child子应用",
    }, //传参
  },
]);
// 启动
start();

第三步,vue.config.js,在你的原项目:

module.exports = {
  devServer: {
    port: 8090, //你自己项目的端口号
    headers: {
      "Access-Control-Allow-Origin": "*", // 允许跨域访问子应用页面 ++++++++++
    },
  },
};

第四步:app.js,在你的原项目:

这一步不必按照我的来,其实就是你自己自行加一个跳转的链接,用$router.push()或者route.link.to跳过去

<div id="app">
    <span><router-link to="/">点击跳转到父页面</router-link></span>
    <span><router-link to="/app-vue">点击跳转到子页面</router-link></span>
    <router-view />
    <div id="container">
      <!-- 子应用位置 -->
    </div>
  </div>

至此,主应用配置完毕

3.2 接下来是配置子项目步骤:


第一步,在src文件夹下新建public-path.js文件,并添加如下代码

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

这一步,90%概率会遇到webpack_public_path 未定义,这是因为EsLint的检测机制,所以我们需要在package.json中的eslintConfig中进行如下配置

"eslintConfig": {
    ......
    "globals": {
      "__webpack_public_path__": true
    }
  },

第二步,main.js中,在你的子项目:

注意下:这里和官网的配置不一样,这里很容易报错,按照我这个来就行

还有一个注意点:

还有要注意的是我这里修改了#app#app-vue,原因为#app在主应用中已使用,会冲突,所以对应的index.html与App.vue中也应当修改为#app-vue

import "./public-path"; //+++++++++++++++++++++++
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
Vue.config.productionTip = false;//+++++++++++++++++++++++
//+++++++++++++++++++++++
let instance = null;
function render(props = {}) {
  const { container } = props;
  instance = new Vue({
    router,
    render: (h) => h(App),
  }).$mount(container ? container.querySelector("#app-vue") : "#app-vue");
}
// 独立运行时
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() {
  instance.$destroy();
  instance.$el.innerHTML = "";
  instance = null;
}
new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app-vue");

第三步,配置子应用跨域,,在你的子项目的vue.config.js文件,并添加如下代码

const { name } = require("./package");
module.exports = {
  devServer: {
    port: 8091, //子应用启动端口号,不可随意修改,与上文中父应用注册的子应用端口号对应
    headers: {
      "Access-Control-Allow-Origin": "*", //循序跨域
    },
  },
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: "umd", // 把微应用打包成 umd 库格式
      jsonpFunction: `webpackJsonp_${name}`,
    },
  },
};

第四步,在你的子项目配置路由,打开src/router文件夹下的index.js文件,将以下代码

将:

1. const router = new VueRouter({
2.   routes,
3. });

修改为:

const router = new VueRouter({
  // 这里和主应用中注册子应用时的activeRule对应
  base: window.__POWERED_BY_QIANKUN__ ? "/app-vue" : "/", 
  mode: "history",
  routes,
});

第五步,修改app.vue和index.html中绑定的id,在你的子项目:

1. <template>
2. <div id="app-vue">我是子应用</div>
3. </template>

到这就完成了,我这里还遇到一个不大不小的问题:


子项目的样式有些错乱,检查后发现子项目的font-size继承了父项目的font-size,而父项目用了rem适配,处理的点是body和html的样式中设置font-size的值,解决了。

相关文章
|
2月前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
1月前
|
前端开发 API UED
深入理解微前端架构:构建灵活、高效的前端应用
【10月更文挑战第23天】微前端架构是一种将前端应用分解为多个小型、独立、可复用的服务的方法。每个服务独立开发和部署,但共同提供一致的用户体验。本文探讨了微前端架构的核心概念、优势及实施方法,包括定义服务边界、建立通信机制、共享UI组件库和版本控制等。通过实际案例和职业心得,帮助读者更好地理解和应用微前端架构。
|
2月前
|
前端开发 API UED
拥抱微前端架构:构建灵活、高效的前端应用
【10月更文挑战第17天】微前端架构是一种将前端应用拆分为多个小型、独立、可复用的服务的方法,每个服务可以独立开发、部署和维护。本文介绍了微前端架构的核心概念、优势及实施步骤,并分享了业界应用案例和职业心得,帮助读者理解和应用这一新兴架构模式。
|
2月前
|
存储 监控 前端开发
掌握微前端架构:构建未来前端应用的基石
【10月更文挑战第12天】随着前端技术的发展,传统的单体应用架构已无法满足现代应用的需求。微前端架构通过将大型应用拆分为独立的小模块,提供了更高的灵活性、可维护性和快速迭代能力。本文介绍了微前端架构的概念、核心优势及实施步骤,并探讨了其在复杂应用中的应用及实战技巧。
|
2月前
|
前端开发 JavaScript
乾坤qiankun(微前端)样式隔离解决方案--使用插件替换前缀
乾坤qiankun(微前端)样式隔离解决方案--使用插件替换前缀
452 8
|
2月前
|
前端开发 JavaScript 开发者
qiankun(乾坤)微前端框架简介
qiankun(乾坤)微前端框架简介
208 1
|
2月前
|
存储 监控 前端开发
掌握微前端架构:构建可扩展的前端应用
【10月更文挑战第6天】随着前端应用复杂性的增加,传统单体架构已难以满足需求。微前端架构通过将应用拆分为独立模块,提升了灵活性与可维护性。本文介绍微前端的概念、优势及实施步骤,包括定义边界、创建共享UI库、设置通信机制等,并探讨其在SPA扩展、大型项目模块化及遗留系统现代化中的应用。通过实战技巧如版本控制、配置管理和监控日志,帮助团队高效协作,保持应用灵活性。微前端架构为构建大型前端应用提供有效解决方案,适合希望提升项目可扩展性的开发者参考。
|
3月前
|
前端开发 JavaScript 架构师
了解微前端,深入前端架构的前世今生
该文章深入探讨了微前端架构的起源、发展及其解决的问题,并详细讲解了微前端在现代Web应用中的实现方式与优势,帮助读者理解微前端的设计理念和技术细节。
|
3月前
|
前端开发 测试技术 API
探索微前端架构:构建现代化的前端应用
在软件开发中,传统单体架构已难以满足快速迭代需求,微前端架构应运而生。它将前端应用拆分成多个小型、独立的服务,每个服务均可独立开发、测试和部署。本文介绍微前端架构的概念与优势,并指导如何实施。微前端架构具备自治性、技术多样性和共享核心的特点,能够加速开发、提高可维护性,并支持灵活部署策略。实施步骤包括定义服务边界、选择架构模式、建立共享核心、配置跨服务通信及实现独立部署。尽管面临服务耦合、状态同步等挑战,合理规划仍可有效应对。
|
4月前
|
前端开发 持续交付 开发者
探索现代前端开发中的微前端架构
微前端架构作为一种新兴的前端开发模式,旨在解决传统单体前端应用在可维护性和可扩展性方面的挑战。本文将深入探讨微前端的基本概念、实施方式以及其在提升团队协作效率和应用灵活性方面的优势。同时,我们还将探讨微前端架构的实现细节和常见的技术选型,以帮助开发者在实际项目中成功应用这一理念。