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的时候是已经可以加载子应用,但出现了问题或者报错

成功载入页面

如果觉得有趣或有收获,请关注我的更新,给个喜欢和分享。您的支持是我写作的最大动力!
往期好文推荐
相关推荐
哇哇哇哇几秒前
vue3 reactive解析
前端
光影少年16 分钟前
Vue的响应式原理?Vue2和Vue3有什么区别?
前端·vue.js·掘金·金石计划
孟祥_成都24 分钟前
Cursor 要被淘汰了?开发者最应该关注的 10 个信号
前端·人工智能
cxxcode32 分钟前
Sentry browserTracingIntegration 实现原理深度解析
前端
孟沐36 分钟前
大白话理解 Java 序列化:对标前端 JSON.stringify/parse
前端
忘ci39 分钟前
electron、edge.js调用C#动态链接库的一些问题
前端
yannick_liu41 分钟前
推荐一个可以在vue2中格式化json数据的插件
前端
可视之道42 分钟前
Canvas 渲染引擎性能优化实战:从 15 FPS 到 55 FPS
前端
小猪努力学前端1 小时前
基于PixiJS的试玩广告开发-续篇
前端·javascript·游戏
bluceli2 小时前
前端构建工具深度解析:从Webpack到Vite的演进之路
前端