114 lines
3.0 KiB
JavaScript
114 lines
3.0 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');
|
|
}
|
|
|
|
console.log('注入的环境变量:', envKeys);
|
|
|
|
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
|
|
}
|
|
};
|
|
};
|