partner-admin/webpack.config.js
2025-03-09 11:00:17 +08:00

129 lines
3.6 KiB
JavaScript

const path = require('path');
const { VueLoaderPlugin } = require('vue-loader');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const dotenv = require('dotenv');
const fs = require('fs');
module.exports = (env, argv) => {
// 默认为开发环境
const mode = argv.mode || 'development';
// 确定环境
const nodeEnv = env?.testing ? 'testing' : mode;
console.log('构建环境:', nodeEnv);
console.log('命令行参数:', env);
// 加载对应的环境变量文件
const envFile = `.env.${nodeEnv}`;
const defaultEnvFile = '.env';
console.log('尝试加载环境文件:', envFile);
// 加载环境变量
let envConfig = {};
// 先尝试加载默认环境变量文件
if (fs.existsSync(defaultEnvFile)) {
console.log('加载默认环境文件:', defaultEnvFile);
envConfig = dotenv.parse(fs.readFileSync(defaultEnvFile));
}
// 再尝试加载特定环境的环境变量文件
if (fs.existsSync(envFile)) {
console.log('加载特定环境文件:', envFile);
envConfig = { ...envConfig, ...dotenv.parse(fs.readFileSync(envFile)) };
} else {
console.log('环境文件不存在:', envFile);
}
console.log('加载的环境变量:', envConfig);
// 将环境变量转换为 webpack 定义插件需要的格式
const envKeys = Object.keys(envConfig).reduce((prev, next) => {
prev[`process.env.${next}`] = JSON.stringify(envConfig[next]);
return prev;
}, {});
// 确保 NODE_ENV 被正确设置
envKeys['process.env.NODE_ENV'] = JSON.stringify(nodeEnv);
// 直接设置 VUE_APP_API_URL
if (nodeEnv === 'testing') {
envKeys['process.env.VUE_APP_API_URL'] = JSON.stringify('https://api-dev.beefast.co');
} else if (nodeEnv === 'production') {
envKeys['process.env.VUE_APP_API_URL'] = JSON.stringify('https://api.beefast.co');
} else {
envKeys['process.env.VUE_APP_API_URL'] = JSON.stringify('http://localhost:8000');
}
// 添加构建时间戳,用于破除缓存
envKeys['process.env.BUILD_TIMESTAMP'] = JSON.stringify(new Date().getTime());
console.log('注入的环境变量:', envKeys);
return {
mode,
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
// 添加内容哈希,确保文件内容变化时文件名也变化
filename: 'js/[name].[contenthash:8].js',
chunkFilename: 'js/[name].[contenthash:8].js',
publicPath: '/'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.(png|jpg|gif|svg)$/,
type: 'asset/resource',
generator: {
filename: 'img/[name].[hash:8][ext]'
}
}
]
},
plugins: [
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
template: './public/index.html',
// 添加构建时间戳作为查询参数,确保 HTML 文件不被缓存
filename: 'index.html',
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: false
}
}),
new webpack.DefinePlugin(envKeys)
],
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': path.resolve(__dirname, 'src')
}
},
devServer: {
static: {
directory: path.join(__dirname, 'public'),
},
historyApiFallback: true,
port: 8080,
hot: true
}
};
};