软件教程 2025年08月6日
0 收藏 0 点赞 773 浏览 4908 个字
摘要 :

文章目录 一、微前端架构:基础概念全解析 (一)主应用 (二)子应用 (三)通信机制 二、搭建前的准备工作:环境配置很重要 (一)创建主应用 (二)创建子应用 ……




  • 一、微前端架构:基础概念全解析
    • (一)主应用
    • (二)子应用
    • (三)通信机制
  • 二、搭建前的准备工作:环境配置很重要
    • (一)创建主应用
    • (二)创建子应用
  • 三、主应用的详细配置:让主应用“运转”起来
    • (一)注册子应用
    • (二)启动Qiankun
    • (三)路由配置
  • 四、子应用改造:让子应用适应微前端架构
    • (一)导出生命周期钩子
    • (二)配置打包工具(Vite)
    • (三)添加publicPath适配
  • 五、主应用与子应用通信:实现数据交互
    • (一)主应用传递数据
    • (二)子应用接收数据
  • 六、项目优化与常见问题解决:让项目更完善
    • (一)样式隔离
    • (二)公共依赖处理
    • (三)子应用独立路由
  • 七、项目结构参考:清晰的项目布局
  • 八、总结:搭建微前端项目的要点回顾

今天,我就来给大家详细讲讲如何基于qiankun@2.10Vue3,一步一步搭建一个微前端项目。这篇文章适合前端开发的新手,也能帮有经验的开发者梳理思路,话不多说,我们直接开始!

一、微前端架构:基础概念全解析

在深入搭建项目之前,咱们得先搞清楚微前端里的几个关键概念。

(一)主应用

主应用就好比是一个项目的“大管家”,负责全局路由的规划、管理整个项目的状态,还要调度各个子应用,控制它们什么时候“登场”,在项目中起着统筹协调的关键作用。

(二)子应用

子应用则是一个个独立开发、独立部署的业务模块。它们就像是一个个“小能手”,各自负责特定的业务功能,而且不同的子应用还能支持不同的技术栈,这就大大提高了项目开发的灵活性。

(三)通信机制

主应用和子应用之间需要进行数据交互,就像人与人之间要交流一样。它们之间主要通过props或者全局状态来共享数据,这样就能协同工作,实现整个项目的功能。

二、搭建前的准备工作:环境配置很重要

(一)创建主应用

我们使用Vite工具来快速搭建主应用的基础框架,它能让我们的开发更高效。在命令行里输入下面这串代码:

# 使用Vite快速创建Vue3项目
npm create vue@latest main-app
cd main-app
npm install qiankun -S

这段代码的意思是,先用npm create vue@latest命令创建一个名为main-app的Vue3项目,然后进入这个项目目录,再安装qiankun这个库,-S表示把它安装为项目的依赖。

(二)创建子应用

接下来创建子应用,同样使用Vite:

# 创建Vue3子应用
npm create vue@latest micro-vue-app

这样就创建了一个名为micro-vue-app的Vue3子应用。

三、主应用的详细配置:让主应用“运转”起来

(一)注册子应用

src/micro/apps.ts文件中,我们要定义子应用的相关信息,告诉主应用有哪些子应用,以及它们在哪里。代码如下:

// apps.ts
export default [
  {
    name: \'micro-vue-app\',
    entry: \'//localhost:7101\', // 子应用开发环境地址
    container: \'#subapp-container\',
    activeRule: \'/micro-vue\',
  },
];

这里定义了一个名为micro-vue-app的子应用,它在开发环境下的地址是//localhost:7101,主应用会把它挂载到#subapp-container这个容器里,当路由匹配到/micro-vue时,就会激活这个子应用。

(二)启动Qiankun

接下来修改main.ts文件,让Qiankun开始工作:

import { createApp } from \'vue\';
import { registerMicroApps, start } from \'qiankun\';
import App from \'./App.vue\';
import apps from \'./micro/apps\';

const app = createApp(App);

// 注册子应用
registerMicroApps(apps);

// 启动qiankun
start({
  prefetch: \'all\', // 预加载子应用
  sandbox: { experimentalStyleIsolation: true }, // 样式隔离
});

app.mount(\'#main-app\');

这段代码首先引入了必要的模块,然后创建Vue应用实例。接着通过registerMicroApps注册子应用,再用start方法启动Qiankun,这里设置了预加载所有子应用,并且开启了样式隔离,最后把Vue应用挂载到#main-app这个DOM元素上。

(三)路由配置

为了确保主应用的路由不会干扰子应用,我们还要修改router/index.ts文件:

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    { path: \'/\', component: HomeView },
    { path: \'/micro-vue/*\', component: () => import(\'@/views/MicroContainer.vue\') },
  ],
});

