Qiankun和Vue3搭建微前端项目的实战步骤详解

前端 潘老师 2个月前 (02-18) 201 ℃ (0) 扫码查看

今天,我就来给大家详细讲讲如何基于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.panziye.com/front/14343.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】