惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
量子位
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
爱范儿
爱范儿
博客园 - 【当耐特】
Vercel News
Vercel News
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
博客园 - 叶小钗
博客园_首页
V
Visual Studio Blog
宝玉的分享
宝玉的分享
B
Blog
MyScale Blog
MyScale Blog
C
Check Point Blog
博客园 - 三生石上(FineUI控件)
L
LangChain Blog
V
V2EX

博客园 - liulun

开源自荐:功能齐全的截图软件(仅1M) 开源自荐:功能齐全的截图工具(含录屏、截长图,体积仅780KB) 自荐:开源截图工具ScreenCapture:超多控制指令,支持截长图 脚踏esbuild祥云,胸怀tsx利刃,身披scss羽衣,追寻前端的本质 开源项目自荐:截图工具(小、快、功能丰富) 如何开发Vite3插件构建Electron开发环境 Electron是什么以及可以做什么 线上Electron应用具备哪些特征? 桌面软件开发框架大赏 如何把Electron做成一个Runtime,让多个应用共享同一个Electron 微软要放弃Electron了???聊聊WebView2 自己实现一个Electron跨进程消息组件(兼新书自荐) 一个Electron的设计缺陷及应对方案 如何点击穿透Electron不规则窗体的透明区域 Electron团队为什么要干掉remote模块 谈Vite在Electron环境下吃花卷拉馒头的现象 公司只提供签名服务,不提供证书文件,如何打包Electron应用 Vite ❤ Electron——基于Vite搭建Electron+Vue3的开发环境【一】 Electron安装过程深入解析(读完此文解决Electron安装失败导致的无法启动,无法打包的问题) 大型Electron应用本地数据库技术选型 极客手中的利器Electron
vue3微前端架构——基于蚂蚁qiankun框架
liulun · 2020-12-05 · via 博客园 - liulun

楔子

首先,目前qiankun框架尚不支持vite,

微应用不能使用vite创建,

即使只是生产环境加的载微应用也不行,

因为vite打包代码时,内部的esbuild会tree shake掉与qiankun相关的生命周期钩子,

主应用没影响,使用什么创建项目都无所谓

主应用

没啥特殊的,随便一个组件里留个容器div

<div id="container"></div>

在一个方法内加载微应用

import { loadMicroApp } from 'qiankun';
export default {
  setup(){
    let create = ()=>{
      loadMicroApp({ 
          name: 'vue3', 
          entry: 'http://localhost:7105/',
          container: '#container', 
        });
    }
    return {create};
  }
}

通过路由注册微应用的方式,请自己看文档

微应用

配置文件:vue.config.js

const path = require('path');
const { name } = require('./package');

function resolve(dir) {
  return path.join(__dirname, dir);
}

const port = 7105;

module.exports = {
  outputDir: 'dist',
  assetsDir: 'static',
  filenameHashing: true,
  devServer: {
    hot: true,
    disableHostCheck: true,
    port,
    overlay: {
      warnings: false,
      errors: true,
    },
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  // 自定义webpack配置
  configureWebpack: {
    resolve: {
      alias: {
        '@': resolve('src'),
      },
    },
    output: {
      // 把子应用打包成 umd 库格式
      library: `${name}-[name]`,
      libraryTarget: 'umd',
      jsonpFunction: `webpackJsonp_${name}`,
    },
  },
};

router.js

import HelloWorld from "./components/HelloWorld.vue";
import HelloWorld2 from "./components/HelloWorld2.vue";
import { createRouter, createWebHistory } from "vue-router";
const routes = [
  { path: "/", component: HelloWorld },
  { path: "/about", component: HelloWorld2 },
];
const router = createRouter({
  history: createWebHistory(window.__POWERED_BY_QIANKUN__ ? "/vue3" : "/"),
  routes,
});
export default router;

main.js

这里有好多钩子,是给主应用用的

if (window.__POWERED_BY_QIANKUN__) {
  // eslint-disable-next-line no-undef
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
let instance = null;

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

  instance = createApp(App);
  instance.use(router);
  instance.mount(container ? container.querySelector("#app") : "#app");
}

if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

export async function bootstrap() {
  console.log("%c ", "color: green;", "vue3.0 app bootstraped");
}

export async function mount(props) {
  render(props);
  instance.config.globalProperties.$onGlobalStateChange =
    props.onGlobalStateChange;
  instance.config.globalProperties.$setGlobalState = props.setGlobalState;
}

export async function unmount() {
  instance.unmount();
  instance._container.innerHTML = "";
  instance = null;
}

app.vue

<template>
<button @click="go('/')">home</button>
<button @click="go('/about')">sub</button>
  <router-view></router-view>
</template>

<script>
import router from "./router"
export default {
  setup(){
    let go = (p)=>{
      router.push(p)
    }
    return {go}
  }
}
</script>