webcomponent
微前端:将产品的各个功能模块作为一个个独立的应用系统,然后将这些模块整合起来组装成完整的产品。
具体使用 https://qiankun.umijs.org/zh/guide/tutorial
注意:微应用需要配置打包格式和跨域;
通过劫持路由来做子应用的切换,接入方式需要融合自身的路由;
实现了 import-html-entry
插件,允许以 html
文件为应用入口,通过html
解析器从文件中提取js
和css
依赖,并且通过 fetch
下载依赖。
const registerApps = [{
name: 'app1',
entry: 'http://localhost:8080',
container: '#app',
activeRule: '/app1',
}];
乾坤通过import-html-entry
请求 http://localhost:8080
,得到对应的html
文件,解析内部的所有 script
和 style
标签,依次下载和执行它们;
shadowDom 的特点是,内部所有节点的样式对树外面的节点无效;
这种方案有缺陷,某些UI框架可能会生成一些弹出框直接改在到 document.body下,此时脱离了 shadow tree;所以样式仍然会对全局造成污染。
let fetchAppContent = `
我是子应用
`;
// 创建空div,将微应用填充到 div 中
const containerElement = document.createElement('div');
containerElement.innerHTML = fetchAppContent;
// 找到子应用的根节点
const appElement = containerElement.querySelector('#qiankun');
let html = appElement.innerHTML;
appElement.innerHTML = '';
// 开启沙箱
let shadow = appElement.attachShadow({ mode: 'closed' });
shadow.innerHTML = html;
document.body.appendChild(appElement);
全局变量/事件不冲突;
参考 乾坤JS沙箱设计