Files
klp-mono/apps/l2/vue.config.js
砂糖 4fa6a1f59a feat(l2): 添加多环境配置及国际化支持
- 新增klp和g30环境配置文件
- 添加vue-i18n实现中英文切换
- 更新package.json添加环境组相关脚本
- 修改vue.config.js支持多环境配置加载
2025-12-27 13:35:47 +08:00

165 lines
6.1 KiB
JavaScript
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.

'use strict'
const path = require('path')
const dotenv = require('dotenv')
const fs = require('fs')
function resolve(dir) {
return path.join(__dirname, dir)
}
const envGroup = process.env.ENV_GROUP || 'klp' // 默认使用 klp 组
const envMode = process.env.ENV_MODE || 'development' // 默认使用 development 模式
// 2. 拼接环境文件的绝对路径(核心:解决子目录文件找不到问题)
const envFilePath = path.resolve(
process.cwd(), // 项目根目录(避免相对路径歧义)
`config/${envGroup}/.env.${envMode}` // 拼接config/环境组/.env.环境模式
)
// 3. 读取并解析环境文件,注入到 process.env 中
if (fs.existsSync(envFilePath)) {
// 解析 .env 文件
const envConfig = dotenv.config({
path: envFilePath,
override: true
})
if (envConfig.error) {
throw new Error(`加载 ${envGroup} 环境组 ${envMode} 模式配置失败:${envConfig.error.message}`)
}
console.log(`✅ 成功加载环境配置:${envFilePath}`)
} else {
console.warn(`⚠️ 未找到环境配置文件:${envFilePath},请检查 ENV_GROUP 和 ENV_MODE 配置`)
}
const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '镀锌机组及生产工艺管理系统' // 网页标题
const port = process.env.port || process.env.npm_config_port || 80 // 端口
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档
module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
// 在npm run build 或 yarn build 时 生成文件的目录名称要和baseUrl的生产环境路径一致默认dist
outputDir: 'dist',
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
assetsDir: 'static',
// 如果你不需要生产环境的 source map可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false,
transpileDependencies: ['quill'],
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: process.env.VUE_APP_SERVICE_BASE_API,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''
}
},
// 新增WebSocket代理配置
// '/ws-api': { // 匹配前端WebSocket连接的路径如ws://localhost:80/ws-api
// target: '140.143.206.120:8089', // 目标WebSocket服务地址
// ws: true, // 启用WebSocket代理
// changeOrigin: true, // 改变请求源,解决跨域问题
// pathRewrite: {
// '^/ws-api': '' // 如果目标服务不需要路径前缀,可移除
// }
// }
},
disableHostCheck: true
},
css: {
loaderOptions: {
sass: {
sassOptions: { outputStyle: "expanded" }
}
}
},
configureWebpack: {
name: name,
resolve: {
alias: {
'@': resolve('src')
}
},
plugins: [
// http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
new CompressionPlugin({
cache: false, // 不启用文件缓存
test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式
filename: '[path][base].gz[query]', // 压缩后的文件名
algorithm: 'gzip', // 使用gzip压缩
minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩
deleteOriginalAssets: false // 压缩后删除原文件
})
],
},
chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test
// set svg-sprite-loader
config.module
.rule('svg')
.exclude.add(resolve('src/assets/icons'))
.end()
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/assets/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
config.when(process.env.NODE_ENV !== 'development', config => {
config
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}])
.end()
config.optimization.splitChunks({
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // only package third parties that are initially dependent
},
elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true
}
}
})
config.optimization.runtimeChunk('single')
})
}
}