一、什么是无界微前端?
无界(Wujie) 是基于 Web Components 的微前端框架,通过 Shadow DOM + iframe 的组合实现沙箱隔离,同时利用 iframe 的原生隔离能力保证子应用的运行时安全。其核心优势包括:
- 零成本接入:子应用无需改造
- 完备的沙箱:JS/CSS 完全隔离
- 组件化体验:类似普通组件的使用方式
- 通信简洁:内置事件总线和状态共享
二、核心实现原理
1. 沙箱隔离机制
javascript
// 创建 Shadow DOM 容器
const shadowRoot = this.attachShadow({ mode: 'open' });
// 创建 iframe 作为子应用容器
const iframe = document.createElement('iframe');
iframe.style.cssText = 'width:100%;height:100%;border:none;';
shadowRoot.appendChild(iframe);
// 动态注入子应用 HTML
iframe.contentWindow.document.write(htmlContent);
2. 样式隔离方案
- Shadow DOM:天然 CSS 作用域隔离
- 样式重写:自动添加前缀选择器
css
/* 原始子应用样式 */
.title { color: red; }
/* 无界处理后 */
#wujie-app .title { color: red; }
3. JS 沙箱实现
javascript
// 代理全局对象
const proxyWindow = new Proxy(window, {
get(target, key) {
if (key in sandboxScope) return sandboxScope[key];
return window[key];
},
set(target, key, value) {
sandboxScope[key] = value;
return true;
}
});
// 替换子应用的全局对象
with(proxyWindow) {
// 执行子应用代码
}
三、完整实现示例
1. 主应用配置(Vue3)
javascript
// main.js
import { createApp } from 'vue';
import WujieVue from 'wujie-vue3';
const app = createApp(App);
app.use(WujieVue);
// App.vue
<template>
<WujieVue
name="subApp"
url="http://localhost:3000"
:sync="true"
:props="{ user: currentUser }"
@mounted="handleMount"
/>
</template>
<script setup>
const handleMount = (childApp) => {
console.log('子应用已挂载', childApp);
};
</script>
2. 子应用改造(React)
javascript
// 入口文件 index.js
if (window.__POWERED_BY_WUJIE__) {
let instance;
window.__WUJIE_MOUNT = () => {
instance = ReactDOM.render(<App />, document.getElementById('root'));
};
window.__WUJIE_UNMOUNT = () => {
ReactDOM.unmountComponentAtNode(document.getElementById('root'));
};
} else {
ReactDOM.render(<App />, document.getElementById('root'));
}
3. 路由同步方案
javascript
// 主应用监听路由变化
import { bus } from 'wujie';
router.afterEach((to) => {
bus.$emit('main-route-change', to.path);
});
// 子应用同步路由
bus.$on('main-route-change', (path) => {
if (window.__POWERED_BY_WUJIE__) {
window.$wujie.props.router.push(path);
}
});
四、通信机制详解
1. Props 数据传递
javascript
// 主应用传递数据
<WujieVue :props="{ userInfo, theme: 'dark' }" />
// 子应用获取数据
const { userInfo, theme } = window.$wujie?.props || {};
2. 事件总线通信
javascript
// 主应用发送事件
import { bus } from 'wujie';
bus.$emit('refresh-data', { time: Date.now() });
// 子应用监听事件
window.$wujie?.bus.$on('refresh-data', (payload) => {
fetchData(payload.time);
});
3. 状态共享方案
javascript
// 创建共享状态
const { setupApp } = wujie;
setupApp({
name: 'sharedStore',
data: { count: 0 },
});
// 子应用修改状态
window.$wujie.sharedStore.count++;
// 主应用监听变化
wujie.subscribeDataChange('sharedStore', (newData) => {
console.log('状态更新:', newData.count);
});
五、性能优化实践
1. 预加载子应用
javascript
// 在后台提前加载
import { preloadApp } from 'wujie';
preloadApp({ name: 'subApp', url: '//localhost:3000' });
2. 资源缓存策略
javascript
// 配置资源缓存
<WujieVue
:fetch="fetchWithCache"
/>
const fetchWithCache = (url, options) => {
if(localStorage.getItem(url)) {
return Promise.resolve(localStorage.getItem(url));
}
return fetch(url, options).then(res => {
localStorage.setItem(url, res.clone());
return res;
});
};
3. 保活模式复用
javascript
// 切换时不销毁实例
<WujieVue :alive="true" />
六、常见问题解决方案
-
样式冲突
配置
excludeAssetFilter
排除全局样式:javascript<WujieVue :excludeAssetFilter="url => url.includes('reset.css')" />
-
第三方库污染全局
使用
sandbox: true
开启严格沙箱:javascript<WujieVue :sandbox="true" />
-
子应用路由跳转
主应用统一控制路由跳转:
javascript// 子应用调用 window.$wujie.props.jumpTo('/detail/123'); // 主应用实现跳转 :props="{ jumpTo: (path) => router.push(path) }"
七、总结
无界通过创新的 Web Components + iframe 架构实现了:
- ✅ 真正的 JS/CSS 沙箱隔离
- ✅ 接近原生组件的开发体验
- ✅ 零侵入的子应用接入
- ✅ 灵活的通信机制
最佳适用场景:
- 需要接入第三方应用的平台
- 历史遗留系统现代化改造
- 大型中后台系统的模块解耦
完整示例代码:github.com/wujie-micro...
通过本文的深度解析和代码示例,开发者可快速掌握无界微前端的核心实现和实战技巧,构建安全可靠的大型前端应用架构。