微前端框架qiankun源码剖析之上篇

微前端框架qiankun源码剖析之上篇

介绍

本篇文章将深入剖析微前端框架qiankun的源码,并且讨论它的工作原理和实现细节。qiankun是一个优秀的微前端解决方案,它可以帮助我们将多个独立的单页应用程序整合到一个整体中,从而实现一个统一的用户体验。在这篇文章中,我们将介绍qiankun的两大核心模块,分别是“qiankun”和“single-spa”,并且举例说明它们如何在实际项目中应用。

qiankun模块

qiankun模块是微前端框架qiankun中最核心的模块,它实现了应用程序之间的通信,以及动态载入应用程序的功能。我们可以通过如下代码来启动一个qiankun应用:

import { registerMicroApps, start } from 'qiankun';

// 注册微应用
registerMicroApps([
  {
    name: 'app1',
    entry: '//localhost:8001',
    container: '#microapp-container',
    activeRule: '/app1',
  },
  {
    name: 'app2',
    entry: '//localhost:8002',
    container: '#microapp-container',
    activeRule: '/app2',
  },
]);

// 启动应用
start();

在这段代码中,我们先使用registerMicroApps函数注册两个微应用:app1和app2,这两个微应用分别与两个不同的端口对应。然后我们使用start函数启动应用,qiankun将会自动加载并渲染注册的微应用。值得注意的是,我们需要提供container参数,将微应用映射到一个容器中。

single-spa模块

single-spa模块是一种微前端路由框架,qiankun就是基于single-spa模块实现的。single-spa模块非常强大,可以实现子应用之间完全独立、任意组合的特性。我们可以通过如下代码来启动一个single-spa应用:

import { registerApplication, start } from 'single-spa';

// 注册子应用
registerApplication(
  'app1',
  () => import('//localhost:8001/index.js'),
  () => location.pathname.startsWith('/app1')
);

registerApplication(
  'app2',
  () => import('//localhost:8002/index.js'),
  () => location.pathname.startsWith('/app2')
);

// 启动应用
start();

在这段代码中,我们先使用registerApplication函数注册两个子应用:app1和app2,这两个子应用分别与两个不同的端口对应。然后我们使用start函数启动应用,single-spa将会自动加载并渲染注册的子应用。我们需要提供一个判断函数,用于判断当前路由是否匹配子应用。

示例说明

以下是一个基于qiankun实现的示例应用。这个应用包含了一个主应用和两个子应用,主应用是一个React应用,两个子应用分别是一个Vue应用和一个Angular应用。

import React, { useState } from 'react';
import ReactDOM from 'react-dom';
import { registerMicroApps, start } from 'qiankun';

function App() {
  const [state, setState] = useState('');
  return (
    <div>
      <h1>{state}</h1>
      <button onClick={() => setState('app1')}>Load App1</button>
      <button onClick={() => setState('app2')}>Load App2</button>
      <div id="microapp-container"></div>
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));

registerMicroApps([
  {
    name: 'app1',
    entry: '//localhost:8001',
    container: '#microapp-container',
    activeRule: '/app1',
  },
  {
    name: 'app2',
    entry: '//localhost:8002',
    container: '#microapp-container',
    activeRule: '/app2',
  },
]);

start();

在这个应用中,我们首先定义了一个主应用,其中有两个按钮可以分别加载app1和app2子应用,并将它们映射到微应用容器中。我们还需要在两个子应用的入口文件中分别定义一个生命周期函数:

// ./app1/index.js
import Vue from 'vue';
import router from './router';
import App from './App.vue';
import { lifeCycle, registerMicroApps } from 'qiankun';

Vue.config.productionTip = false;
let instance = null;

function render(props) {
  instance = new Vue({
    router,
    render: (h) => h(App),
  }).$mount('#app');
}

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

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

export async function bootstrap(props) {

}

export async function mount(props) {
  console.log(props);
  render(props);
}

export async function unmount(props) {
  instance.$destroy();
}
// ./app2/index.js
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
import { lifeCycle } from 'qiankun';

if (environment.production) {
  enableProdMode();
}

let instance = null;

function render(props) {
  platformBrowserDynamic()
    .bootstrapModule(AppModule)
    .then((module) => {
      instance = module;
    })
    .catch((err) => console.error(err));
}

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

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

export async function bootstrap(props) {}

export async function mount(props) {
  console.log(props);
  render(props);
}

export async function unmount(props) {
  instance.destroy();
}

在子应用中,我们使用了qiankun提供的生命周期函数:bootstrap、mount和unmount。这些函数分别对应应用的加载、渲染和卸载,我们可以在这些函数中做一些初始化或清理的操作。

