项目概述

本项目是一个基于 qiankun + React + Vite 技术栈的现代化微前端解决方案,专门用于构建大型企业级应用的前端架构。该方案能够将单体应用拆分为多个独立的微应用,实现团队独立开发、独立部署,同时保持统一的用户体验和代码复用。

核心特性

  • 🏗️ 微前端架构:基于qiankun框架的微前端解决方案
  • 独立开发:每个微应用可独立开发、测试、部署
  • 🔄 动态加载:运行时动态加载微应用,按需加载资源
  • 🎨 统一设计:共享UI组件库和设计系统
  • 🚀 高性能:基于Vite的快速构建和热更新
  • 📱 响应式设计:基于Tailwind CSS的现代化界面
  • 🔧 开发友好:完整的开发工具链和调试支持

快速开始

环境准备:

  1. 安装 Node.js 16+ 和 npm/yarn
  2. 克隆项目代码
  3. 运行安装脚本

安装依赖:

# 使用批处理脚本一键安装所有依赖(推荐)
install-all.bat

# 或使用PowerShell脚本
.\install-all.ps1

# 或手动安装
npm run install:all

启动开发:

# 使用批处理脚本一键启动所有服务(推荐)
start-all.bat

# 或使用PowerShell脚本
.\start-all.ps1

# 或使用npm脚本
npm run dev

访问应用:

  • 主应用:http://localhost:8080
  • 内容管理:http://localhost:8081
  • 用户管理:http://localhost:8082
  • 系统设置:http://localhost:8083

启动程序演示

在这里插入图片描述
在这里插入图片描述

启动流程说明:

  1. 双击运行:双击 start-all.bat 文件启动所有服务
  2. 服务启动:自动启动4个服务(主应用8080,微应用8081-8083)
  3. 窗口管理:每个服务在独立命令窗口中运行
  4. 启动完成:所有服务启动后显示访问地址

技术架构

整体架构图

┌─────────────────────────────────────────────────────────────┐
│                    主应用层 (Main App)                       │
├─────────────────────────────────────────────────────────────┤
│  qiankun 框架     │  React Router     │  Layout 组件      │
│  - 微应用注册     │  - 路由管理       │  - 导航菜单       │
│  - 生命周期管理   │  - 状态同步       │  - 容器管理       │
│  - 通信机制       │  - 历史记录       │  - 样式隔离       │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                   微应用层 (Micro Apps)                     │
├─────────────────────────────────────────────────────────────┤
│  内容管理应用     │  用户管理应用     │  系统设置应用     │
│  - 文章管理       │  - 用户列表       │  - 基础设置       │
│  - 内容编辑       │  - 权限管理       │  - 安全配置       │
│  - 发布流程       │  - 角色分配       │  - 系统监控       │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                   构建层 (Build Layer)                      │
├─────────────────────────────────────────────────────────────┤
│  Vite 构建工具    │  Tailwind CSS     │  开发服务器       │
│  - 快速构建       │  - 样式系统       │  - 热更新         │
│  - 代码分割       │  - 响应式设计     │  - 代理配置       │
│  - 资源优化       │  - 主题定制       │  - 跨域处理       │
└─────────────────────────────────────────────────────────────┘

技术栈详解

主应用技术栈
  • qiankun 2.10.16:微前端框架
  • React 18.2.0:用户界面库
  • React Router 6.8.1:路由管理
  • Vite 5.0.8:构建工具
  • Tailwind CSS 3.3.6:样式框架
微应用技术栈
  • React 18.2.0:用户界面库
  • Vite 5.0.8:构建工具
  • vite-plugin-qiankun:qiankun集成插件
  • Tailwind CSS 3.3.6:样式框架
  • PostCSS 8.4.32:CSS处理器

核心模块分析

1. 主应用模块

1.1 应用配置 (micro-apps-config.js)
const isDev = import.meta.env.DEV

