用一篇文章让你了解学会微前端

用一篇文章让你了解学会微前端

    • 前言:
    • 一、微前端的基本概念和原理
    • 二、微前端的实现方式
    • 三、微前端的优势
    • 四、微前端的实践方法
    • 五、微前端的使用
    • 六、使用微前端技术的注意事项
    • 七、使用 [single-spa 框架](https://zh-hans.single-spa.js.org/docs/getting-started-overview) 的微前端示例:
      • 1. 定义应用程序的边界:
      • 2. 选择微前端框架:选择 single-spa 框架。
      • 3. 集成应用程序:
        • - React 应用程序代码:
        • - Vue 应用程序代码:
      • 4. 定义应用程序间的通信:
    • 八、使用 [qiankun 框架](https://qiankun.umijs.org/zh/guide) 框架的微前端示例:
      • 1. 定义应用程序的边界:
      • 2. 选择微前端框架:选择 qiankun 框架。
      • 3. 集成应用程序:
        • - React 应用程序代码:
        • - Vue 应用程序代码:
      • 4. 定义应用程序间的通信:
        • - 在 `React` 应用程序中
        • - 在 Vue 应用程序中
    • 九、电商网站示例
      • 1. 定义应用程序的边界:
      • 2. 选择微前端框架:
      • 3. 集成应用程序(`qiankun`):
        • - 商品列表应用程序代码:
        • - 购物车应用程序代码:
        • - 订单应用程序代码:
      • 4. 定义应用程序间的通信:
        • - 在购物车应用程序中
    • 十、在线教育平台示例
      • 1. 定义应用程序的边界:
      • 2. 选择微前端框架:
      • 3. 集成应用程序(`single-spa`):
        • - 课程列表应用程序代码:
        • - 学习中心应用程序代码:
        • - 个人中心应用程序代码:
      • 4. 定义应用程序间的通信:
        • - 在课程列表应用程序中
        • - 在学习中心应用程序中
    • 总结

前言:

在当今互联网时代,前端应用的复杂度越来越高,开发和维护成本也越来越大。为了解决这个问题,微前端技术应运而生。微前端是一种将前端应用拆分成多个独立的子应用,每个子应用可以独立开发、测试、部署和升级的技术。通过微前端,可以让前端应用更加灵活、可维护、可扩展,提高前端开发效率和团队协作效率。

一、微前端的基本概念和原理

微前端的核心思想是将前端应用拆分成多个独立的子应用,每个子应用可以独立开发、测试、部署和升级。每个子应用都可以使用不同的框架、库和技术栈,可以根据需要进行灵活组合,形成一个完整的前端应用。微前端技术可以使用多种方式实现,包括 iframeWeb ComponentsES Modules 等。

二、微前端的实现方式

实现微前端的方式有多种,以下是其中几种常用的方式:

  1. 基于 iframe:基于 iframe 的微前端可以将每个子应用都嵌入到主应用的 iframe 中,实现独立运行。这种方式的优点是实现简单,可以避免应用之间的冲突,但是存在跨域问题和性能问题

  2. 基于 Web Components:基于 Web Components 的微前端可以将每个子应用都封装成一个自定义元素,然后在主应用中动态加载和渲染。这种方式的优点是实现灵活,可以实现组件级别的复用,但是存在兼容性问题和性能问题

  3. 基于路由:基于路由的微前端可以将每个子应用都作为一个独立的路由,然后在主应用中通过路由切换实现子应用的加载和卸载。这种方式的优点是实现简单,可以实现页面级别的复用,但是存在路由冲突和性能问题

  4. 基于模块加载器(ES Modules):基于模块加载器的微前端可以将每个子应用都作为一个独立的模块,然后在主应用中通过模块加载器动态加载和渲染。这种方式的优点是实现灵活,可以实现模块级别的复用,但是存在兼容性问题和性能问题

  5. 基于微前端框架实现微前端 :基于微前端框架实现微前端是一种比较成熟的方式,它可以提供多种功能,包括路由、状态管理、事件总线等。常用的微前端框架包括 single-spaqiankun 等。这种方式的优点是可以提供更好的通信和协作机制,但是需要注意框架的学习和使用成本

需要根据实际情况选择合适的方式实现微前端,不同的方式有不同的优缺点,需要根据具体的需求和场景进行选择。

三、微前端的优势

  1. 拆分应用,降低复杂度:微前端可以将一个大型的前端应用拆分成多个小型的子应用,每个子应用都可以独立开发、测试、部署和运行。这样可以降低应用的复杂度,提高开发效率和代码质量。

  2. 技术栈无关,灵活组合:微前端可以将不同技术栈的应用组合在一起,实现灵活的组合。这样可以让团队选择最适合自己的技术栈,提高开发效率和代码质量。

  3. 高度可维护,易于升级:微前端可以让每个子应用都独立运行,这样可以降低应用之间的耦合度,提高应用的可维护性和可升级性。

  4. 独立部署,快速迭代:微前端可以让每个子应用都独立部署,这样可以加快应用的迭代速度,提高用户体验和竞争力。

四、微前端的实践方法

微前端的实践方法有多种,包括基于自研框架、基于第三方框架、基于开源框架等。下面分别介绍这些实践方法。

  1. 基于自研框架:基于自研框架的微前端可以根据团队的需求和技术栈,自行开发微前端框架。这种方式的优点是实现灵活,可以满足团队的定制需求,但是存在开发成本高和维护成本高的问题。

  2. 基于第三方框架:基于第三方框架的微前端可以使用已有的微前端框架,例如 qiankunsingle-spaicestark 等。这种方式的优点是实现简单,可以快速实现微前端,但是存在对框架的依赖和学习成本的问题。

  3. 基于开源框架:基于开源框架的微前端可以使用已有的开源框架,例如 reactvueangular 等。这种方式的优点是实现灵活,可以充分利用已有的生态资源,但是存在对框架的依赖和学习成本的问题。

五、微前端的使用

微前端的使用可以分为以下几个步骤:

  1. 定义应用程序的边界:确定哪些部分可以独立开发、测试、部署和运行,以及如何划分子应用程序。

  2. 选择微前端框架:选择适合应用程序的微前端框架,例如 single-spaqiankun乾坤 等。

  3. 集成应用程序:将子应用程序集成到微前端框架中,这通常需要进行一些配置和代码修改,以确保应用程序可以正确运行和协同工作。

  4. 定义应用程序间的通信:应用程序之间需要进行通信,例如共享数据或调用其他应用程序的功能。可以使用事件总线、状态管理器或 Web 组件标准等技术来实现。

  5. 运行应用程序:启动微前端框架,并在其中运行子应用程序。可以使用 npmDocker 或其他工具来部署和管理应用程序。

  6. 测试和维护应用程序:对应用程序进行测试和维护,以确保其稳定性、可靠性和可扩展性。可以使用自动化测试、日志分析、性能监测等工具来辅助测试和维护工作。

六、使用微前端技术的注意事项

使用微前端技术需要注意一些问题,包括子应用之间的通信和协作子应用的版本管理子应用的性能和安全等。需要对微前端技术有深入的了解和掌握,才能够使用微前端技术开发出高质量的前端应用。

具体来说,使用微前端技术需要注意以下问题:

  1. 子应用之间的通信和协作:子应用之间的通信和协作需要使用微前端框架提供的功能。需要仔细设计和实现子应用之间的接口,以便实现数据传递和交互。
  2. 子应用的版本管理:需要仔细管理子应用的版本,以便实现动态加载和升级。需要使用版本控制工具管理子应用的代码和配置文件。
  3. 子应用的性能和安全:需要仔细考虑子应用的性能和安全问题。需要对子应用进行性能测试和安全测试,以确保子应用的性能和安全。

七、使用 single-spa 框架 的微前端示例:

1. 定义应用程序的边界:

假设有两个应用程序,一个是 React 应用程序,另一个是 Vue 应用程序。它们可以独立开发、测试、部署和运行。

2. 选择微前端框架:选择 single-spa 框架。

3. 集成应用程序:

React 应用程序中安装 single-spasingle-spa-react 插件,并进行一些配置和代码修改。在 Vue 应用程序中也进行相应的操作。

- React 应用程序代码:

import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import App from './App';

const reactLifecycles = singleSpaReact({
  React,
  ReactDOM,
  rootComponent: App,
  domElementGetter,
});

export const bootstrap = [
  reactLifecycles.bootstrap,
];

export const mount = [
  reactLifecycles.mount,
];

export const unmount = [
  reactLifecycles.unmount,
];

function domElementGetter() {
  let el = document.getElementById('react-app');
  if (!el) {
    el = document.createElement('div');
    el.id = 'react-app';
    document.body.appendChild(el);
  }
  return el;
}

- Vue 应用程序代码:

import Vue from 'vue';
import singleSpaVue from 'single-spa-vue';
import App from './App.vue';

const vueLifecycles = singleSpaVue({
  Vue,
  appOptions: {
    render: h => h(App),
  },
});

export const bootstrap = [
  vueLifecycles.bootstrap,
];

export const mount = [
  vueLifecycles.mount,
];

export const unmount = [
  vueLifecycles.unmount,
];

4. 定义应用程序间的通信:

假设 React 应用程序需要调用 Vue 应用程序的功能。可以使用 事件总线 来实现:

// 在 React 应用程序中
import { publishEvent } from 'single-spa';
publishEvent('vue-app', 'doSomething', { data: 'hello' });

// 在 Vue 应用程序中
import { addEventListener } from 'single-spa';
addEventListener('vue-app', 'doSomething', ({ detail }) => {
  console.log(detail); // { data: 'hello' }
});

以上示例仅供参考,实际使用时需要根据应用程序的具体情况进行修改。

八、使用 qiankun 框架 框架的微前端示例:

1. 定义应用程序的边界:

假设有两个应用程序,一个是 React 应用程序,另一个是 Vue 应用程序。它们可以独立开发、测试、部署和运行。

2. 选择微前端框架:选择 qiankun 框架。

3. 集成应用程序:

在 React 应用程序中安装 qiankun 和 qiankun-react 插件,并进行一些配置和代码修改。在 Vue 应用程序中也进行相应的操作。

- React 应用程序代码:

import React from 'react';
import ReactDOM from 'react-dom';
import { registerMicroApps, start } from 'qiankun';
import App from './App';

const apps = [
  {
    name: 'vue-app',
    entry: '//localhost:8081',
    container: '#vue-app',
    activeRule: '/vue',
  },
];

registerMicroApps(apps);

start();

ReactDOM.render(<App />, document.getElementById('react-app'));

- Vue 应用程序代码:

import Vue from 'vue';
import App from './App.vue';
import { registerMicroApps, start } from 'qiankun';

const apps = [
  {
    name: 'react-app',
    entry: '//localhost:8080',
    container: '#react-app',
    activeRule: '/react',
  },
];

registerMicroApps(apps);

start();

new Vue({
  render: h => h(App),
}).$mount('#vue-app');

4. 定义应用程序间的通信:

假设 React 应用程序需要调用 Vue 应用程序的功能。可以使用 props 或自定义事件来实现:

- 在 React 应用程序中

import { initGlobalState } from 'qiankun';

const actions = initGlobalState({
  data: 'hello',
});

actions.onGlobalStateChange((state, prev) => {
  console.log(state); // { data: 'world' }
});

actions.setGlobalState({
  data: 'world',
});

- 在 Vue 应用程序中

import { onGlobalStateChange, setGlobalState } from 'qiankun';

onGlobalStateChange((state, prev) => {
  console.log(state); // { data: 'world' }
});

setGlobalState({
  data: 'world',
});

以上示例仅供参考,实际使用时需要根据应用程序的具体情况进行修改。

九、电商网站示例

假设有一个电商网站,包含多个子应用程序,例如商品列表、购物车、订单等。每个子应用程序都可以独立开发、测试、部署和运行。为了提高应用程序的可维护性、可扩展性和可重用性,可以使用微前端来实现。

1. 定义应用程序的边界:

首先,需要定义应用程序的边界,即哪些部分可以独立开发、测试、部署和运行。假设 商品列表购物车订单 是三个独立的子应用程序。

2. 选择微前端框架:

选择适合应用程序的微前端框架,例如 single-spaqiankun乾坤等。假设选择 qiankun 框架。

3. 集成应用程序(qiankun):

将应用程序集成到 qiankun 框架中,这通常需要进行一些配置和代码修改。

- 商品列表应用程序代码:

import Vue from 'vue';
import App from './App.vue';
import { registerMicroApps, start } from 'qiankun';

new Vue({
  render: h =h(App),
}).$mount('#app');

registerMicroApps([
  {
    name: 'cart',
    entry: '//localhost:8081',
    container: '#container',
    activeRule: '/cart',
  },
  {
    name: 'order',
    entry: '//localhost:8082',
    container: '#container',
    activeRule: '/order',
  },
]);

start();

- 购物车应用程序代码:

import Vue from 'vue';
import App from './App.vue';

new Vue({
  render: h =h(App),
}).$mount('#app');

- 订单应用程序代码:

import Vue from 'vue';
import App from './App.vue';

new Vue({
  render: h =h(App),
}).$mount('#app');

4. 定义应用程序间的通信:

应用程序之间需要进行通信,例如共享数据或调用其他应用程序的功能。可以使用 事件总线状态管理器Web 组件标准 等技术来实现。

假设购物车应用程序需要调用商品列表应用程序的功能,可以使用自定义事件来实现:

  • 在商品列表应用程序中
import { onGlobalStateChange, setGlobalState } from 'qiankun';

onGlobalStateChange((state, prev) ={
  console.log(state); // { cartCount: 2 }
});

setGlobalState({
  cartCount: 2,
});

- 在购物车应用程序中

import { initGlobalState } from 'qiankun';

const actions = initGlobalState({
  cartCount: 0,
});

actions.onGlobalStateChange((state, prev) ={
  console.log(state); // { cartCount: 2 }
});

actions.setGlobalState({
  cartCount: 2,
});

以上示例仅供参考,实际使用时需要根据应用程序的具体情况进行修改。

十、在线教育平台示例

在线教育平台,包含多个子应用程序,例如 课程列表学习中心个人中心 等。每个子应用程序都可以独立开发、测试、部署和运行。为了提高应用程序的可维护性、可扩展性和可重用性,可以使用微前端来实现。

1. 定义应用程序的边界:

首先,需要定义应用程序的边界,即哪些部分可以独立开发、测试、部署和运行。假设课程列表、学习中心和个人中心是三个独立的子应用程序。

2. 选择微前端框架:

选择适合应用程序的微前端框架,例如 single-spa、qiankun 或乾坤等。假设选择 single-spa 框架。

3. 集成应用程序(single-spa):

将应用程序集成到 single-spa 框架中,这通常需要进行一些配置和代码修改。

- 课程列表应用程序代码:

import React from 'react';
import ReactDOM from 'react-dom';
import singleSpaReact from 'single-spa-react';
import App from './App';

const reactLifecycles = singleSpaReact({
  React,
  ReactDOM,
  rootComponent: App,
  domElementGetter: () => document.getElementById('course-list'),
});

export const bootstrap = [
  reactLifecycles.bootstrap,
];

export const mount = [
  reactLifecycles.mount,
];

export const unmount = [
  reactLifecycles.unmount,
];

- 学习中心应用程序代码:

import Vue from 'vue';
import singleSpaVue from 'single-spa-vue';
import App from './App.vue';

const vueLifecycles = singleSpaVue({
  Vue,
  appOptions: {
    render: h =h(App),
  },
});

export const bootstrap = [
  vueLifecycles.bootstrap,
];

export const mount = [
  vueLifecycles.mount,
];

export const unmount = [
  vueLifecycles.unmount,
];

- 个人中心应用程序代码:

import angular from 'angular';
import singleSpaAngularJS from 'single-spa-angularjs';
import appModule from './app.module';

const angularLifecycles = singleSpaAngularJS({
  angular,
  appModule,
  domElementGetter: () => document.getElementById('personal-center'),
});

export const bootstrap = [
  angularLifecycles.bootstrap,
];

export const mount = [
  angularLifecycles.mount,
];

export const unmount = [
  angularLifecycles.unmount,
];

4. 定义应用程序间的通信:

应用程序之间需要进行通信,例如共享数据或调用其他应用程序的功能。可以使用事件总线、状态管理器或 Web 组件标准等技术来实现。

假设学习中心应用程序需要调用课程列表应用程序的功能,可以使用 自定义事件 来实现:

- 在课程列表应用程序中

import { addGlobalEvent } from 'single-spa';

addGlobalEvent('course:select', (courseId) ={
  console.log(courseId); // 123
});

- 在学习中心应用程序中

import { getGlobalEventEmitter } from 'single-spa';

const emitter = getGlobalEventEmitter();

emitter.emit('course:select', 123);

以上示例仅供参考,实际使用时需要根据应用程序的具体情况进行修改。

总结

微前端技术是一种将前端应用拆分成多个独立的子应用,每个子应用可以独立开发、测试、部署和升级的技术。通过微前端,可以让前端应用更加灵活、可维护、可扩展,提高前端开发效率和团队协作效率。使用微前端技术需要深入了解和掌握,才能够开发出高质量的前端应用。需要注意子应用之间的通信和协作、子应用的版本管理、子应用的性能和安全等问题,以确保微前端技术的正确使用和应用效果。

你可能感兴趣的:(前端,状态模式)