主子应用样式冲突模板

This commit is contained in:
2026-06-21 16:31:40 +08:00
parent 7df8308ea8
commit 65aa7feae8
2 changed files with 32 additions and 10 deletions

View File

@@ -6,36 +6,57 @@ let app = null
/** /**
* 挂载 Vue 实例 * 挂载 Vue 实例
* 微前端环境由主应用通过 window.mount() 调用 * - 微前端环境由主应用通过 window['micro-app-xxx'].mount() 调用
* 独立运行直接调用 * - 独立运行直接调用
*/ */
function mount() { function mount() {
if (app) return // 防止重复挂载 // 防止重复挂载keepAlive 恢复时可能重复触发)
if (app) {
console.warn('[my-vue2-app] 已经挂载,跳过重复 mount')
return
}
app = new Vue({ app = new Vue({
router, router,
render: h => h(App) render: h => h(App)
}).$mount('#app') }).$mount('#app')
console.log('[my-vue2-app] 子应用已挂载')
} }
/** /**
* 卸载 Vue 实例 * 卸载 Vue 实例
* 微前端 keepAlive 切换时由主应用通过 window.unmount() 调用 * - 微前端环境:主应用 keepAlive 切换路由时调用
*/ */
function unmount() { function unmount() {
if (app) { if (app) {
app.$destroy() app.$destroy()
// 清理 DOM 残留Vue 2 的 $destroy 不会自动清 DOM
const root = document.getElementById('app')
if (root) {
root.innerHTML = ''
}
app = null app = null
} }
console.log('[my-vue2-app] 子应用已卸载')
} }
// 判断是否运行在 micro-app 沙箱中 // ============================================================
// 环境判断:微前端环境 vs 独立运行
// ============================================================
if (window.__MICRO_APP_ENVIRONMENT__) { if (window.__MICRO_APP_ENVIRONMENT__) {
// 注册生命周期钩子,供主应用 keepAlive 切换路由时调用 // ✅ 微前端环境:按照 micro-app 标准规范导出生命周期
window.mount = mount // micro-app 通过 window['micro-app-'+appName] 查找 mount/unmount
window.unmount = unmount const appName = window.__MICRO_APP_NAME__
// 首次加载时主动挂载 window[`micro-app-${appName}`] = { mount, unmount }
console.log(`[my-vue2-app] 检测到微前端环境,应用名称: ${appName}`)
// 首次加载时主动挂载(非 keepAlive 场景)
mount() mount()
} else { } else {
// 独立运行模式(如本地开发直接访问 http://localhost:5173 // 独立运行模式(直接访问 http://localhost:5173
console.log('[my-vue2-app] 独立运行模式')
mount() mount()
} }

View File

@@ -1,6 +1,7 @@
<template> <template>
<div class="about"> <div class="about">
<h1>📖 关于页面</h1> <h1>📖 关于页面</h1>
<h2>冲突吗</h2>
<p>这是一个使用 Vite 搭建的 Vue2 项目</p> <p>这是一个使用 Vite 搭建的 Vue2 项目</p>
</div> </div>
</template> </template>