const devConfig = [
  {
    name: 'content-management',
    entry: 'http://localhost:8081',
    container: '#subapp-container',
    activeRule: '/content'
  },
  {
    name: 'user-management',
    entry: 'http://localhost:8082',
    container: '#subapp-container',
    activeRule: '/users'
  },
  {
    name: 'settings',
    entry: 'http://localhost:8083',
    container: '#subapp-container',
    activeRule: '/settings'
  }
]

const prodConfig = [
  {
    name: 'content-management',
    entry: '/content/',
    container: '#subapp-container',
    activeRule: '/content'
  },
  {
    name: 'user-management',
    entry: '/users/',
    container: '#subapp-container',
    activeRule: '/users'
  },
  {
    name: 'settings',
    entry: '/settings/',
    container: '#subapp-container',
    activeRule: '/settings'
  }
]

export const microApps = isDev ? devConfig : prodConfig

功能特点:

  • 支持开发和生产环境配置
  • 动态路由规则配置
  • 容器挂载点管理
  • 微应用入口地址配置
1.2 布局组件 (Layout.jsx)
import React, { useEffect, useState } from 'react'

const Layout = () => {
  const [currentPath, setCurrentPath] = useState(window.location.pathname)

  useEffect(() => {
    const handlePopState = () => {
      setCurrentPath(window.location.pathname)
    }

    window.addEventListener('popstate', handlePopState)
    
    return () => {
      window.removeEventListener('popstate', handlePopState)
    }
  }, [])

  const menuItems = [
    { key: 'home', label: 'Home', path: '/' },
    { key: 'content', label: 'Content Management', path: '/content' },
    { key: 'users', label: 'User Management', path: '/users' },
    { key: 'settings', label: 'Settings', path: '/settings' }
  ]

  const handleNavigation = (path) => {
    window.history.pushState(null, '', path)
    setCurrentPath(path)
  }

  const isActive = (itemPath) => {
    if (itemPath === '/') {
      return currentPath === '/'
    }
    return currentPath.startsWith(itemPath)
  }

  return (
    <div className="min-h-screen bg-gray-100">
      <nav className="bg-white shadow-lg">
        <div className="max-w-7xl mx-auto px-4">
          <div className="flex justify-between h-16">
            <div className="flex space-x-8">
              <div className="flex items-center">
                <span className="text-2xl font-bold text-blue-600">Qiankun App</span>
              </div>
              <div className="flex space-x-4">
                {menuItems.map((item) => (
                  <button
                    key={item.key}
                    onClick={() => handleNavigation(item.path)}
                    className={`inline-flex items-center px-4 py-2 text-sm font-medium ${
                      isActive(item.path)
                        ? 'text-blue-600 border-b-2 border-blue-600'
                        : 'text-gray-600 hover:text-blue-600'
                    }`}
                  >
                    {item.label}
                  </button>
                ))}
              </div>
            </div>
          </div>
        </div>
      </nav>

      <main className="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
        {currentPath === '/' && (
          <div className="px-4 py-6 sm:px-0">
            <div className="border-4 border-dashed border-gray-200 rounded-lg p-8 text-center">
              <h1 className="text-4xl font-bold text-gray-900 mb-4">Welcome to Qiankun Micro-Frontend</h1>
              <p className="text-xl text-gray-600">Select a menu item to load micro applications</p>
            </div>
          </div>
        )}
        <div id="subapp-container"></div>
      </main>
    </div>
  )
}

export default Layout

核心功能:

  • 导航菜单管理
  • 路由状态同步
  • 微应用容器管理
  • 响应式布局设计

2. 微应用模块

2.1 内容管理应用 (Content Management)
import React from 'react'

