Files
estate/vite.config.ts

128 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineConfig, loadEnv } from 'vite';
import createPlugins from './vite/plugins';
import autoprefixer from 'autoprefixer'; // css自动添加兼容性前缀
import path from 'path';
export default defineConfig(({ mode, command }) => {
const env = loadEnv(mode, process.cwd());
const isBuild = command === 'build';
return {
// 部署生产环境和开发环境下的URL。
// 默认情况下vite 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
base: env.VITE_APP_CONTEXT_PATH || '/',
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@images': path.resolve(__dirname, './src/assets/images')
},
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
},
// https://cn.vitejs.dev/config/#resolve-extensions
plugins: createPlugins(env, command === 'build'),
server: {
host: '0.0.0.0',
port: Number(env.VITE_APP_PORT),
open: true,
proxy: {
[env.VITE_APP_BASE_API]: {
target: env.VITE_APP_PROXY_API || 'http://192.168.1.222:8080',
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
}
}
},
build: {
outDir: 'dist',
cleanOutDir: true,
sourcemap: false, // 生产关闭
minify: isBuild ? 'terser' : false, // 只在打包时压缩
terserOptions: {
compress: {
drop_console: isBuild,
drop_debugger: isBuild
},
format: {
comments: false // 删除所有注释
}
},
rollupOptions: {
output: {
// ✅ 优化8拆包策略核心优化
chunkFileNames: 'static/js/[name]-[hash].js',
entryFileNames: 'static/js/[name]-[hash].js',
assetFileNames: 'static/assets/[name]-[hash].[ext]',
// manualChunks: {
// 'vue-vendor': ['vue', 'vue-router', 'pinia'], // Vue 生态单独拆包
// 'element-plus': ['element-plus', '@element-plus/icons-vue'], // Element Plus 单独拆包
// 'echarts': ['echarts'], // ECharts 单独拆包
// 'utils': ['axios', '@vueuse/core', 'vue-i18n'] // 工具库单独拆包
// }
manualChunks(id) {
// 仅对第三方依赖进行分包,业务代码走默认逻辑
if (!id.includes('node_modules')) return;
// 1. Vue 生态(对应原 vue-vendor 分组)
if (['vue', 'vue-router', 'pinia'].some((pkg) => id.includes(pkg))) {
return 'vue-vendor';
}
// 2. Element Plus 组件库(对应原 element-plus 分组)
if (id.includes('element-plus') || id.includes('@element-plus')) {
return 'element-plus';
}
// 3. ECharts 图表(对应原 echarts 分组)
if (id.includes('echarts')) {
return 'echarts';
}
// 4. 通用工具库(对应原 utils 分组)
if (['axios', '@vueuse/core', 'vue-i18n'].some((pkg) => id.includes(pkg))) {
return 'utils';
}
// 其余所有第三方依赖统一打入 vendor 包
return 'vendor';
}
}
}
},
css: {
minify: 'postcss',
preprocessorOptions: {
scss: {
// additionalData: '@use "@/assets/styles/variables.module.scss as *";'
// javascriptEnabled: true
}
},
postcss: {
plugins: [
// 浏览器兼容性
autoprefixer(),
{
postcssPlugin: 'internal:charset-removal',
AtRule: {
charset: (atRule) => {
atRule.remove();
}
}
}
]
}
},
// 预编译
optimizeDeps: {
include: [
'vue',
'vue-router',
'pinia',
'axios',
'@vueuse/core',
'echarts',
'vue-i18n',
'@vueup/vue-quill',
'image-conversion',
'element-plus/es/components/**/css'
]
}
};
});