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; // 加载对应的环境变量文件 const envFile = `.env.${nodeEnv}`; const defaultEnvFile = '.env'; // 加载环境变量 let envConfig = {}; // 先尝试加载默认环境变量文件 if (fs.existsSync(defaultEnvFile)) { envConfig = dotenv.parse(fs.readFileSync(defaultEnvFile)); } // 再尝试加载特定环境的环境变量文件 if (fs.existsSync(envFile)) { envConfig = { ...envConfig, ...dotenv.parse(fs.readFileSync(envFile)) }; } // 将环境变量转换为 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); console.log(`Building for ${nodeEnv} environment`); return { mode, entry: './src/main.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.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' } ] }, plugins: [ new VueLoaderPlugin(), new HtmlWebpackPlugin({ template: './public/index.html' }), 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 } }; };