Files
wechatWeb/admin/webpack.config.js
张成 aa8eaa6ccd init
2026-03-24 16:07:02 +08:00

119 lines
3.0 KiB
JavaScript
Raw Permalink 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.
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { VueLoaderPlugin } = require('vue-loader')
module.exports = (env, argv) => {
// 仅当传入 env_file 时加载 .envbuild:sit / build:prod否则 dev 用 developmentbuild 用 prod
const envFile = env && env.env_file
if (envFile) {
require('dotenv').config({ path: path.resolve(__dirname, envFile) })
}
const buildEnv = process.env.BUILD_ENV || (argv.mode === 'production' ? 'prod' : 'development')
return {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'js/[name].[contenthash:8].js',
chunkFilename: 'js/[name].[contenthash:8].chunk.js',
clean: true
},
optimization: {
splitChunks: {
chunks: 'all',
minSize: 20000,
maxSize: 244000,
cacheGroups: {
// Vue 相关库单独打包
vue: {
test: /[\\/]node_modules[\\/](vue|vue-router|vuex|vue-loader|vue-template-compiler)[\\/]/,
name: 'vue',
priority: 30,
reuseExistingChunk: true
},
// UI 库单独打包
ui: {
test: /[\\/]node_modules[\\/](view-design|iview)[\\/]/,
name: 'ui',
priority: 25,
reuseExistingChunk: true
},
// 其他第三方库打包
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
priority: 10,
reuseExistingChunk: true
},
// 公共代码
common: {
name: 'common',
minChunks: 2,
priority: 5,
reuseExistingChunk: true
}
}
},
// 运行时代码单独打包
runtimeChunk: {
name: 'runtime'
},
// 生产环境启用压缩
minimize: process.env.NODE_ENV === 'production'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.css$/,
use: ['vue-style-loader', 'css-loader']
},
{
test: /\.less$/,
use: ['vue-style-loader', 'css-loader', 'less-loader']
},
{
test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf|otf)$/,
type: 'asset/resource',
generator: {
filename: 'assets/[name].[hash:8][ext]'
}
}
]
},
plugins: [
new webpack.DefinePlugin({
__APP_BUILD_ENV__: JSON.stringify(buildEnv),
'process.env.BUILD_ENV': JSON.stringify(buildEnv)
}),
new VueLoaderPlugin(),
new HtmlWebpackPlugin({
template: './public/index.html',
title: '管理后台'
})
],
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': path.resolve(__dirname, 'src'),
'vue$': 'vue/dist/vue.esm.js'
}
},
devServer: {
hot: true,
open: true,
port: 8080,
historyApiFallback: true
}
}
}