怎样构建一个微前端架构下的JavaScript应用?

来源:站长站作者:越南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《怎样构建一个微前端架构下的JavaScript应用?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《怎样构建一个微前端架构下的JavaScript应用?》有用,将其分享出去将是对创作者最好的鼓励。

微前端架构的核心思想是将一个大型前端应用拆分成多个独立自治的小型应用,每个子应用可以使用不同的技术栈开发,最终由主应用统一集成运行,这种模式非常适合业务复杂、团队规模较大的前端项目。构建微前端架构下的JavaScript应用需要明确主应用和子应用的职责,选择合适的微前端框架,再逐步完成各部分的开发配置。

怎样构建一个微前端架构下的JavaScript应用?

技术选型建议

目前主流的微前端实现方案有两种,开发者可以根据项目需求选择:

  • qiankun:基于single-spa封装的成熟方案,对Vue、React、原生JavaScript等框架兼容性好,提供了完善的样式隔离、沙箱机制,接入成本低,适合大多数传统前端项目改造。
  • Webpack模块联邦:Webpack5内置的原生微前端能力,不需要额外引入第三方框架,通过模块共享实现应用间依赖复用,适合全新搭建的、基于Webpack构建的项目。

基于qiankun构建微前端应用

1. 主应用搭建

主应用负责注册子应用、控制子应用的挂载和卸载,这里以原生JavaScript主应用为例。

首先安装qiankun依赖:

npm install qiankun --save

然后在主应用入口文件中注册子应用:

import { registerMicroApps, start } from 'qiankun';

// 注册子应用列表
registerMicroApps([
  {
    name: 'vue_sub_app', // 子应用名称,需要和子应用导出的名称一致
    entry: '//localhost:8081', // 子应用运行地址
    container: '#subapp_container', // 子应用挂载的DOM容器
    activeRule: '/vue-app', // 当路由匹配该规则时挂载子应用
  },
  {
    name: 'react_sub_app',
    entry: '//localhost:8082',
    container: '#subapp_container',
    activeRule: '/react-app',
  }
]);

// 启动qiankun
start();

主应用还需要提供一个子应用挂载的容器节点:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>微前端主应用</title>
</head>
<body>
  <div id="app">
    <nav>
      <a href="/vue-app">Vue子应用</a>
      <a href="/react-app">React子应用</a>
    </nav>
    <div id="subapp_container"></div>
  </div>
  <script src="./main.js"></script>
</body>
</html>

2. 子应用改造

子应用需要暴露出bootstrap、mount、unmount三个生命周期钩子,让qiankun可以管理子应用的加载和卸载,这里以Vue子应用为例。

首先在子应用入口文件添加生命周期导出:

import Vue from 'vue';
import App from './App.vue';
import router from './router';

let instance = null;

// 子应用单独运行时也可以正常启动
function render(props = {}) {
  const { container } = props;
  instance = new Vue({
    router,
    render: h => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');
}

// 暴露qiankun需要的生命周期
export async function bootstrap() {
  console.log('vue子应用启动');
}

export async function mount(props) {
  console.log('vue子应用挂载', props);
  render(props);
}

export async function unmount() {
  console.log('vue子应用卸载');
  instance.$destroy();
  instance = null;
}

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

还需要修改子应用的webpack配置,设置跨域和运行端口:

const path = require('path');

module.exports = {
  devServer: {
    port: 8081, // 子应用运行端口,和主应用注册的entry对应
    headers: {
      'Access-Control-Allow-Origin': '*', // 允许主应用跨域加载子应用资源
    },
  },
  configureWebpack: {
    output: {
      library: 'vue_sub_app', // 和主应用注册的子应用名称一致
      libraryTarget: 'umd', // 输出umd格式,让qiankun可以正确加载
    },
  },
};

微前端应用通信

主应用和子应用、子应用之间可以通过qiankun提供的initGlobalState实现状态共享:

// 主应用中初始化全局状态
import { initGlobalState } from 'qiankun';

const actions = initGlobalState({
  userToken: '',
  userInfo: null,
});

// 监听全局状态变化
actions.onGlobalStateChange((state, prevState) => {
  console.log('主应用检测到状态变化', state, prevState);
});

// 修改全局状态
actions.setGlobalState({
  userToken: 'test_token_123',
});

// 子应用中获取和修改全局状态
export async function mount(props) {
  // props中包含主应用传递的actions
  props.onGlobalStateChange((state) => {
    console.log('子应用接收到全局状态', state);
  });
  props.setGlobalState({
    userInfo: { name: '测试用户' },
  });
}

常见问题解决

  • 样式隔离:qiankun默认开启严格的样式隔离,通过动态样式表实现子应用样式不互相影响,也可以在start方法中配置sandbox: { strictStyleIsolation: true }开启更严格的沙箱模式。
  • 依赖复用:如果多个子应用都使用了相同的依赖,可以在主应用中配置excludeAssetFilter避免重复加载,减少资源体积。
  • 路由兼容:子应用的路由需要基于主应用的activeRule做前缀处理,避免路由冲突,比如子应用的所有路由都添加/vue-app前缀。

基于Webpack模块联邦的构建方式

如果使用Webpack5构建项目,也可以通过模块联邦实现微前端,不需要引入qiankun。主应用配置如下:

// 主应用webpack配置
const ModuleFederationPlugin = require('webpack').container.ModuleFederationPlugin;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'main_app',
      remotes: {
        vue_sub_app: 'vue_sub_app@http://localhost:8081/remoteEntry.js',
      },
    }),
  ],
};

子应用配置:

// 子应用webpack配置
const ModuleFederationPlugin = require('webpack').container.ModuleFederationPlugin;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'vue_sub_app',
      filename: 'remoteEntry.js',
      exposes: {
        './App': './src/App.vue', // 暴露子应用模块
      },
      shared: ['vue', 'vue-router'], // 共享依赖
    }),
  ],
};

主应用中就可以直接加载子应用暴露的模块:

import('vue_sub_app/App').then(module => {
  const SubApp = module.default;
  // 渲染子应用组件
});

微前端JavaScript应用qiankun模块联邦前端架构修改时间:2026-06-21 01:57:43

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。