SocialNetworks_duan/vite.config.js
qumeng039@126.com 8f8a8c3872 修改完毕
2025-08-28 16:15:35 +08:00

183 lines
5.2 KiB
JavaScript

import { defineConfig, loadEnv } from "vite"
import removeConsole from "vite-plugin-remove-console" //生产环境移除console.log
import vue from "@vitejs/plugin-vue"
import { visualizer } from "rollup-plugin-visualizer"
import compression from "vite-plugin-compression"
import path from "path"
import cssnano from "cssnano" //压缩css工具
import imagemin from "unplugin-imagemin/vite" //图片压缩工具
export default defineConfig(({ mode, command }) => {
// 加载环境变量
const env = loadEnv(mode, process.cwd(), "")
const isProduction = command === "build"
const isAnalyze = mode === "analyze"
return {
plugins: [
vue(),
// 生产环境才移除console
isProduction && removeConsole(),
// 生产环境开启gzip 压缩
isProduction &&
compression({
algorithm: "gzip",
ext: ".gz",
threshold: 10240 // 10KB以上才压缩
}),
// 构建分析
isAnalyze &&
visualizer({
query: "?url",
import: "default",
filename: "dist/stats.html",
open: true,
gzipSize: true
})
].filter(Boolean),
// 确保所有资源类型都能被正确识别和处理
assetsInclude: [
"**/*.csv",
"**/*.png",
"**/*.jpg",
"**/*.jpeg",
"**/*.gif",
"**/*.svg",
"**/*.webp"
],
base: "./",
css: {
preprocessorOptions: {
scss: {
//全局导入自适应px转换vw vh sass函数
additionalData: `
@use "@/utils/px-to-vw-vh.scss" as *;
`
}
},
// 生产环境压缩 CSS
...(isProduction && {
postcss: {
plugins: [
cssnano({
preset: "default"
})
]
}
})
},
resolve: {
alias: {
"@": path.resolve(__dirname, "src"),
"@assets": path.resolve(__dirname, "src/assets"),
"@components": path.resolve(__dirname, "src/components"),
"@views": path.resolve(__dirname, "src/views"),
"@utils": path.resolve(__dirname, "src/utils")
}
},
server: {
open: true,
proxy: {
"/api": {
target: "http://172.16.20.3:5080",
changeOrigin: true
// rewrite: (path) => path.replace(/^\/api/, "")
}
},
// 开发服务器优化
cors: true,
hmr: {
overlay: true
}
},
build: {
target: "es2018", // JavaScript 代码,转换成兼容 ES2018 标准的代码
chunkSizeWarningLimit: 1000, // 减少警告
reportCompressedSize: false,
assetsInlineLimit: 4096, // 资源内联限制优化
rollupOptions: {
output: {
// 手动代码分割优化
manualChunks: (id) => {
if (id.includes("node_modules")) {
// 将大的第三方库单独分包
if (id.includes("echarts") || id.includes("zrender")) return "vendor-echarts"
if (id.includes("element-plus")) return "vendor-element"
if (id.includes("vue")) return "vendor-vue"
if (id.includes("lodash") || id.includes("underscore")) return "vendor-lodash"
return "vendor"
}
// 路由级别代码分割
if (id.includes("/views/")) {
const match = id.match(/(?:views|pages)\/([^/]+)/)
if (match && match[1]) {
return `view-${match[1]}`
}
}
},
// 环境差异化命名
chunkFileNames: isProduction ? "js/[name]-[hash:8].js" : "js/[name].js",
entryFileNames: isProduction ? "js/[name]-[hash:8].js" : "js/[name].js",
// 优化的资源文件处理
assetFileNames: (assetInfo) => {
if (!assetInfo.names || assetInfo.names.length === 0)
return "assets/[name]-[hash][extname]"
const ext = assetInfo.names[0].split(".").pop().toLowerCase()
const hash = isProduction ? "-[hash:8]" : ""
// 精细化文件分类
const assetMap = {
// 图片
png: "img",
jpeg: "img",
jpg: "img",
gif: "img",
svg: "img",
webp: "img",
avif: "img",
ico: "img",
// 样式
css: "css",
less: "css",
scss: "css",
sass: "css",
// 字体
woff: "fonts",
woff2: "fonts",
eot: "fonts",
ttf: "fonts",
otf: "fonts",
// 媒体
mp4: "media",
webm: "media",
ogg: "media",
mp3: "media",
wav: "media",
// 数据
json: "data",
xml: "data",
csv: "data"
}
const dir = assetMap[ext] || "assets"
return `${dir}/[name]${hash}[extname]`
}
}
}
},
// 预览服务器配置
preview: {
port: 4173,
open: true,
cors: true
},
// ESBuild 优化
esbuild: {
drop: isProduction ? ["console", "debugger"] : []
}
}
})