首页 > 其他分享 >qiankun+vite+vue3从零搭建一个微前端架构系统

qiankun+vite+vue3从零搭建一个微前端架构系统

时间:2024-11-28 10:33:44浏览次数:9  
标签:vue app qiankun 应用 vue3 import vite

本文将记录一下从零搭建一个微前端架构系统,技术栈使用qiankun+vite+vue3,后面还会持续分享主应用与微应用通信,组件共享,性能优化等内容。

qiankun官网:介绍 - qiankun

参考网站:Micro Frontends

一、微前端架构介绍

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。

  1. 技术栈无关。微应用可以是你喜欢的任意技术栈,Vue、React or Angular…
  2. 独立部署
  3. 独立运行。微应用之间状态隔离

在这里插入图片描述

二、项目搭建与准备

1. 创建主应用和子应用

  • 使用 vite 分别创建主应用项目和子应用项目。可以通过 npm create vue@latest 命令并按照提示进行相应配置来创建基础的 vite 项目。
  • 在主应用和子应用中安装 Element Plus(因为后续会用到,提前先配置好),在项目目录下执行 npm install element-plus,并且按需引入相关组件和样式(可通过自动导入插件等方式实现更便捷的引入)。
  • 在主应用中安装 qiankun,执行 npm install qiankun

2. 配置主应用

  • 在主应用的入口文件(main.ts)中,引入并注册 Element Plus 组件(假设采用按需引入方式,需先配置好自动导入插件如 unplugin-vue-componentsunplugin-auto-import)。
  • 按照 qiankun 的要求配置主应用,主要包括注册子应用、设置生命周期等。

main.ts文件

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { registerMicroApps, start } from 'qiankun'

const app = createApp(App)

app.use(router)
app.use(ElementPlus)

app.mount('#app')

registerMicroApps(
    [
        {
            name: 'silvia micro app', // app name registered
            entry: '//localhost:5174', // 微应用的出口地址
            container: '#container', // 微应用挂载的容器id
            activeRule: '/sivia-micro', // 微应用激活路由规则
        }
    ]
)

start()

AboutView.vue文件(这里直接在vite创建的AboutView.vue文件写展示子应用的代码)

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

3. 配置子应用

  • 子应用需要导出相应的生命周期函数供 qiankun 调用,比如 bootstrapmountunmount 等。main.ts文件:
import App from './App.vue';
import { createApp } from 'vue';

let router = null;
let app: any = null;
function render(props?: { container: HTMLElement; onGlobalStateChange: () => void; setGlobalState: () => void; }) {
    app = createApp(App)
    app.mount('#container')
}

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

export async function bootstrap() {
    console.log('[vue] vue app bootstraped');
}
export async function mount(props: any) {
    console.log('[vue] props from main framework', props);
    render(props);
}
export async function unmount() {
    app?.$destroy();
    app.$el.innerHTML = '';
    app = null;
    router = null;
}
  • 上面代码中window.__POWERED_BY_QIANKUN__可能会报错,需要建一个.d.ts文件。我建在了src/types/d.ts/index.d.ts这个路径了
interface Window {
    __POWERED_BY_QIANKUN__?: boolean;
    __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string;
}
  • index.html文件中修改挂载点:id需要改成’container’
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
  </head>
  <body>
    <div id="container"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

  • vite.config.ts中添加qiankun相关配置!(非常重要,否则微应用启动不起来):

先安装npm i vite-plugin-qiankun

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
import qiankun from 'vite-plugin-qiankun'

// https://vite.dev/config/
export default defineConfig({
    plugins: [
        vue(),
        qiankun('silvia-micro', { useDevMode: true }),//配置微应用名字
        vueDevTools(),
    ],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url))
        },
    },
})

三、项目启动

  • 主应用和微应用都npm run dev
    在这里插入图片描述

  • 打开主应用url,然后点击Micro(这里我改了vite自动创建完成的按钮名称及跳转的path name),就能发现路由切换为你自己的微应用路由了,并且在主应用的右侧加载出了子应用
    在这里插入图片描述