const App = () => {
  return (
    <div className="space-y-6">
      <div className="bg-white shadow rounded-lg">
        <div className="px-4 py-5 sm:p-6">
          <div className="flex justify-between items-center mb-6">
            <h1 className="text-2xl font-bold text-gray-900">Content Management</h1>
            <button className="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-200">
              New Article
            </button>
          </div>

          <div className="overflow-x-auto">
            <table className="min-w-full divide-y divide-gray-200">
              <thead className="bg-gray-50">
                <tr>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Title
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Status
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Author
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Created Date
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Actions
                  </th>
                </tr>
              </thead>
              <tbody className="bg-white divide-y divide-gray-200">
                <tr>
                  <td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
                    How to Build Modern Web Applications
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap">
                    <span className="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
                      Published
                    </span>
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
                    Admin
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
                    2024-01-15
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap text-sm font-medium">
                    <button className="text-blue-600 hover:text-blue-900 mr-3">Edit</button>
                    <button className="text-red-600 hover:text-red-900">Delete</button>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
      </div>
    </div>
  )
}

export default App

功能特点:

  • 文章列表管理
  • 状态标签显示
  • 操作按钮交互
  • 响应式表格设计
2.2 用户管理应用 (User Management)
import React from 'react'

const App = () => {
  return (
    <div className="space-y-6">
      <div className="bg-white shadow rounded-lg">
        <div className="px-4 py-5 sm:p-6">
          <div className="flex justify-between items-center mb-6">
            <h1 className="text-2xl font-bold text-gray-900">User Management</h1>
            <button className="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-200">
              Add User
            </button>
          </div>

          <div className="overflow-x-auto">
            <table className="min-w-full divide-y divide-gray-200">
              <thead className="bg-gray-50">
                <tr>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    User
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Role
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Status
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Last Login
                  </th>
                  <th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
                    Actions
                  </th>
                </tr>
              </thead>
              <tbody className="bg-white divide-y divide-gray-200">
                <tr>
                  <td className="px-6 py-4 whitespace-nowrap">
                    <div className="flex items-center">
                      <div className="flex-shrink-0 h-10 w-10">
                        <img className="h-10 w-10 rounded-full" src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt="" />
                      </div>
                      <div className="ml-4">
                        <div className="text-sm font-medium text-gray-900">Zhang San</div>
                        <div className="text-sm text-gray-500">zhangsan@example.com</div>
                      </div>
                    </div>
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap">
                    <span className="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-purple-100 text-purple-800">
                      Admin
                    </span>
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap">
                    <span className="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
                      Active
                    </span>
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
                    2 hours ago
                  </td>
                  <td className="px-6 py-4 whitespace-nowrap text-sm font-medium">
                    <button className="text-blue-600 hover:text-blue-900 mr-3">Edit</button>
                    <button className="text-red-600 hover:text-red-900">Disable</button>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
        </div>
      </div>
    </div>
  )
}

export default App

功能特点:

  • 用户信息展示
  • 角色权限管理
  • 状态监控
  • 头像显示
2.3 系统设置应用 (Settings)
import React from 'react'

const App = () => {
  return (
    <div className="space-y-6">
      <div className="bg-white shadow rounded-lg">
        <div className="px-4 py-5 sm:p-6">
          <h1 className="text-2xl font-bold text-gray-900 mb-6">System Settings</h1>

          <div className="space-y-8">
            <div>
              <h3 className="text-lg font-medium text-gray-900 mb-4">Basic Settings</h3>
              <div className="space-y-4">
                <div>
                  <label className="block text-sm font-medium text-gray-700 mb-2">
                    Site Name
                  </label>
                  <input
                    type="text"
                    className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"
                    defaultValue="AppCMS"
                  />
                </div>
                <div>
                  <label className="block text-sm font-medium text-gray-700 mb-2">
                    Site Description
                  </label>
                  <textarea
                    rows={3}
                    className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"
                    defaultValue="Modern content management system built with React + Vite + Tailwind CSS"
                  />
                </div>
              </div>
            </div>

            <div>
              <h3 className="text-lg font-medium text-gray-900 mb-4">User Settings</h3>
              <div className="space-y-4">
                <div className="flex items-center">
                  <input
                    type="checkbox"
                    className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded"
                    defaultChecked
                  />
                  <label className="ml-2 block text-sm text-gray-900">
                    Allow user registration
                  </label>
                </div>
                <div className="flex items-center">
                  <input
                    type="checkbox"
                    className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded"
                    defaultChecked
                  />
                  <label className="ml-2 block text-sm text-gray-900">
                    Require email verification
                  </label>
                </div>
              </div>
            </div>

            <div>
              <h3 className="text-lg font-medium text-gray-900 mb-4">Security Settings</h3>
              <div className="space-y-4">
                <div>
                  <label className="block text-sm font-medium text-gray-700 mb-2">
                    Session Timeout (minutes)
                  </label>
                  <input
                    type="number"
                    className="w-32 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"
                    defaultValue="30"
                  />
                </div>
                <div className="flex items-center">
                  <input
                    type="checkbox"
                    className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded"
                    defaultChecked
                  />
                  <label className="ml-2 block text-sm text-gray-900">
                    Enable two-factor authentication
                  </label>
                </div>
              </div>
            </div>

            <div className="pt-6 border-t border-gray-200">
              <div className="flex justify-end">
                <button className="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition-colors duration-200">
                  Save Settings
                </button>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

export default App

功能特点:

  • 基础设置管理
  • 用户权限配置
  • 安全设置选项
  • 表单验证

3. 构建配置

3.1 主应用构建配置 (vite.config.js)
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
  server: {
    port: 8080,
    open: true,
    cors: true
  },
  base: '/'
})
3.2 微应用构建配置
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import qiankun from 'vite-plugin-qiankun'

