news 2026/6/9 18:32:00

qiankun 微前端项目搭建指南(小白版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
qiankun 微前端项目搭建指南(小白版)

## 你要什么

两个项目:

```

host_modele(主应用) — 外壳,路由到子应用

test_module(子应用) — 表格插件(纯展示组件)

```

## 子应用要改的文件

### 1. vue.config.js — 开跨域 + UMD

```js

module.exports = {

publicPath: '/test_entry/', // 子应用唯一标识

devServer: {

port: 8082, // 固定端口

headers: {

'Access-Control-Allow-Origin': '*', // qiankun 跨域

}

},

configureWebpack: {

output: {

libraryTarget: 'umd', // qiankun 用 UMD 加载

}

}

}

```

### 2. src/main.js — 导出 qiankun 生命周期

```js

import Vue from 'vue'

import App from './App.vue'

import createRouter from './router.js'

let instance = null

function render(props = {}) {

const { container, bus } = props

const router = createRouter()

if (bus) Vue.prototype.bus = bus // 接收主应用传来的总线

instance = new Vue({

router,

render: h => h(App)

}).$mount(container ? container.querySelector('#app') : '#app')

}

// 独立运行

if (!window.__POWERED_BY_QIANKUN__) {

render()

}

// qiankun 生命周期(三个必须)

export async function bootstrap() {}

export async function mount(props) { render(props) }

export async function unmount() {

instance.$destroy()

instance = null

}

```

### 3. src/App.vue — JS 设高度(防 qiankun bug)

```vue

<template>

<div id="app">

<router-view />

</div>

</template>

<script>

export default {

mounted() {

// 向上遍历父链,跳过零高度包装层

const el = this.$el

let p = el.parentElement

while (p && p.clientHeight === 0) p = p.parentElement

if (p && p.clientHeight > 0) {

el.style.height = p.clientHeight + 'px'

}

}

}

</script>

```

参见 [[qiankun-height-100-percent-bug]]

### 4. 路由 — 指向插件组件

```js

import Vue from 'vue'

import Router from 'vue-router'

Vue.use(Router)

export default () => new Router({

mode: 'history',

routes: [

{ path: '*', component: () => import('./views/PluginEntry.vue') }

]

})

```

### 5. PluginEntry.vue — 胶水层组件(重点)

胶水层负责三件事:收 Props、管数据、接事件。

```vue

<template>

<PureComponent v-bind="componentProps" @fetch="handleFetch" />

</template>

<script>

export default {

data() {

return {

componentData: [],

total: 0,

}

},

computed: {

pageParams() { return this.$root.pageParams || {} },

componentProps() {

return {

...(this.pageParams.Props || {}),

data: this.componentData,

total: this.total,

}

}

},

created() {

if (this.bus) {

this.bus.$on('table:data', ({ list, total }) => {

this.componentData = list

this.total = total

})

this.bus.$emit('table:fetch', { page: 1, row: 20 })

}

},

beforeDestroy() {

if (this.bus) this.bus.$off('table:data')

},

methods: {

handleFetch(params) {

if (this.bus) this.bus.$emit('table:fetch', params)

}

}

}

</script>

```

**为什么需要它:** TzxTable 是纯展示组件,不管数据从哪来。PluginEntry 接管数据和事件,让展示组件保持纯粹。[[tableentry-role-in-architecture]]

## 主应用要改的文件

### 1. App.vue — 放子应用容器

```vue

<template>

<div id="app" style="height:100vh;">

<div id="subapp-container" style="width:100%;height:100%;"></div>

</div>

</template>

```

### 2. main.js — 创建 bus、注册子应用

```js

import Vue from 'vue'

import axios from 'axios'

import { registerMicroApps, start } from 'qiankun'

// 创建事件总线(关键)

const bus = new Vue()

Vue.prototype.bus = bus

// 主应用监听数据请求,调后端

bus.$on('table:fetch', async (params) => {

try {

const res = await axios.get('/stations', { params })

if (res.data.status === 1) {

bus.$emit('table:data', {

list: res.data.data.list,

total: res.data.data.total

})

}

} catch (err) {

console.error('获取数据失败', err)

}

})

registerMicroApps([

{

name: 'my-plugin',

entry: '//localhost:8082/test_entry/',

container: '#subapp-container',

activeRule: '/test_entry/my-plugin',

props: {

bus,

params: {

Props: {

columns: [ /* 列配置 */ ],

loadMode: 'page',

pageSize: 20,

}

}

}

}

])

start()

```

## 通信流程

```

主应用

│ bus = new Vue()

│ bus.$on('table:fetch') → axios → bus.$emit('table:data')

│ 注册子应用时传 bus + Props

└→ qiankun 加载

└→ PluginEntry

│ Props + bus → 传给 PureComponent

│ 翻页 → bus.$emit('table:fetch')

│ bus.$on('table:data') → 更新数据

└→ PureComponent

只管渲染

```

## 开发生命周期

| 顺序 | 文件 | 注意 |

|------|------|------|

| 1 | vue.config.js | 跨域头 + UMD |

| 2 | main.js(子) | 三个生命周期 + bus |

| 3 | App.vue(子) | mounted 设高度 |

| 4 | PluginEntry.vue | 胶水层模板 |

| 5 | App.vue(主) | 容器 div |

| 6 | main.js(主) | bus + 注册 |

**How to apply:** 新建 qiankun 子应用项目时,按上述 6 步配置即可。核心记住:**子应用只展示,主应用只调接口,bus 在中间传话。**

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:31:59

i.MX 6SLL工业级SoC:从核心架构到硬件设计的嵌入式实战指南

1. 项目概述&#xff1a;为什么选择i.MX 6SLL这颗“工业老兵”&#xff1f;在嵌入式工业应用的世界里&#xff0c;选型处理器就像给一个复杂的工程项目挑选心脏。这颗心脏不能只追求跑得快&#xff0c;更要耐力好、抗压能力强&#xff0c;还得在严苛的环境下稳定跳动。这些年&a…

作者头像 李华
网站建设 2026/6/9 18:27:26

郑州OPC哪个公司好

在郑州的OPC领域&#xff0c;海铭威科技凭借其卓越的技术实力和创新的服务模式脱颖而出&#xff0c;成为众多企业信赖的合作伙伴。海铭威科技前身为2007年在北京注册的北京中诚宏达科技有限公司&#xff0c;近20年深耕通讯工程、网络安全及矿物安全系统研发&#xff0c;构建了坚…

作者头像 李华
网站建设 2026/6/9 18:26:47

个人发展-我的第一篇博客

a. 一个自我介绍&#xff1b;我来自湖北某双非信息安全专业&#xff0c;目前大一&#xff08;bushi&#xff09;&#xff0c;顺手打的&#xff0c;还是太期待回到大一了&#xff0c;大二来着。b. 编程的目标我的目标是能够手搓出来大部分编程题&#xff0c;大三的时候参加算法竞…

作者头像 李华
网站建设 2026/6/9 18:24:52

Kinetis KL33 ADC与SPI电气规格深度解析与高可靠设计实战

1. 项目概述&#xff1a;从数据手册到设计实战拿到一份微控制器的数据手册&#xff0c;尤其是像Kinetis KL33这样集成度较高的芯片&#xff0c;面对动辄数百页的电气规格和时序参数表格&#xff0c;很多工程师的第一反应可能是直接翻到引脚定义和例程部分&#xff0c;快速搭建原…

作者头像 李华
网站建设 2026/6/9 18:24:52

5个关键问题解析:如何高效获取macOS Big Sur官方安装包?

5个关键问题解析&#xff1a;如何高效获取macOS Big Sur官方安装包&#xff1f; 【免费下载链接】DownloadFullInstaller macOS application written in SwiftUI that downloads installer pkgs for the Install macOS Big Sur application. 项目地址: https://gitcode.com/g…

作者头像 李华
网站建设 2026/6/9 18:23:55

安达发|金属加工企业如何靠生产计划排单软件打破产能困局?

安达发APS高级生产计划智能排产排程自动排单软件系统推荐_MES 走进任何一家金属加工车间&#xff0c;你都能看到相似的场景&#xff1a;计划员对着Excel表格反复拖拽工单&#xff0c;白板上的排产信息擦了又写&#xff0c;车间主管在各工序间来回协调&#xff0c;销售催单电话…

作者头像 李华