基础搭建先写到这里,后面会继续分享主应用与子应用通信方式,组件共享等内容,希望大家持续关注。

标签:vue,app,qiankun,应用,vue3,import,vite
From: https://blog.csdn.net/weixin_43162494/article/details/144093336

相关文章

  • [Vue] Typescript for Vue3 (defineProps, withDefaults, defineEmits)
    Defineacomponentwithpropsanddefualtpropsvalue<scriptsetuplang="ts">import{ref,onMounted}from'vue'importfetchCountfrom'../services/fetchCount'interfaceProps{limit:number,alertMessageOnLim......
  • vue2升级vue3
    vue2升级vue3针对../vue3-elm-master项目升级做的解析,该项目目前是webpack@1,vue@2.1.vue2的缺点,vue3的优势.vue2的劣势vue2的组件代码复用是用mixin,容易出现命名冲突,且无法解决业务逻辑的复用.vue2的mixin代码复用不好处理,本质是把mixin里的属性和方法直接赋值......
  • vue3手搓固钉组件
    #创作灵感    今天用固钉组件时发现element-ui的固钉会阻止移动端移动事件,我思来想去决定自己写一个固定组件得了实现思路        获取钉子的ref实例并监听window滚动事件,当window.scrollY等于钉子的offsetHeight,添加position:fixed和top:0到钉子上,就能强......
  • vue3-路由Router
    基本使用(与vue2语法有差异)安装vue-router,vue3需要使用vue-router的4版本npmivue-router@4编写路由文件//引入createRouterimport{createRouter,createWebHistory}from"vue-router";//引入组件importUserInfofrom"@/components/UserInfo.vue";//创......
  • vue3-setup中使用响应式
    基本类型的响应式数据在Vue3中,ref是一个函数,用于创建响应式的数据。它主要用于处理基本类型(如数字、字符串、布尔值等)的数据响应式当我们调用ref函数时,会返回一个包含一个.value属性的对象。这个对象会被转换成Proxy对象,通过拦截getter和setter操作,实现对.valu......
  • vue3-事件总线
    事件总线的概念:事件总线(EventBus)可以理解为一个全局的发布/订阅模式,可以通过它来实现不同组件之间的消息传递。在Vue实例或Vue组件中充当一个中央枢纽,通过它可以让一个组件发出事件,而其他组件监听并响应这些事件事件总线的创建Vue3版本中,我们不再使用newVue()来创建事件总......
  • vue3+vite打包配置,并部署nginx,解决部署之后axios请求跨域
    配置base配置base避免打包部署到服务器上后可能会报404,无法正确的获取的资源。//vite.config.tsexportdefaultdefineConfig({ base:"./"})配置路径别名//vite.config.tsimport{defineConfig}from"vite";importvuefrom"@vitejs/plugin-vue";//配置组件路......
  • 基于vite创建的react18项目的单元测试
    题外话最近一个小伙伴进了字节外包,第一个活就是让他写一个单元测试。嗯,说实话,在今天之前我只知道一些理论,但是并没有实操过,于是我就试验了一下。通过查询资料,大拿们基本都说基于vite的项目,用vitest进行测试比较方便一写。闲话不多说,步入正题。1、下载依赖在vscode终端输......
  • vue3-setup基本使用(非响应式数据)
    OptionsAPI与COmpositionAPI选项式APiVue2的AP设计是Options(配置、选项式)风格的Options类型的API,数据、方法、计算属性等,是分散在:data、methods、computed中的,若想新增或者修改一个需求,就需要分别修改:data、methods、computed,不便于维护和复用组合式APIVue3的API设计......
  • Vue3医院陪诊全栈项目
    02环境配置和项目搭建(1)下载npm1.1.12版本 https://nvm.uihtm.com(2)安装node.js vscode里进行终端调试:>nvm>nvminstall20.16.0 (通过nvm下载要用的node.js版本,本项目使用的node.js版本为20.16.0)>nvmlist (查看当前下载的依赖)>nvmuse20.16.0 (切换到指定的nod......