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

相关文章

  • 详解Vue 匿名、具名和作用域插槽的使用方法

    当我们在Vue中使用插槽时,通常会使用匿名、具名或作用域插槽。在本文中,我们将详细讲解这些插槽的用法,并提供一些示例帮助读者更好地理解。 1. 匿名插槽 目的 匿名插槽的目的是在父组件中,向子组件传递HTML内容。父组件的HTML内容会被子组件所默认接受,并且可以通过插槽名称进行调用。 使用方法 在父组件中,使用<slot>标签来占位子组件的位置…

    Vue 2023年5月28日
    00
  • Vue的底层原理你了解多少

    Vue的底层原理 什么是 Vue Vue.js 是一款用于构建用户界面的渐进式框架,其核心库只关注视图层,易于上手且灵活,同时也能与其它库或已有项目整合。Vue.js 功能强大且支持自定义指令和组件。Vue 官方文档使用的是 Markdown 格式编写,这也说明了 Vue 在开发中注重文档规范和易读性。 Vue 的底层原理 Vue 并不是一个黑盒子,其底层原…

    Vue 2023年5月27日
    00
  • VUE异步更新DOM – 用$nextTick解决DOM视图的问题

    VUE是一个流行的JavaScript框架,具有数据驱动和组件化的特点。然而,当我们在处理DOM视图时,有时候可能会出现异步更新的问题。这会导致我们的DOM视图没有及时更新,从而导致一些错误。在这种情况下,我们可以使用Vue提供的$nextTick方法来解决DOM视图异步更新的问题。 什么是异步更新DOM 在Vue中,组件的DOM操作是异步执行的。这意味着当…

    Vue 2023年5月29日
    00
  • Vue 中 createElement 使用实例详解

    下面我给出“Vue 中createElement 使用实例详解”的完整攻略,包括基本语法和两条示例说明。 What is createElement? createElement 是 Vue 的一个渲染函数,它通过 JavaScript 代码的方式生成虚拟 DOM。通过 createElement 我们能够在 JS 代码中定义 Vue 的组件,从而实现动态渲…

    Vue 2023年5月29日
    00
  • 如何基于Vue制作一个猜拳小游戏

    下面是基于Vue制作一个猜拳小游戏的完整攻略。 确定游戏规则 在开始制作小游戏之前,我们需要确定游戏规则。假设游戏规则如下: 双方玩家进行猜拳,猜拳的结果有石头、剪刀、布三种情况。 石头胜剪刀,剪刀胜布,布胜石头。 双方猜拳结果相同,平局。 玩家可以选择猜拳次数。 创建Vue应用 首先,我们需要创建一个Vue应用。我们可以使用Vue CLI来快速创建一个基本…

    Vue 2023年5月27日
    00
  • vue 页面回退mounted函数不执行的解决方案

    1.问题描述 当 Vue 页面回退时,如果使用了 keep-alive 组件进行缓存,再次进入该页面时,mounted 钩子函数不会执行。这是因为使用了 keep-alive 缓存组件,导致页面并未被销毁,因此再次进入页面时不会触发 mounted 钩子函数。 2.解决方案 方法一:使用 activated 钩子函数 当使用缓存组件时,在页面再次进入前会触发…

    Vue 2023年5月28日
    00
  • vue项目总结之文件夹结构配置详解

    当我们开发 Vue 项目时,良好的文件夹结构对于提高代码的可读性和可维护性至关重要。下面我将详细讲解“vue项目总结之文件夹结构配置详解”的完整攻略,帮助大家合理配置 Vue 项目的文件夹结构。 1. 将所有组件放在 components 目录下 在开发 Vue 项目时,通常会有很多的组件。为了使项目结构更为清晰,建议将所有组件放在 components 目…

    Vue 2023年5月28日
    00
  • 关于axios配置多个请求地址(打包后可通过配置文件修改)

    对于axios配置多个请求地址,并且需要通过配置文件进行修改,可以通过以下步骤来实现: 安装axios库 首先,需要安装axios库,在命令行中输入以下命令: npm install axios 创建config文件夹及相关配置文件 在项目根目录下创建config文件夹,并在其中创建不同环境的配置文件(如dev.js、prod.js)。以dev.js为例,假…

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