微应用-qiankun

前言

现在多数比较复杂的项目都会采用微应用的方式进行开发,一方面是对技术没有特别严格的要求,比如整个项目react,vue可以任意使用,另一方面也降低了各个模块的复杂度,但是微应用的学习成本也是不可忽略的因素。目前项目中已经采用了微应用开发,后面几篇文章会针对微应用做详细阐述,本篇使用qiankun来进行一个demo测试,后续会对这个几个微前端框架进行一个详细对比

1 相关概念

qiankun 官网 qiankun.umijs.org/zh/guide

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。 各个子应用独立开发、独立部署,互不影响。

2 搭建项目

踩坑

目前公司使用的是无界进行微应用的开发,脚手架用的vite。然后我就没仔细看文档,就想着开始直接用 vite 创建vue3 来测试qiankun,理想很丰满,现实很打脸,没想到qiankun更新这么久的框架对vite的支持不是很友好,当时有报错去查问题,各种方法都去尝试,结果还是有问题,搞了一个几个小时就放那了,第二天又查资料才知道需要配置插件,不然不能使用,好家伙,掉坑里了。

创建应用

我们来创建一个react项目作为一个主应用,再创建一个同样的react做为子应用

1、安装 create-react-app

npm install -g create-react-app

2、检测 create-react-app 是否安装成功

create-react-app -V

3、创建 React 项目 (可以在同一个文件夹下)

npx create-react-app micro-main-app (主应用)
npx create-react-app micro-react1 (子应用)

设置端口

同时我们可以在这个两个应用的根目录添加一个.env文件,设置我们本地开发的端口,这样可以避免端口占用,根据自己实际情况来设置。

主应用修改

进入 micro-main-app 目录安装 qiankun
$ yarn add qiankun # 或者 npm i qiankun -S

修改 index.js (已经删除了一些多余的文件)

js 复制代码
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { registerMicroApps, start } from 'qiankun';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <App />
);


registerMicroApps([
  {
    name: 'micro-react1', // 子应用名称,尽量和子应用package.json name 一致
    entry: '//localhost:8001', //子应用env设置的端口
    container: '#reactContainer', //子应用渲染节点
    activeRule: '/reactActiveRule', //路由监听,如果进入该路由,则渲染子应用
  }
]);

start();

修改app.js

js 复制代码
function App() {
  return (
    <div className="App">
      我是主应用
      {/* 子应用渲染节点,(必须)*/}
      <div id="reactContainer"></div>
    </div>
  );
}

export default App;

子应用修改

src 下新建 public-path.js,在 index.js 最顶部引入

js 复制代码
if (window.__POWERED_BY_QIANKUN__) {
    // eslint-disable-next-line no-undef
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
  }

根目录创建 webpack.config.js

js 复制代码
const packageName = require('./package.json').name;
module.exports = {
  output: {
    library: `${packageName}-[name]`,
    libraryTarget: 'umd',
    jsonpFunction: `webpackJsonp_${packageName}`,
  },
};

index.js 导出生命周期

js 复制代码
 import './public-path';
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('rootReact'));
root.render(
  <App />
);

if (!window.__POWERED_BY_QIANKUN__) {
  root.render(
    <App />
  )
}
export async function bootstrap() {
  // 启动微应用
}
export async function mount() {
  // 加载微应用
}
export async function unmount() {
  // 卸载微应用
}
export async function update() {
  // 更新微应用
}

此时所有项目配置都已经完成,正常的是已经可以从主应用打开子应用的 我们把两个应用服务跑起来,一个8000端口,一个8001端口

此时两个服务都已经正常运行,我们从浏览器地址栏修改主应用的ulr进行测试

可以从页面上看到子应用是已经加载进来了,但是有报生命周期函数的错,按照官方给的几点常见问题去排查修复,都无法解决。

解决方案

子应用 index.js 添加该方法

blog.csdn.net/qq_40513881... 附上地址 测试

最后

下一篇会进行vue子应用的添加以及整体项目的完善

相关推荐
腾讯TNTWeb前端团队6 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪10 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom11 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom11 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom11 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试