const isDev = process.env.NODE_ENV === 'development'

export default defineConfig({
  plugins: [
    react({
      include: '**/*.{jsx,tsx}',
      babel: {
        plugins: []
      }
    }),
    qiankun('content-management', {
      useDevMode: true
    })
  ],
  server: {
    port: 8081,
    cors: true,
    origin: 'http://localhost:8081',
    headers: {
      'Access-Control-Allow-Origin': '*'
    },
    hmr: false
  },
  base: isDev ? '/' : '/content',
  build: {
    target: 'esnext',
    minify: false
  }
})

数据流程

1. 微应用加载流程

用户 主应用 qiankun框架 微应用 开发服务器 点击导航菜单 触发路由变化 请求微应用资源 返回微应用代码 加载并初始化微应用 微应用就绪 渲染到容器 显示微应用界面 用户 主应用 qiankun框架 微应用 开发服务器

2. 开发环境启动流程

  1. 依赖安装:使用PowerShell脚本安装所有依赖
  2. 服务启动:并行启动所有微应用服务
  3. 端口分配:主应用8080,微应用8081-8083
  4. 代理配置:配置CORS和跨域访问
  5. 热更新:支持代码变更实时更新

核心算法

1. 微应用注册算法

// qiankun微应用注册逻辑
const registerMicroApps = (apps) => {
  apps.forEach(app => {
    registerMicroApp({
      name: app.name,
      entry: app.entry,
      container: app.container,
      activeRule: app.activeRule,
      props: {
        data: getGlobalData()
      }
    })
  })
}

// 路由匹配算法
const matchRoute = (pathname, activeRule) => {
  if (typeof activeRule === 'string') {
    return pathname.startsWith(activeRule)
  }
  if (typeof activeRule === 'function') {
    return activeRule(pathname)
  }
  if (activeRule instanceof RegExp) {
    return activeRule.test(pathname)
  }
  return false
}

2. 样式隔离算法

