qiankun基座+react+vite子应用搭建微前端

主应用

你可以选择在现有的项目进行搭建qiankun基座,也可以新开一个项目来搭建qiankun基座

我这里直接选择在已有项目搭建一个

先安装 qiankun

csharp 复制代码
$ yarn add qiankun # 或者 npm i qiankun -S

注册主应用

php 复制代码
import { registerMicroApps, start } from 'qiankun';


registerMicroApps([
  {
    name: 'datartApp', // app name registered
    entry: '//localhost:5174',
    container: '#subapp',
    activeRule: '/IframePage/iframe_test',
  },
]);
// 启动 qiankun
start();

几个说明

name是子应用的名称,这个后面可以看到 entry就是子应用的启动地址 container是子应用挂载到基座的节点 activeRule是触发加载子应用的路由,当然也有不是通过路由触发子应用的方法

注册子应用

使用vite-plugin-qiankun插件

1.在main.jsx中挂载

和官网的有所不同,这个写法判断是否前端环境去挂载到对应的节点上

js 复制代码
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App.jsx';
import { Provider } from 'react-redux';
import store from './store';
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper';
import React from 'react'

let root = null; // 👈 保存 createRoot 实例

// 创建 React 渲染方法
const render = (props = {}) => {
  const { container } = props;
  const mountNode = container
    ? container.querySelector('#root')
    : document.getElementById('root');

  if (mountNode) {
    root = createRoot(mountNode); // 👈 保存实例  
    root.render(
      <Provider store={store}>
        <App />
      </Provider>
    );
  }
};

console.log(qiankunWindow.__POWERED_BY_QIANKUN__, 'qiankun环境下');

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

renderWithQiankun({
  mount(props) {
    console.log('mount');
    render(props);
  },
  bootstrap() {
    console.log('bootstrap');
  },
  unmount(props) {
    console.log('unmount');
    root?.unmount(); // 👈 正确卸载
    const { container } = props;
    const mountNode = container?.querySelector('#root');
    if (mountNode) mountNode.innerHTML = ''; // 可选:清理内容
    root = null;
  },
});

2.vite的配置修改,声明挂载节点和名称

这里的datartApp就是对应上面在主应用基座里面的配置

js 复制代码
plugins: [
      react(),
      tailwindcss(), 
      qiankun("datartApp", {
        useDevMode: true,
      })],

配置好子应用之后的报错

这个错误通常发生在微前端子应用的 HTML 中使用 <script type="module"> 来引入脚本时,它可能会发生冲突,特别是在处理 react-refresh 和 HMR(热模块替换)时。

错误的原因:

react-refresh 是 React 开发模式下热模块替换的一部分,用来在不刷新整个页面的情况下更新组件。如果在微前端(比如 qiankun)的子应用中引入了这个模块,它可能会与其他脚本冲突,导致遇到 import-html-entry 相关的错误。

js 复制代码
import qiankun from 'vite-plugin-qiankun';
export default defineConfig(({mode}) => {
  const isDev = mode === 'development'
  return {
    plugins: [
      !isDev && react(),
      tailwindcss(), 
      qiankun("datartApp", {
        useDevMode: true,
      })],

这里就不会引入react,react就不会初始化,所以需要在入口文件引入一遍

这种挂载到window的操作会报错 不能在子应用中使用,需要排除一下,不然控制台都是报错

子应用路由修改

配置和主应用触发路由相同的路由,加载对应的页面

访问路由尝试

注册主应用的时候,声明的触发路由是

js 复制代码
activeRule: '/IframePage/iframe_test',

所以直接访问即可,当路由切换过去 可能会整个页面会被挂载失效,请检查下对应的name和挂载的dom节点是否正确,发现died的时候是已经可以加载子应用,但出现了问题或者报错

成功载入页面

如果觉得有趣或有收获,请关注我的更新,给个喜欢和分享。您的支持是我写作的最大动力!
往期好文推荐
相关推荐
姜太小白34 分钟前
【前端】CSS Grid布局介绍及示例
前端·css
风继续吹..4 小时前
后台管理系统权限管理:前端实现详解
前端·vue
yuanmenglxb20044 小时前
前端工程化包管理器:从npm基础到nvm多版本管理实战
前端·前端工程化
新手小新5 小时前
C++游戏开发(2)
开发语言·前端·c++
我不吃饼干5 小时前
【TypeScript】三分钟让 Trae、Cursor 用上你自己的 MCP
前端·typescript·trae
小杨同学yx6 小时前
前端三剑客之Css---day3
前端·css
Mintopia8 小时前
🧱 用三维点亮前端宇宙:构建你自己的 Three.js 组件库
前端·javascript·three.js
故事与九8 小时前
vue3使用vue-pdf-embed实现前端PDF在线预览
前端·vue.js·pdf
Mintopia9 小时前
🚀 顶点-面碰撞检测之诗:用牛顿法追寻命运的交点
前端·javascript·计算机图形学
wb1899 小时前
企业WEB应用服务器TOMCAT
运维·前端·笔记·tomcat·云计算