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

yizhihongxing

微前端框架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日

相关文章

  • Vue 大文件上传和断点续传的实现

    实现 Vue 大文件上传和断点续传需要掌握以下几个步骤: 分片:将大文件分割成若干个小块,便于上传。一般采用 Blob 对象或 ArrayBuffer 来实现。 上传:将分片文件上传到服务器。可以使用 XMLHttpRequest、Fetch 等工具进行上传。 断点续传:如果上传失败或上传过程中断开连接,需要记录已上传的分片,下次上传时跳过已上传的分片。 合…

    Vue 2023年5月28日
    00
  • vue中如何实现拖拽调整顺序功能

    首先我们需要理解Vue中拖拽调整顺序的工作原理和步骤。通常的实现方式是用Vue的指令v-for生成一个列表,然后通过给每个列表项添加拖放事件来实现拖拽和调整顺序。 以下是实现vue中拖拽调整顺序的具体步骤: 第一步:安装依赖 在Vue项目中需要使用vue-dragscroll和vuedraggable这两个库,因此需要先进行安装。 npm install -…

    Vue 2023年5月28日
    00
  • vue-i18n的9以上版本中@被用作特殊字符处理,直接用会报错问题

    在vue-i18n的9以上版本中,@符号被用作特殊字符处理。如果在国际化文件中直接使用@符号,会导致解析错误并报错。因此,需要进行转义处理,才能正常使用。 处理方法如下: 1.将@符号转义为其HTML实体编码,即”@”。 将”@”转义为”@”可以避免在vue-i18n中使用@符号时报错。例如,以下是一个包含@符号的英文字符串: { &quot…

    Vue 2023年5月27日
    00
  • vue 文件切片上传的项目实现

    下面我将详细讲解“Vue 文件切片上传的项目实现”的完整攻略。该过程主要分为以下五个步骤: 安装依赖库 开发项目之前需要先安装以下库: axios:用于发起后端请求; element-ui:基于 Vue 的组件库,提供了上传文件的组件; js-sha256:计算文件的哈希值。 可以使用以下命令进行安装: npm install axios element-u…

    Vue 2023年5月28日
    00
  • 手把手教你搭建一个vue项目的完整步骤

    下面是搭建Vue项目的完整步骤: 1. 创建Vue项目 创建Vue项目有多种方式,这里我们以 Vue CLI 为例。先确保已经安装了 Node.js,然后执行命令: npm install -g @vue/cli 安装成功后,使用 vue create 命令创建项目: vue create my-project 根据提示选择一些基本配置,然后等待安装完成即可…

    Vue 2023年5月28日
    00
  • vue项目中使用eslint+prettier规范与检查代码的方法

    使用 Eslint 和 Prettier 来规范和检查 Vue 项目的代码是很有必要的,可以提高代码质量和可维护性,这里提供一个完整的攻略。 安装 Eslint 和 Prettier 首先,需要在项目中安装 Eslint 和 Prettier。可以使用 npm 或者 yarn 来安装。 npm install eslint prettier eslint-p…

    Vue 2023年5月27日
    00
  • vue devserver及其配置方法

    Vue DevServer的介绍和配置方法 什么是Vue DevServer? Vue DevServer是Vue CLI中一个用于调试Vue应用的开发服务器,它可以在本地开启一个服务器运行Vue应用,并提供实时重载(live reloading)、热替换(hot reloading)等等开发者常用的功能,以提高开发效率。 如何配置Vue DevServer…

    Vue 2023年5月27日
    00
  • vue项目中自动导入svg并愉快的使用方式

    Vue项目中自动导入SVG并愉快的使用方式的攻略需要涉及到以下几个步骤: 1. 安装相关依赖 svg-sprite-loader:用于对SVG进行打包处理,将SVG图标精灵化。 svgo-loader:对SVG进行压缩和优化,减少SVG的文件大小。 npm install svg-sprite-loader svgo-loader -D 2. 配置webpa…

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