在示例应用中,我们使用了Vue和Angular两个不同的框架来实现子应用,这说明qiankun可以很好地支持不同框架之间的融合。最终我们可以启动此应用,并在主应用中点击按钮动态加载子应用。

结论

本篇文章对微前端框架qiankun的源码进行了深入剖析,并且介绍了其核心模块qiankun和single-spa的实现原理和细节。我们通过一个示例说明了qiankun可以支持不同框架之间的融合,并展示了如何在实际项目中使用qiankun。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微前端框架qiankun源码剖析之上篇 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 在vscode中统一vue编码风格的方法

    在VSCode中统一Vue编码风格是一个很好的实践,可以方便多人协作开发以及代码更加整洁和易于维护。以下是完整的攻略: 步骤一:安装Vue CLI Vue CLI是一个官方命令行工具,可以帮助我们快速搭建Vue项目,并集成了ESLint等工具,可以帮助我们统一代码风格。Vue CLI的安装方法可以参考Vue官方文档。 步骤二:初始化项目 安装好Vue CLI…

    Vue 2023年5月27日
    00
  • 用Vue.js开发网页时钟

    要用Vue.js开发网页时钟,可以按照以下步骤进行操作: 步骤1:创建Vue项目 首先需要在本地安装Vue.js。如果已经安装了,那么就可以运行以下命令创建新的Vue项目: vue create clock 此处以clock为项目名。 创建后可以进入项目目录: cd clock 步骤2:创建时钟组件 接下来需要创建一个时钟组件,用来展示时间。 在compon…

    Vue 2023年5月29日
    00
  • 解决vue中reader.onload读取文件的异步问题

    解决Vue中reader.onload读取文件的异步问题可以考虑以下两种方法: 方法一:使用Promise 当我们想要在Vue中对reader.onload事件进行操作时,由于它是异步的,我们可以使用Promise将其转换为同步的操作。具体步骤如下: 创建一个方法,用于处理异步操作: function readMyFile(file) { return ne…

    Vue 2023年5月28日
    00
  • Vue安装浏览器开发工具的步骤详解

    下面是“Vue安装浏览器开发工具的步骤详解”攻略: 1. 前置条件 在安装Vue的浏览器开发工具之前,需要确保以下两个条件已经满足:1. 拥有安装Vue的基础,可以使用npm命令行在终端中安装Vue.js。2. 时间充足,可以耐心地按照以下详细步骤进行操作。 2. 安装Vue的浏览器开发工具 2.1. 安装Vue.js开发工具:Vue Devtools Vu…

    Vue 2023年5月27日
    00
  • Vue XStream 2016 中文破解版安装教程(附破解文件)

    下面我将为您详细讲解“Vue XStream 2016 中文破解版安装教程(附破解文件)”的完整攻略。具体步骤如下: 第一步:下载安装包和破解文件 首先,你需要下载 Vue XStream 2016 中文破解版的安装包和破解文件。可以在百度网盘或者其它资源网站中寻找下载链接。 下载好后,将其解压缩。 第二步:进入安装程序 进入解压缩后的文件夹,找到其中的“s…

    Vue 2023年5月27日
    00
  • vue集成openlayers加载geojson并实现点击弹窗教程

    下面我将为您详细讲解关于vue集成openlayers加载geojson并实现点击弹窗的完整攻略。这里我将分成以下几个步骤: 安装 OpenLayers 安装 vue-ol 加载 GeoJSON 数据 实现点击弹窗 首先,您需要在 Vue 项目中安装 OpenLayers。可以通过 npm 进行安装: npm install ol 接着,在 Vue 项目中安…

    Vue 2023年5月28日
    00
  • vue中this.$refs.name.offsetHeight获取不到值问题

    问题背景: 在vue开发中,有时候我们需要获取某个元素或者组件的高度值,利用this.$refs.name.offsetHeight是个非常简便的方式,但是它并不总是奏效,许多开发者在这种情况下却无法获取到对应的高度值,究竟是为什么呢? 解决方案: 经过笔者的实践和总结,出现这种问题的情况大多是因为元素或组件还没有被渲染到Dom树上,因此高度值无法获取。针对…

    Vue 2023年5月29日
    00
  • vue自定义组件(通过Vue.use()来使用)即install的用法说明

    Vue.use()的定义: Vue.use()是用来注册Vue插件的方法,本质上就是调用插件对象的install方法注册插件,所以使用Vue.use()注册插件的前提是,必须提供一个具有install方法的对象作为插件。 插件的定义: 插件其实就是一个具有install方法的JavaScript对象。这个install方法有一个Vue构造器作为参数,来给Vu…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部