Qiankun框架对于微前端的解耦和沙盒与实战探索心得

简介: Qiankun框架对于微前端的解耦和沙盒与实战探索心得

@[toc]

qiankun框架

在这里插入图片描述

由于主应用程序和微应用程序可以独立于技术堆栈,所以qiankun只是一个面向用户的类似jQuery的库。需要调用几个API来完成应用程序的微前端转换。同时,由于qiankunHTML入口和沙盒的设计,微应用程序的访问与使用iframe一样简单。

解耦

微前端的核心目标是将巨石应用程序分解为几个松散耦合的、可以自主的微应用程序,而乾坤的许多设计都遵循这一原则,例如HTML输入、沙盒和应用程序间通信。只有这样,才能确保微应用真正具有自主开发和自主运行的能力。

微应用信息注册

微应用信息注册后,一旦浏览器URL发生变化,将自动触发qiankun的匹配逻辑。所有与activerule规则匹配的微应用程序将被插入到指定的容器中,并依次调用微应用程序公开的生命周期钩子。

$ yarn add qiankun # 或者 npm i qiankun -S

如果微应用程序与路由没有直接关联,还可以选择手动加载微应用程序:

import { loadMicroApp } from 'qiankun';

loadMicroApp({
  name: 'app',
  entry: '//localhost:7100',
  container: '#yourContainer',
});

微应用

1.微应用分为网页包构建和非网页包构建项目。使用webpack的微应用程序(主要是Vue、react和angular)需要执行以下操作:

注意:运行时的publicpath和构建时的publippath是不同的,不能等价地替换它们。

2.微应用程序建议使用历史模式路由。需要设置路由基础。该值与其activerule相同。
3.引入公共路径。js在条目文件的顶部,修改和导出三个生命周期函数。
4.修改webpack打包以允许跨域和UMD打包开发环境。

主要修改为上述四项,可能会根据项目的不同情况而变化。
例如,项目是索引HTML,所有其他文件都是单独部署的。
这意味着在构建时已将publicpath设置为完整路径。运行时不需要修改publicpath(可以保存第一步)。

添加公共路径。SRC目录中的js:

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

设置历史模式路由的基础:

<BrowserRouter basename={window.__POWERED_BY_QIANKUN__ ? '/app-react' : '/'}>

这个条目是JS的文件索引。为了避免根ID#root与其他DOM之间的冲突,需要限制搜索范围。

import './public-path';
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

function render(props) {
  const { container } = props;
  ReactDOM.render(<App />, container ? container.querySelector('#root') : document.querySelector('#root'));
}

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

export async function bootstrap() {
  console.log('[react16] react app bootstraped');
}

export async function mount(props) {
  console.log('[react16] props from main framework', props);
  render(props);
}

export async function unmount(props) {
  const { container } = props;
  ReactDOM.unmountComponentAtNode(container ? container.querySelector('#root') : document.querySelector('#root'));
}

非 webpack 构建的微应用

一些非webpack构建的项目,如jQuery项目和JSP项目,可以根据此进行处理。

<script src="//yourhost/entry.js" entry></script>

在访问之前,请确保项目中的图片、音频和视频资源能够正常加载。如果这些资源的地址是完整路径(例如https://qiankun.umijs.org/logo.png)是的,很好。
如果它们是相对路径,则需要首先将这些资源上载到服务器并使用完整路径。
在 entry js 里声明 lifecycles:

((global) => {
  global['purehtml'] = {
    bootstrap: () => {
      console.log('purehtml bootstrap');
      return Promise.resolve();
    },
    mount: () => {
      console.log('purehtml mount');
      return render($);
    },
    unmount: () => {
      console.log('purehtml unmount');
      return Promise.resolve();
    },
  };
})(window);

访问非常简单。只需要声明一个脚本来导出相应的生命周期。

const packageName = require('./package.json').name;

除了在代码中暴露相应的生命周期钩子之外,为了使主应用程序能够正确识别微应用程序暴露的一些信息,微应用程序的打包工具需要添加以下配置:

module.exports = {
  output: {
    library: `${packageName}-[name]`,
    libraryTarget: 'umd',
    jsonpFunction: `webpackJsonp_${packageName}`,
  },
};

实现思路

1.预加载资源如果在应用程序注册配置中存在需要预加载的应用程序,则应在初始化的同时加载这些应用程序。
初始化路由根据配置的路由规则匹配当前页面路径,并查找当前有效的应用程序信息。popstate监控页面路由变化,并根据路由变化获取当前有效应用
3.代理一些窗口事件。
由于每个应用程序可能会绑定一些窗口事件,因此它会劫持窗口Addeventlistener,后者记录每个应用程序绑定的事件,以便在以后切换路由时清除这些事件。
4.加载资源目标页面,分析各种资源,然后加载并执行
5.在每个应用程序执行之前记录全局变量,记录当前全局变量,然后在卸载应用程序时清除所有全局变量,以避免影响下一个应用程序的执行。

qiankun沙盒模型

我们知道所有全局方法、全局变量/常量和全局对象都属于窗口对象,这些全局方法和对象可能会造成JS污染。
它可以在加载子系统之前创建窗口对象的快照(副本),然后在卸载子系统时恢复快照。
也就是说,它可以确保每次子系统运行时,都是一个新的窗口对象环境。
实际上,一般原则是记录子系统运行过程中添加、修改和删除的窗口对象的属性和方法,然后在卸载子系统时恢复这些操作。

应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法

export async function mount(props) {
  ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));
}

应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例

export async function unmount(props) {
  ReactDOM.unmountComponentAtNode(
    props.container ? props.container.querySelector('#root') : document.getElementById('root'),
  );
}
相关文章
|
1月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
77 9
|
17天前
|
存储 前端开发 JavaScript
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
|
1月前
|
前端开发 JavaScript API
前端界的秘密武器:掌握这些框架,让你轻松秒杀99%的同行!
前端开发日新月异,掌握几个明星框架如React、Vue.js和Angular,不仅能让工作更得心应手,还能轻松超越同行。React以高效的虚拟DOM和组件化著称;Vue.js简洁易懂,灵活性高;Angular提供全面的解决方案,适合大型应用。此外,轻量级的Svelte也值得关注,其编译时处理设计提升了应用性能。掌握这些框架,结合深刻理解和灵活运用,助你在前端领域脱颖而出。
31 9
|
1月前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
27 1
|
1月前
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
31 1
|
1月前
|
缓存 前端开发 搜索推荐
前端性能优化实战:提升网页加载速度
前端性能优化实战:提升网页加载速度
|
1月前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
57 2
|
1月前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
43 2
|
2月前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
135 7
|
2月前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
下一篇
DataWorks