目录
在上面的基础中了解到,目前常用的微前端实现方案有多种,其中目前常见使用的是qiankun,以前常用的框架是iframe的微前端方案,下面我们先来学习一下之前的框架iframe实现微前端方案
a、例子:假设有A应用,想加载B应用
b、解决iframe的三个缺点:
c、将上面的机制封装进wujie框架:
子应用完全独立的运行在iframe内,路由依赖iframe的location和history,可以在一张页面上同时激活多个子应用。因为iframe和主应用处于同一个top-level browsing context(顶级浏览上下文),所以浏览器前进、后退都可以作用到子应用
d、通过上面的方法实现无界方案
a、无界框架的基本使用步骤
使用例子,主应用为vue框架,使用的步骤为:
npm i @tencent/wujie-vue -S
import WujieVue from “@tencent/wujie-vue”; Vue.use(WujieVue);
<WujieVue width="100%" height="100%" name="xxx" url="xxx" :sync="true" :fetch="fetch" :props="props" @xxx="handleXXX" >WujieVue>
b、主子应用中无界的使用区别
- if (window.__POWERED_BY_WUJIE__) {
- let instance;
- window.__WUJIE_MOUNT = () => {
- instance = new Vue({ router, render: (h) => h(App) }).$mount("#app");
- };
- window.__WUJIE_UNMOUNT = () => {
- instance.$destroy();
- };
- } else {
- new Vue({ router, render: (h) => h(App) }).$mount("#app");
- }
实现细节部分看链接:基于 iframe 的全新微前端方案 - 腾讯云开发者社区-腾讯云
无界框架的优点:
无界框架的缺点:
下面我们来学习qiankun的微前端框架,学习链接
a、基础知识
b、快速开发使用步骤
主应用中:
主应用不限技术栈,只需要提供一个容器DOM,然后注册微应用再start即可
npm i qiankun -S 或 yarn add qiankun
主应用中注册微应用
方法1:微前端与路由关联
- import { registerMicroApps, start } from 'qiankun';
-
- registerMicroApps([
- {
- name: 'react app', // app name registered
- entry: '//localhost:7100',
- container: '#yourContainer',
- activeRule: '/yourActiveRule',
- },
- {
- name: 'vue app',
- entry: { scripts: ['//localhost:7100/main.js'] },
- container: '#yourContainer2',
- activeRule: '/yourActiveRule2',
- },
- ]);
-
- start();
微应用信息注册完之后,浏览器的url发生变化,便会自动触发qiankun的匹配逻辑,所有activeRule规则匹配的微应用就会被插到指定的container中,同时依次调用微前端暴露出的生命周期钩子
方法2:微前端与路由无关联
微前端不直接与路由关联时,可以手动加载微前端
- import { loadMicroApp } from 'qiankun';
-
- loadMicroApp({
- name: 'app',
- entry: '//localhost:7100',
- container: '#yourContainer',
- });
微应用中:
微应用不需要额外安装任何其他依赖即可接入qiankun主应用
a、导出相应的生命周期钩子
微应用需要在自己的入口js(即:配置的webpack的entry.js)导出bootstrap、mount、unmount三个生命周期钩子,来供主应用在适当的时机调用
- /**
- * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
- * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
- */
- export async function bootstrap() {
- console.log('react app bootstraped');
- }
-
- /**
- * 应用每次进入都会调用 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'),
- );
- }
-
- /**
- * 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
- */
- export async function update(props) {
- console.log('update props', props);
- }
b、配置微应用的打包工具
代码暴露出相应的声明周期钩子之外,为了让主应用可以正确的识别微应用暴露出来的一些信息,微前端的打包工具webpack增加如下配置
- const packageName = require('./package.json').name;
-
- module.exports = {
- output: {
- library: `${packageName}-[name]`,
- libraryTarget: 'umd',
- jsonpFunction: `webpackJsonp_${packageName}`,
- },
- };
c、项目实战
此为学习总结,有错误的地方请指正 ~