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


    目录

    1.效果图:

    2.为什么要用:

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

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

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

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

    3.怎么用:

    3.1 原项目的步骤:

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

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


    1.效果图:

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


    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中,在你的原项目:

    1. import Vue from "vue";
    2. import App from "./App.vue";
    3. import router from "./router";
    4. import store from "./store";
    5. import { registerMicroApps, start } from "qiankun"; //++++++++++
    6. Vue.config.productionTip = false;//++++++++++
    7. new Vue({
    8. router,
    9. store,
    10. render: (h) => h(App),
    11. }).$mount("#app");
    12. // 在主应用中注册子应用 //++++++++++
    13. registerMicroApps([
    14. {
    15. name: "vueApp", //子应用名称-自己设置
    16. entry: "//localhost:8091", //子应用启动的地址-自己设置
    17. container: "#container", // 子应用在主应用的容器名称-自己设置
    18. activeRule: "/app-vue", // 路由地址,后面用push()或者route.link.to-自己设置
    19. props: {
    20. data: "child子应用",
    21. }, //传参
    22. },
    23. ]);
    24. // 启动
    25. start();

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

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

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

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

    1. "app">
    2. <span><router-link to="/">点击跳转到父页面router-link>span>
    3. <span><router-link to="/app-vue">点击跳转到子页面router-link>span>
    4. <router-view />
    5. <div id="container">
    6. div>
  • 至此,主应用配置完毕


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

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

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

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

    1. "eslintConfig": {
    2. ......
    3. "globals": {
    4. "__webpack_public_path__": true
    5. }
    6. },

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

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

    还有一个注意点:

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

    1. import "./public-path"; //+++++++++++++++++++++++
    2. import Vue from "vue";
    3. import App from "./App.vue";
    4. import router from "./router";
    5. Vue.config.productionTip = false;//+++++++++++++++++++++++
    6. //+++++++++++++++++++++++
    7. let instance = null;
    8. function render(props = {}) {
    9. const { container } = props;
    10. instance = new Vue({
    11. router,
    12. render: (h) => h(App),
    13. }).$mount(container ? container.querySelector("#app-vue") : "#app-vue");
    14. }
    15. // 独立运行时
    16. if (!window.__POWERED_BY_QIANKUN__) {
    17. render();
    18. }
    19. export async function bootstrap() {
    20. console.log("[vue] vue app bootstraped");
    21. }
    22. export async function mount(props) {
    23. console.log("[vue] props from main framework", props);
    24. render(props);
    25. }
    26. export async function unmount() {
    27. instance.$destroy();
    28. instance.$el.innerHTML = "";
    29. instance = null;
    30. }
    31. new Vue({
    32. router,
    33. render: (h) => h(App),
    34. }).$mount("#app-vue");

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

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

     

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

    将:

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

    修改为:

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

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

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

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

  • 相关阅读:
    SpringBoot项目集成Dubbo
    【Linux】组管理命令
    java+php+python的公文审批系统-办公系统
    工业互联网安全备受关注,防御体系该如何建设?
    golang中的panic 和 recover
    复习Day15:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项
    leetcode - 2707. Extra Characters in a String
    ZKP5.1 Plonk Interactive Oracle Proofs (KZG‘10)
    MySQL高级3-索引的结构和分类
    查看本机Arp缓存,以及清除arp缓存
  • 原文地址:https://blog.csdn.net/wanghaoyingand/article/details/125878115