ContiNew Admin UI Webpack迁移Vite实战经验

ContiNew Admin UI Webpack迁移Vite实战经验

【免费下载链接】continew-admin-ui 全新 3.0 版本,基于 Gi Demo 前端模板开发的 ContiNew Admin 前端适配项目。 【免费下载链接】continew-admin-ui 项目地址: https://gitcode.com/continew/continew-admin-ui

前言:为什么要从Webpack迁移到Vite?

还在为Webpack的冷启动速度慢、热更新延迟而烦恼吗?还在为复杂的配置文件和漫长的构建时间而头疼吗?ContiNew Admin UI项目从Webpack成功迁移到Vite的实战经验,将为你揭示现代前端构建工具的巨大优势。

通过本文,你将获得:

  • 🚀 极致的开发体验:冷启动时间从10+秒降至1秒内
  • 闪电般的HMR:热更新几乎无感知
  • 📦 更简单的配置:告别复杂的Webpack配置
  • 🛠️ 完整的迁移方案:从配置文件到插件生态的全面适配

迁移背景与项目现状

ContiNew Admin UI是一个基于Vue3 + TypeScript + Arco Design的高质量多租户中后台管理系统。在迁移前,项目使用的是Webpack 5作为构建工具,但随着项目规模的增长,开发体验逐渐成为瓶颈。

迁移前的痛点分析

mermaid

迁移步骤详解

第一步:依赖包调整

首先需要移除Webpack相关依赖,添加Vite生态的插件:

// package.json 依赖调整
{
  "devDependencies": {
    // 移除Webpack相关
    "- webpack": "^5.0.0",
    "- webpack-cli": "^4.0.0",
    "- webpack-dev-server": "^4.0.0",
    
    // 添加Vite相关
    "+ vite": "^5.1.5",
    "+ @vitejs/plugin-vue": "^5.2.1",
    "+ @vitejs/plugin-vue-jsx": "^3.1.0",
    "+ vite-plugin-mock": "^2.9.8",
    "+ vite-plugin-svg-icons": "^2.0.1",
    "+ unplugin-auto-import": "^0.16.4",
    "+ unplugin-vue-components": "^0.25.1"
  }
}

第二步:配置文件迁移

Webpack配置 vs Vite配置对比
功能模块Webpack配置Vite配置复杂度对比
入口配置entry: './src/main.js'自动识别 index.html⭐ vs ⭐⭐⭐⭐⭐
输出配置复杂的output配置简单的build配置⭐⭐⭐⭐ vs ⭐
插件系统繁琐的plugin配置简洁的plugin数组⭐⭐⭐ vs ⭐⭐
开发服务器webpack-dev-server内置开发服务器⭐⭐ vs ⭐⭐⭐⭐⭐
Vite核心配置示例
// vite.config.ts
import { defineConfig, loadEnv } from 'vite'
import createVitePlugins from './config/plugins'

export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, process.cwd()) as ImportMetaEnv

  return {
    base: env.VITE_BASE,
    resolve: {
      alias: {
        '~': fileURLToPath(new URL('./', import.meta.url)),
        '@': fileURLToPath(new URL('./src', import.meta.url)),
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/styles/var.scss" as *;`,
        },
      },
    },
    server: {
      open: true,
      proxy: {
        [env.VITE_API_PREFIX]: {
          target: env.VITE_API_BASE_URL,
          changeOrigin: true,
          secure: false,
          rewrite: (path) => path.replace(new RegExp(`^${env.VITE_API_PREFIX}`), ''),
        },
      },
    },
    plugins: createVitePlugins(env, command === 'build'),
    build: {
      chunkSizeWarningLimit: 2000,
      minify: 'terser',
      terserOptions: {
        compress: {
          drop_console: true,
          drop_debugger: true,
        },
      },
    },
  }
})

第三步:插件系统重构

Vite采用模块化的插件架构,ContiNew Admin UI将插件按功能拆分:

// config/plugins/index.ts
export default function createVitePlugins(viteEnv, isBuild = false) {
  const vitePlugins: (PluginOption | PluginOption[])[] = [
    appInfo(), 
    vue(), 
    vueJsx()
  ]
  
  vitePlugins.push(createDevtools(viteEnv))
  vitePlugins.push(createAutoImport())
  vitePlugins.push(createComponents())
  vitePlugins.push(createSvgIcon(isBuild))
  vitePlugins.push(createMock(viteEnv, isBuild))
  
  return vitePlugins
}
关键插件配置详解

自动导入插件配置

// config/plugins/auto-import.ts
import AutoImport from 'unplugin-auto-import/vite'

export default function createAutoImport() {
  return AutoImport({
    imports: [
      'vue',
      'vue-router',
      'pinia',
      '@vueuse/core',
      {
        from: 'vue',
        imports: ['Component', 'Prop', 'Watch', 'Emit'],
        type: true,
      },
    ],
    dts: 'types/auto-imports.d.ts',
    dirs: ['src/composables', 'src/stores'],
    eslintrc: {
      enabled: true,
    },
  })
}

组件自动导入配置