// CSS样式隔离实现
const createScopedCSS = (css, scope) => {
  const scopedCSS = css.replace(/([^{}]+){/g, (match, selector) => {
    const scopedSelector = selector
      .split(',')
      .map(s => `${scope} ${s.trim()}`)
      .join(', ')
    return `${scopedSelector} {`
  })
  return scopedCSS
}

// 动态样式注入
const injectStyles = (styles, container) => {
  const styleElement = document.createElement('style')
  styleElement.textContent = styles
  container.appendChild(styleElement)
  return styleElement
}

3. 生命周期管理算法

// 微应用生命周期管理
const lifecycleManager = {
  bootstrap: async (app) => {
    console.log(`${app.name} bootstrap`)
    return Promise.resolve()
  },
  
  mount: async (app) => {
    console.log(`${app.name} mount`)
    const container = document.querySelector(app.container)
    if (container) {
      container.innerHTML = app.content
    }
    return Promise.resolve()
  },
  
  unmount: async (app) => {
    console.log(`${app.name} unmount`)
    const container = document.querySelector(app.container)
    if (container) {
      container.innerHTML = ''
    }
    return Promise.resolve()
  }
}

用户界面设计

1. 设计理念

  • 模块化:每个微应用独立设计,保持一致性
  • 响应式:支持不同屏幕尺寸的自适应布局
  • 现代化:采用Tailwind CSS的现代设计风格
  • 一致性:统一的颜色、字体和间距规范
  • 可访问性:符合Web可访问性标准

2. 界面组件

2.1 主应用导航
  • 顶部导航栏设计
  • 品牌标识展示
  • 菜单项状态管理
  • 响应式布局适配

在这里插入图片描述

2.2 微应用容器
  • 动态内容加载区域
  • 加载状态指示
  • 错误状态处理
  • 过渡动画效果

在这里插入图片描述

2.3 程序页面切换演示

在这里插入图片描述

页面切换流程:

  1. 首页展示:显示欢迎页面和导航菜单
  2. 内容管理:切换到内容管理微应用,展示文章列表
  3. 用户管理:切换到用户管理微应用,展示用户列表
  4. 系统设置:切换到系统设置微应用,展示配置选项
  5. 无缝切换:微应用之间实现无缝切换,保持用户体验一致
2.4 数据表格
  • 响应式表格设计
  • 状态标签显示
  • 操作按钮交互
  • 分页和排序功能

开发工具脚本详解

1. 依赖安装脚本 (install-all.bat)

脚本功能:
该批处理脚本用于一键安装所有微前端应用的依赖包,包括主应用和所有微应用的依赖。

脚本源码分析:

@echo off
echo Installing dependencies for all applications...
echo.

echo [1/5] Installing root dependencies...
cd /d %~dp0
call npm install

echo.
echo [2/5] Installing main-app dependencies...
cd /d %~dp0main-app
call npm install

echo.
echo [3/5] Installing content-management dependencies...
cd /d %~dp0micro-apps\content-management
call npm install

echo.
echo [4/5] Installing user-management dependencies...
cd /d %~dp0micro-apps\user-management
call npm install

echo.
echo [5/5] Installing settings dependencies...
cd /d %~dp0micro-apps\settings
call npm install

echo.
echo All dependencies installed successfully!
echo You can now run start-all.bat to start all services.
echo.

cd /d %~dp0
pause

核心功能解析:

  1. 脚本头部配置

    • @echo off:关闭命令回显,使输出更清洁
    • 显示安装进度提示信息
  2. 依赖安装流程

    • 步骤1:安装根目录依赖(工作区依赖)
    • 步骤2:安装主应用依赖
    • 步骤3:安装内容管理微应用依赖
    • 步骤4:安装用户管理微应用依赖
    • 步骤5:安装系统设置微应用依赖
  3. 路径管理

    • cd /d %~dp0:切换到脚本所在目录
    • %~dp0:获取批处理文件所在目录的绝对路径
    • 确保每个应用在正确的目录下安装依赖
  4. 错误处理

    • call npm install:使用call命令确保错误时不会终止脚本
    • 每个步骤都有明确的进度提示

使用方法:

# 双击运行或在命令行中执行
install-all.bat

2. 服务启动脚本 (start-all.bat)

脚本功能:
该批处理脚本用于一键启动所有微前端服务,包括主应用和所有微应用的开发服务器。

脚本源码分析:

@echo off
echo Starting all micro-frontend services...
echo.

echo Starting content-management on port 8081...
start "content-management" cmd /k "cd /d %~dp0micro-apps\content-management && npm run dev"

timeout /t 2 /nobreak >nul

echo Starting user-management on port 8082...
start "user-management" cmd /k "cd /d %~dp0micro-apps\user-management && npm run dev"

timeout /t 2 /nobreak >nul

echo Starting settings on port 8083...
start "settings" cmd /k "cd /d %~dp0micro-apps\settings && npm run dev"

timeout /t 2 /nobreak >nul

echo Starting main-app on port 8080...
start "main-app" cmd /k "cd /d %~dp0main-app && npm run dev"

echo.
echo All services are starting...
echo Main app will be available at: http://localhost:8080
echo.
pause

核心功能解析:

  1. 服务启动顺序

    • 微应用优先:先启动所有微应用服务
    • 主应用最后:最后启动主应用,确保微应用已就绪
    • 端口分配:content-management(8081), user-management(8082), settings(8083), main-app(8080)
  2. 窗口管理

    • start "窗口标题" cmd /k:为每个服务创建独立的命令窗口
    • /k参数:保持窗口打开,便于查看日志和调试
    • 每个服务都有明确的窗口标题标识
  3. 启动间隔

    • timeout /t 2 /nobreak >nul:每个服务启动间隔2秒
    • 避免同时启动造成资源竞争
    • 确保前一个服务完全启动后再启动下一个
  4. 路径和命令

    • cd /d %~dp0micro-apps\content-management:切换到对应应用目录
    • && npm run dev:执行开发服务器启动命令
    • 使用&&确保目录切换成功后才执行npm命令

服务启动流程:

1. 启动内容管理服务 (8081端口)
   ↓ 等待2秒
2. 启动用户管理服务 (8082端口)
   ↓ 等待2秒
3. 启动系统设置服务 (8083端口)
   ↓ 等待2秒
4. 启动主应用服务 (8080端口)
   ↓
5. 所有服务启动完成

使用方法:

# 双击运行或在命令行中执行
start-all.bat

注意事项:

  • 确保已运行install-all.bat安装所有依赖
  • 每个服务会在独立的命令窗口中运行
  • 关闭服务时需要在对应的命令窗口中按Ctrl+C
  • 主应用访问地址:http://localhost:8080

3. 脚本优势对比

批处理脚本 (install-all.bat / start-all.bat) 优势:

  • Windows原生支持:无需额外安装PowerShell
  • 简单易用:双击即可运行
  • 错误处理:使用call命令确保错误不中断流程
  • 窗口管理:每个服务独立窗口,便于调试

PowerShell脚本 (install-all.ps1 / start-all.ps1) 优势:

  • 跨平台支持:支持Windows、Linux、macOS
  • 功能强大:支持更复杂的逻辑和错误处理
  • 颜色输出:支持彩色输出,用户体验更好
  • 并发执行:可以并行启动多个服务

构建和部署

1. 开发环境构建

环境要求:

  • Node.js 16+
  • npm 或 yarn 包管理器
  • Windows 批处理支持(推荐)或 PowerShell 5.0+

安装依赖:

# 使用批处理脚本一键安装所有依赖(推荐)
install-all.bat

# 或使用PowerShell脚本
.\install-all.ps1

# 或手动安装
npm run install:all

启动开发服务器:

# 使用批处理脚本一键启动所有服务(推荐)
start-all.bat

# 或使用PowerShell脚本
.\start-all.ps1

# 或使用npm脚本
npm run dev

开发脚本配置:

{
  "scripts": {
    "dev": "concurrently -n \"content,users,settings,main\" -c \"cyan,green,yellow,blue\" \"npm run dev:content\" \"npm run dev:users\" \"npm run dev:settings\" \"npm run dev:main\"",
    "dev:content": "cd micro-apps/content-management && npm run dev",
    "dev:users": "cd micro-apps/user-management && npm run dev",
    "dev:settings": "cd micro-apps/settings && npm run dev",
    "dev:main": "cd main-app && npm run dev",
    "install:all": "npm install && cd main-app && npm install && cd ../micro-apps/content-management && npm install && cd ../user-management && npm install && cd ../settings && npm install"
  }
}

2. 生产环境构建

构建配置:

# 构建主应用
cd main-app
npm run build

# 构建微应用
cd micro-apps/content-management
npm run build

cd ../user-management
npm run build

cd ../settings
npm run build

部署配置:

  • 静态文件部署:部署到CDN或静态服务器
  • Nginx配置:配置反向代理和路由规则
  • Docker部署:使用容器化部署方案
  • CI/CD集成:自动化构建和部署流程

3. 部署配置

  • Nginx配置:配置微应用路由和代理
  • CDN加速:静态资源CDN分发
  • 负载均衡:多实例负载均衡配置
  • 监控告警:应用性能监控和告警

测试策略

1. 单元测试

// Jest测试用例
describe('Layout Component', () => {
  test('should render navigation menu', () => {
    render(<Layout />)
    expect(screen.getByText('Content Management')).toBeInTheDocument()
    expect(screen.getByText('User Management')).toBeInTheDocument()
    expect(screen.getByText('Settings')).toBeInTheDocument()
  })

  test('should handle navigation', () => {
    render(<Layout />)
    const contentButton = screen.getByText('Content Management')
    fireEvent.click(contentButton)
    expect(window.location.pathname).toBe('/content')
  })
})

2. 集成测试

  • 微应用加载测试:验证微应用正确加载
  • 路由切换测试:测试路由切换功能
  • 通信测试:验证主应用与微应用通信
  • 样式隔离测试:确保样式不冲突

3. 端到端测试

  • 用户流程测试:完整用户操作流程
  • 跨浏览器测试:多浏览器兼容性测试
  • 性能测试:加载时间和响应性能测试
  • 移动端测试:移动设备适配测试

扩展性设计

1. 模块化架构

  • 插件系统:支持新的微应用插件
  • 主题系统:可配置的主题和样式
  • 国际化:多语言支持框架
  • 权限系统:基于角色的权限控制

2. 未来扩展

  • 微服务集成:与后端微服务架构集成
  • PWA支持:渐进式Web应用功能
  • 离线支持:离线缓存和同步机制
  • 实时通信:WebSocket实时数据同步

技术亮点

1. 微前端架构

  • 技术栈无关:支持不同技术栈的微应用
  • 独立部署:每个微应用可独立开发部署
  • 运行时集成:运行时动态加载微应用
  • 样式隔离:CSS样式完全隔离

2. 开发体验

  • 热更新:开发时实时更新
  • 调试支持:完整的调试工具链
  • 类型安全:TypeScript类型检查
  • 代码分割:按需加载优化

3. 性能优化

  • 懒加载:微应用按需加载
  • 缓存策略:智能缓存机制
  • 资源优化:构建时资源优化
  • CDN加速:静态资源CDN分发

4. 团队协作

  • 独立开发:团队可独立开发微应用
  • 版本管理:独立的版本控制
  • 发布流程:灵活的发布策略
  • 监控告警:完整的监控体系

5. 开发工具链

  • 一键安装:install-all.bat 自动安装所有依赖
  • 一键启动:start-all.bat 自动启动所有服务
  • 窗口管理:每个服务独立窗口,便于调试
  • 错误处理:完善的错误处理和日志输出

总结

这个基于qiankun的微前端项目展示了现代大型前端应用的最佳实践,通过微前端架构实现了应用的模块化、团队独立开发和独立部署。项目采用了React + Vite的现代化技术栈,结合Tailwind CSS提供了优秀的开发体验和用户界面。

该项目的源码完全开源,为开发者提供了一个完整的微前端解决方案参考,特别是在微前端架构设计、开发工具链配置、团队协作和性能优化方面具有很高的学习价值。


作者信息

网站: www.itgather.com
邮箱: itgather@163.com
公众号: 全栈代码工坊
在这里插入图片描述

本文首发于 IT Gather 技术社区,欢迎关注我们的公众号获取更多技术分享。

附件下载

网页分享: 基于乾坤的前端微服务.rar
小通密码: ctfile://xtc17802766-f8458240343-04167e-1150

下载方法: 打开城通网盘客户端或APP,输入小通密码即可下载

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