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 } }; };