// config/plugins/components.ts
import Components from 'unplugin-vue-components/vite'
import { ArcoResolver } from 'unplugin-vue-components/resolvers'

export default function createComponents() {
  return Components({
    resolvers: [ArcoResolver()],
    dts: 'types/components.d.ts',
    dirs: ['src/components'],
    deep: true,
  })
}

第四步:环境变量处理

Vite的环境变量处理与Webpack有显著差异:

# .env.development
VITE_BASE=/
VITE_API_BASE_URL=http://localhost:8080
VITE_API_PREFIX=/api

在代码中使用方式:

// Webpack方式(已废弃)
const apiUrl = process.env.API_BASE_URL

// Vite方式
const apiUrl = import.meta.env.VITE_API_BASE_URL

迁移过程中的挑战与解决方案

挑战一:CSS预处理器的兼容性

问题:Webpack的sass-loader配置与Vite不兼容

解决方案

// Vite中的SCSS配置
css: {
  preprocessorOptions: {
    scss: {
      additionalData: `@use "@/styles/var.scss" as *;`,
      api: 'modern-compiler',
    },
  },
}

挑战二:SVG图标处理

问题:Webpack的svg-sprite-loader需要替换

解决方案:使用vite-plugin-svg-icons

// config/plugins/svg-icon.ts
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'

export default function createSvgIcon(isBuild: boolean) {
  return createSvgIconsPlugin({
    iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
    symbolId: 'icon-[dir]-[name]',
    svgoOptions: isBuild,
  })
}

挑战三:Mock数据适配

问题:Webpack的devServer.before配置需要迁移

解决方案:使用vite-plugin-mock

// config/plugins/mock.ts
import { viteMockServe } from 'vite-plugin-mock'

export default function createMock(viteEnv, isBuild: boolean) {
  return viteMockServe({
    mockPath: 'mock',
    localEnabled: !isBuild && viteEnv.VITE_USE_MOCK === 'true',
    prodEnabled: isBuild && viteEnv.VITE_USE_MOCK === 'true',
    injectCode: `
      import { setupProdMockServer } from '../mock';
      setupProdMockServer();
    `,
  })
}

性能对比数据

迁移前后的性能对比令人震撼:

指标WebpackVite提升幅度
冷启动时间12.3s0.8s15.4倍
HMR更新时间2.1s0.05s42倍
内存占用1.6GB0.8GB50%减少
构建时间45s22s2倍

mermaid

最佳实践与优化建议

1. 依赖预构建优化

// 显式指定需要预构建的依赖
optimizeDeps: {
  include: ['vue-draggable-plus', 'lodash-es'],
  exclude: ['vue'], // 排除已经优化的依赖
}

2. 构建输出优化

build: {
  rollupOptions: {
    output: {
      chunkFileNames: 'static/js/[name]-[hash].js',
      entryFileNames: 'static/js/[name]-[hash].js',
      assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
      manualChunks: {
        'vue-vendor': ['vue', 'vue-router', 'pinia'],
        'arco-vendor': ['@arco-design/web-vue'],
        'echarts-vendor': ['echarts', 'vue-echarts'],
      },
    },
  },
}

3. 开发服务器配置优化

server: {
  host: true, // 监听所有地址
  port: 5173,
  strictPort: false, // 端口被占用时尝试其他端口
  cors: true,
  hmr: {
    overlay: true, // 显示错误覆盖层
  },
}

常见问题排查指南

Q1: 环境变量无法正确读取

解决方案:确保环境变量以VITE_前缀开头,并使用import.meta.env访问

Q2: 第三方库兼容性问题

解决方案:在optimizeDeps.include中添加需要预构建的CommonJS模块

Q3: CSS作用域问题

解决方案:检查css.modules配置,确保与Webpack的css-loader配置一致

Q4: 路径别名不生效

解决方案:确保在tsconfig.jsonvite.config.ts中的路径别名配置一致

迁移 checklist

  •  移除Webpack相关依赖
  •  安装Vite及相关插件
  •  创建vite.config.ts配置文件
  •  调整环境变量使用方式
  •  适配CSS预处理器配置
  •  处理静态资源引用
  •  配置路径别名
  •  设置开发服务器代理
  •  优化构建配置
  •  测试开发和生产环境构建

总结

ContiNew Admin UI从Webpack到Vite的迁移实践证明,Vite在现代前端项目中的优势是显而易见的。不仅大幅提升了开发体验,还简化了配置复杂度,降低了维护成本。

迁移过程虽然会遇到一些挑战,但通过合理的规划和逐步实施,这些挑战都可以得到有效解决。最重要的是,迁移后的性能提升和开发效率提升,将为项目的长期发展奠定坚实基础。

如果你正在考虑进行类似的迁移,建议按照本文提供的步骤和最佳实践进行操作,相信你也能享受到Vite带来的极致开发体验。

【免费下载链接】continew-admin-ui 全新 3.0 版本,基于 Gi Demo 前端模板开发的 ContiNew Admin 前端适配项目。 【免费下载链接】continew-admin-ui 项目地址: https://gitcode.com/continew/continew-admin-ui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值