这里配置了两个路由,/路径对应HomeView组件,而/micro-vue/*路径则对应MicroContainer.vue组件,这个路径是用来匹配子应用的路由的。

四、子应用改造:让子应用适应微前端架构

(一)导出生命周期钩子

在子应用的入口文件src/main.ts中,我们要导出一些生命周期钩子,让主应用能够控制子应用的启动、挂载和卸载。代码如下:

import { createApp } from \'vue\';
import App from \'./App.vue\';

let instance: any = null;

function render(props: any) {
  const { container } = props;
  instance = createApp(App);
  instance.mount(container?.querySelector(\'#app\') || \'#app\');
}

// 独立运行时直接渲染
if (!window.__POWERED_BY_QIANKUN__) {
  render({});
}

// 导出Qiankun生命周期
export async function bootstrap() {
  console.log(\'Vue子应用启动\');
}

export async function mount(props: any) {
  render(props);
}

export async function unmount() {
  instance.unmount();
  instance = null;
}

这里定义了一个render函数来渲染Vue应用,并且根据window.__POWERED_BY_QIANKUN__这个变量判断是否在微前端环境中。如果不是,就直接渲染。然后导出了bootstrapmountunmount这三个生命周期函数,分别用于子应用的启动、挂载和卸载。

(二)配置打包工具(Vite)

修改vite.config.ts文件,让子应用能够正确地打包和部署:

export default defineConfig({
  base: \'/micro-vue\', // 与主应用activeRule匹配
  server: {
    port: 7101,
    cors: true,
  },
  build: {
    rollupOptions: {
      output: {
        format: \'system\', // 使用SystemJS格式
      },
    },
  },
});

这里设置了base/micro-vue,要和主应用中配置的activeRule相匹配。还指定了开发服务器的端口为7101,允许跨域请求,并且设置打包输出格式为system,使用SystemJS来加载模块。

(三)添加publicPath适配

在子应用的根目录下创建public-path.js文件,用于适配不同的部署环境:

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

这段代码的作用是,当在微前端环境中时,动态地修改__webpack_public_path__,确保子应用的资源能够正确加载。

五、主应用与子应用通信:实现数据交互

(一)主应用传递数据

主应用可以在注册子应用的时候,通过props给子应用传递数据,就像这样:

// 注册子应用时添加props
registerMicroApps(apps, {
  beforeLoad: (app) => {
    return {
     ...app,
      props: { globalToken: \'主应用传递的Token\' },
    };
  },
});

这里在注册子应用时,给每个子应用添加了一个props对象,里面包含了一个globalToken属性,值为“主应用传递的Token”。

(二)子应用接收数据

子应用在mount生命周期中可以获取主应用传递过来的数据:

export async function mount(props: any) {
  console.log(\'接收主应用数据:\', props.globalToken);
  render(props);
}

在子应用的mount函数里,通过props.globalToken就可以获取到主应用传递的数据,并打印出来。

六、项目优化与常见问题解决:让项目更完善

(一)样式隔离

在微前端项目中,样式隔离很重要,不然子应用的样式可能会互相影响。有两种常见的解决方案:

  • 方案一:在启动Qiankun时,开启sandbox: { experimentalStyleIsolation: true },它会给子应用的样式添加前缀,避免样式冲突。
  • 方案二:使用CSS Modules或Shadow DOM,这两种方式也能有效地实现样式隔离,让各个子应用的样式互不干扰。

(二)公共依赖处理

为了避免多个子应用重复引入相同的依赖,浪费资源,可以通过webpackexternals或者Vitebuild.rollupOptions.external来共享公共库,比如Vue3。这样,在打包时就不会把这些公共库重复打包到每个子应用中,提高了项目的性能。

(三)子应用独立路由

子应用需要有自己独立的路由,并且要根据是否在微前端环境中进行配置。可以使用createWebHistory并设置base

const router = createRouter({
  history: createWebHistory(window.__POWERED_BY_QIANKUN__? \'/micro-vue\' : \'/\'),
});

这里根据window.__POWERED_BY_QIANKUN__的值来判断是否在微前端环境中,如果是,就把base设置为/micro-vue,否则设置为/

七、项目结构参考:清晰的项目布局

了解项目的整体结构,有助于我们更好地理解和维护项目:

├── main-app/            # 主应用
│   ├── src/
│   │   ├── micro/       # 微前端配置
│   │   └── views/MicroContainer.vue
├── micro-vue-app/       # Vue3子应用
│   ├── src/
│   │   └── main.ts      # 导出生命周期

主应用的src/micro目录存放微前端相关的配置,views/MicroContainer.vue用于承载子应用。子应用的src/main.ts文件负责导出生命周期钩子。

八、总结:搭建微前端项目的要点回顾

通过Qiankun实现微前端架构,确实能让大型项目的可维护性和扩展性大大提升。在搭建过程中,我们要重点关注以下几点:

  • 主应用和子应用的生命周期管理,确保它们能正确地启动、挂载和卸载。
  • 路由和样式的隔离方案,避免不同应用之间的冲突。
  • 高效的通信机制,让主应用和子应用能够顺畅地传递数据。

要是在实践过程中遇到了问题,欢迎在评论区留言,希望这篇文章能让你快速上手Qiankun微前端开发!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6778.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

313
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

156
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

728
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

380
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

402
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

889
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号