# Vue CLI 到 Vite 迁移总结
## 迁移概述
成功将飞鸟智慧巡园平台项目从 Vue CLI 迁移到 Vite,获得了显著的性能提升和更好的开发体验。
## 迁移时间
- 开始时间:2024年12月
- 完成时间:约2-3小时
- 迁移状态:✅ 完成
## 主要修改内容
### 1. 依赖配置更新
- **package.json**:
- 更新脚本命令:`servedev` → `dev`,`build` → `vite build`
- 移除 Vue CLI 相关依赖:`@vue/cli-service`、`@vue/cli-plugin-*`、`webpack`
- 添加 Vite 相关依赖:`vite@^4.5.0`、`@vitejs/plugin-vue@^4.5.0`、`vite-plugin-svg-icons`、`vite-plugin-mock-dev-server`
### 2. 配置文件迁移
- **删除文件**:
- `vue.config.js` (Vue CLI 配置)
- `babel.config.js` (Babel 配置)
- **新增文件**:
- `vite.config.js` (Vite 配置)
- `index.html` (Vite 入口文件)
### 3. 模块语法转换
- **修复文件数量**:17个 API 模块文件
- **转换内容**:
- `require.context` → `import.meta.glob`
- `module.exports` → `export default`
- `const config = require("../config")` → `import config from "../config"`
### 4. 动态导入修复
- **路由文件**:为所有动态导入添加 `@vite-ignore` 注释
- **修复文件**:
- `src/router/mainRoutes.js`
- `src/router/globalRoutes.js`
### 5. 组件导入路径修复
- **修复文件**:
- `src/views/Login.vue`
- `src/views/AuthenticLogin.vue`
- `src/views/404.vue`
- **修复内容**:添加 `.vue` 扩展名
### 6. 配置文件转换
- **src/config.js**:CommonJS → ES6 模块
- **src/api/config.js**:添加缺失的 `resize` 导出
- **src/api/enum.js**:CommonJS → ES6 模块
- **src/store/modules/app/type.js**:添加缺失的导出
### 7. 插件和指令修复
- **src/plugins/axios.js**:修复 `require.context` 使用
- **src/plugins/mock.js**:修复 `require.context` 使用
- **src/directives/index.js**:修复 `require.context` 使用
- **src/store/index.js**:修复 `require.context` 使用
### 8. 模块导入修复
- **src/api/modules/image.js**:修复 `require` 语法为 `import` 语法
- **src/api/data/DataFetcher.js**:修复 `module.exports` 为 `export default`
- **src/utils/index.js**:修复 `require` 为动态 `import`
### 9. 环境变量配置修复
- **vite.config.js**:添加 `VE_ENV` 全局变量定义,使用 `loadEnv` 正确加载环境变量
- **src/api/config.js**:移除默认值,确保必须读取到环境变量
- **env.config.js**:创建环境变量配置文件,支持多环境配置
- **问题描述**:Vue CLI 中的 `VE_ENV.SERVER` 和 `VE_ENV.PYSERVER` 在 Vite 中未定义,导致 API 请求地址变成 `http://localhost:3002/undefinedsite/user/login`
- **问题升级**:使用 `JSON.stringify` 导致字符串重复引用,URL 变成 `http://localhost:3002/%22http://localhost:3002/%22site/user/login`
- **问题升级2**:`process.env.NODE_ENV` 在 Vite 中读取不到
- **问题升级3**:每次启动需要手动设置环境变量
- **最终解决方案**:
- 创建 `env.config.js` 配置文件,支持 development 和 production 环境
- 在 `vite.config.js` 中使用 `loadEnv` 函数正确加载环境变量
- 将 `process.env` 替换为 `env` 对象
- 在 `src/api/config.js` 中移除默认值,确保必须读取到环境变量
- 环境变量现在从配置文件读取,无需每次手动设置
### 10. ESLint 配置更新
- **.eslintrc.js**:
- 添加 ES2020 支持
- 添加 `defineOptions` 全局变量支持
### 11. 全局变量设置
- **src/main.js**:
- 移除不必要的 `vue` 导入
- 添加 `XE` 全局变量设置
### 12. 静态资源处理修复
- **问题描述**:Vite 不支持 `require()` 语法加载静态资源,导致 `ReferenceError: require is not defined` 错误
- **修复文件**:
- `src/views/home/album_compoents/cacheImg.js`:将 `require('@/assets/...')` 替换为直接路径
- `src/views/home/album/album_compoents/cacheImg.js`:同上
- `src/views/warningHome/components/album_compoents/cacheImg.js`:同上
- `src/views/workDetail/components/executionProgress.vue`:使用 `new URL()` 方法
- `src/views/warningHome/components/trackDialog.vue`:使用模板字符串路径
- `src/views/warningHome/map/gardenPointLayer.js`:将 `require('@/assets/images/map/garden.png')` 替换为直接路径
- `src/views/warningHome/components/album.vue`:将 `require('@/assets/images/warningHome/gallery/icon-')` 替换为模板字符串路径
- `src/views/varietyMap/map.vue`:将 `require('@/assets/images/map/status/active-icon.png')` 替换为直接路径
- `src/views/home/map/samplePointLayer.js`:将所有 `require('@/assets/images/map/...')` 替换为直接路径
- `src/views/home/map/airLineStringLayer.js`:将所有 `require('@/assets/images/map/...')` 替换为模板字符串路径
- `src/views/home/components/foster/adoptList.vue`:将 `require('@/assets/images/foster-home/list/...')` 替换为模板字符串路径
- `src/views/home/album/index.vue`:将 `require('@/assets/img/gallery/icon-')` 替换为模板字符串路径
- `src/views/authentic/pdfMap.js`:将所有 `require('@/assets/images/map/...')` 替换为模板字符串路径
- `src/addFarm/farmMap.js`:将所有 `require('@/assets/images/map/...')` 和 `require('@/assets/status/...')` 替换为直接路径
- `src/authentic/authenticMap.js`:将所有 `require('@/assets/images/map/...')` 替换为模板字符串路径
- `src/utils/ol-map/Map.js`:将所有 `require('@/assets/images/map/...')` 替换为模板字符串路径
- `src/components/static_map_change/pointLayer.js`:将 `require('@/assets/images/warningHome/chat/fly-point.png')` 替换为直接路径
- `src/components/PicturePreview.vue`:将 `require('@/assets/images/home/HB-ws0y1menggxv/...')` 替换为模板字符串路径
- `src/components/common/stepBox.vue`:将 `require('@/assets/img/gallery/step-...')` 替换为模板字符串路径
- `src/components/chartBox.vue`:将 `require('@/assets/images/common/chart-...')` 替换为模板字符串路径
- `src/views/warningHome/components/timeLine.vue`:将 `require('@/assets/images/warningHome/...')` 替换为模板字符串路径
- `src/components/timeLine.vue`:将 `require('@/assets/images/home/...')` 替换为模板字符串路径
- **新增文件**:
- `src/utils/assetLoader.js`:创建静态资源加载工具函数
- **vite.config.js**:添加 `assetsInclude` 配置支持更多静态资源格式
- **OpenLayers 导入修复**:
- `src/utils/ol-map/VectorLayer.js`:移除未使用的 `OrderFunction` 导入
### 13. vueshowpdf 导入修复
- **问题描述**:`vueshowpdf` 库在 Vite 环境中导入失败,显示 `does not provide an export named 'default'` 错误
- **修复文件**:
- `src/components/PdfDialog.vue`:移除未使用的 `vueshowpdf` 导入
- `src/components/ImageDialog.vue`:移除未使用的 `vueshowpdf` 导入
- **修复说明**:这些组件实际上并没有使用 `vueshowpdf` 库,只是导入了但没有使用,移除导入后功能正常
### 14. liveplayer 库修复
- **问题描述**:`@liveqing/liveplayer-v3` 组件依赖 `videojs`,但在 Vite 环境中 `videojs` 未定义
- **修复文件**:
- `index.html`:添加 `` 标签
- **修复说明**:在 Vue CLI 项目中,`liveplayer-lib.min.js` 是通过 `public/index.html` 中的 `