const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // 抽离css,不插入到head标签里
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); // 压缩css
const TerserJSPlugin = require('terser-webpack-plugin')
const webpack = require('webpack');
const htmlPlugin = new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
hash: true,
minify: {
removeAttributeQuotes: true,
collapseWhitespace: true
},
chunks: ['index']
});
const aboutPlugin = new HtmlWebpackPlugin({
template: './src/about.html',
filename: 'about.html',
hash: true,
minify: {
removeAttributeQuotes: true,
collapseWhitespace: true
},
chunks: ['about']
});
/* const htmlPlugin = ['index', 'about'].map(chunkName => {
return new HtmlWebpackPlugin({
template: `./src/${chunkName}.html`,
filename: `${chunkName}.html`,
hash: true,
chunks: [`./src/${chunkName}`],
minify: {
removeAttributeQuotes: true,
collapseWhitespace: true
}
});
}) */
const miniPlugin = new MiniCssExtractPlugin({
filename: 'main.css'
});
// 每个模块中注入jq
const webpackProvidePlugin = new webpack.ProvidePlugin({
$: 'jquery',
})
module.exports = {
optimization: {
minimize: true, // 开启压缩,默认false
minimizer: [
new TerserJSPlugin({
terserOptions: {
output: {
comments: false // 删除js文件中的注释
}
},
extractComments: false, // 不将注释提取到单独的文件
sourceMap: true // 源码映射
}),
new OptimizeCSSAssetsPlugin()
]
},
devServer: {
// port: 3000,
// progress: true,
contentBase: path.resolve(__dirname, './build'),
open: true,
host: process.env.HOST || '192.168.1.66',
port: 3000
},
mode: 'development', // development production
entry: {
index: './src/index.js',
about: './src/about.js'
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
plugins: [
miniPlugin,
htmlPlugin,
aboutPlugin,
webpackProvidePlugin
],
module: {
rules: [{
test: /\.(html)$/, // html文件中img标签src没有被打包的问题
use: {
loader: 'html-loader',
options: {
attrs: ['img:src', 'img:data-src', 'audio:src'],
// minimize: true
}
}
},
{
test: /\.(png|jpg)$/,
use: [{
loader: 'url-loader',
options: {
limit: 1,
esModule: false,
outputPath: 'img/'
}
}]
},
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env'
]
}
},
include: path.resolve(__dirname, 'src'),
exclude: /node_modules/
},
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader'
]
},
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'less-loader',
'postcss-loader',
]
}
]
}
}