You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yudao/front-end/mall4v/vite.config.js

93 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { defineConfig, loadEnv } from 'vite'; // 导入 Vite 的定义配置函数和环境变量加载函数
import vue from '@vitejs/plugin-vue'; // 导入 Vue 插件,使 Vite 支持 .vue 文件
import path from 'path'; // Node.js 标准库,用于处理和转换文件路径
import AutoImport from 'unplugin-auto-import/vite'; // 自动导入 API 插件
import Components from 'unplugin-vue-components/vite'; // 自动注册组件插件
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'; // 组件解析器,用于自动导入 Element Plus 组件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; // SVG 图标插件,将 SVG 文件转化为 Vue 组件
import viteCompression from 'vite-plugin-compression'; // 压缩构建输出文件的插件
// ESLint 插件,用于在开发期间进行代码检查
import eslintPlugin from 'vite-plugin-eslint';
export default defineConfig(({ command }) => ({
plugins: [
vue(), // 启用 Vue 插件
// 创建 SVG 图标插件实例,配置图标目录和生成的 symbol ID 模板
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')],
symbolId: 'icon-[dir]-[name]'
}),
// 配置 AutoImport 插件以自动导入指定模块中的内容
AutoImport({
imports: ['vue', 'vue-router'], // 指定要自动导入的模块
dirs: ['src/hooks/**', 'src/stores/**', 'src/utils/**'], // 包含自定义钩子、状态管理、工具函数的目录
resolvers: command === 'build' ? [ElementPlusResolver()] : [], // 构建时使用 ElementPlusResolver 解析器
dts: 'src/auto-import/imports.d.ts', // 自动生成类型声明文件的位置
eslintrc: {
enabled: false // 禁用对 .eslintrc 文件的自动更新
}
}),
// 自动注册来自特定目录的 Vue 组件,并可选地使用解析器来处理第三方库中的组件
Components({
dirs: ['src/components'], // 包含组件的目录
resolvers: command === 'build' ? [ElementPlusResolver()] : [], // 构建时使用 ElementPlusResolver 解析器
dts: 'src/auto-import/components.d.ts' // 自动生成类型声明文件的位置
}),
// 使用 ESLint 插件检查 JavaScript 和 Vue 文件
eslintPlugin({
include: ['src/**/*.js', 'src/**/*.vue', 'src/*.js', 'src/*.vue'] // 指定要检查的文件模式
}),
// 对超过 1KB 的文件启用 gzip 或 brotli 压缩
viteCompression({
threshold: 1000,
})
],
// 开发服务器配置
server: {
host: true, // 允许外部访问
port: 9527, // 设置服务端口
open: true // 在启动时自动打开浏览器
},
// 路径别名配置
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'), // 将 @ 替换为 src 目录的绝对路径
'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js' // 强制使用兼容性更好的 vue-i18n 版本
}
},
// 构建选项
build: {
base: './', // 构建后的资源基础路径
rollupOptions: {
output: {
chunkFileNames: 'static/js/[name]-[hash].js', // 动态导入的代码分割块命名规则
entryFileNames: 'static/js/[name]-[hash].js', // 入口文件命名规则
assetFileNames: 'static/[ext]/[name]-[hash].[ext]', // 静态资源(如图片、字体等)命名规则
// 手动拆分 chunks通常用于优化包大小和缓存策略
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.toString().indexOf('.pnpm/') !== -1) {
return id.toString().split('.pnpm/')[1].split('/')[0].toString();
} else if (id.toString().indexOf('node_modules/') !== -1) {
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
}
}
}
},
sourcemap: false, // 是否生成 source map 文件
target: 'es2015', // 设置打包后代码的目标浏览器或 Node.js 版本
reportCompressedSize: false // 不报告压缩后的包大小
}
}));