效果
生产环境下:所有文件按照后缀名放在对应的文件夹下。
开始
- 安装
webpack-merge
npm install --save-dev webpack-merge
- 根目录下新建3个webpack的配置文件
webpack.common.js
注意:这里需要安装
url-loader
和file-loader
两个开发依赖。否则会报错。
npm install --save-dev url-loader
npm install --save-dev file-loader
开发依赖包如下:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
app: './src/index.js',
},
plugins: [
new HtmlWebpackPlugin({
title: 'Production',
template: './index.html',
}),
],
module: {
rules: [
{
test: /\.css$/i,
use: ['style-loader', 'css-loader'],
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/i,
include: [path.resolve('src')], // 在src下查找
loader: 'url-loader',
options: {
limit: 10000,
name: 'img/[name].[hash:7].[ext]'
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i,
include: [path.resolve('src')],
loader: 'url-loader',
options: {
limit: 10000,
name: 'media/[name].[hash:7].[ext]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,
include: [path.resolve('src')],
type: 'asset/resource',
generator: {
filename: 'fonts/[name].[hash:7].[ext]'
},
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
}
]
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
},
optimization: {
runtimeChunk: 'single', // 单入口
},
performance: {
hints: false // 不警告
}
};
webpack.prod.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CompressionWebpackPlugin = require("compression-webpack-plugin");
const productionGzipExtensions = ["js", "css"];
module.exports = merge(common, {
mode: 'production',
output: {
publicPath: '/webpackDemo/', // 这个是http服务器运行的根路径(比如我们线上是www.baidu.com/indexbeta这个作为根路径,就需要将它改为'/indexbeta/')
filename: 'js/[name].[chunkhash].js', // 将js以[原文件名].[哈希值].js命名,并放在js文件夹下
chunkFilename: 'js/[id].[chunkhash].js' // 打包入口文件名[id].[哈希值].js命名,并放在js文件夹下
},
plugins: [
new CopyWebpackPlugin({
// 复制文件夹插件
patterns: [
{
from: path.resolve(__dirname, './static'),
to: 'static',
}
]
}),
new CompressionWebpackPlugin({
// 开启压缩插件
filename: "[path][base].gz",
algorithm: "gzip",
test: new RegExp("\\.(" + productionGzipExtensions.join("|") + ")$"), // 匹配文件名
threshold: 10240, // 对10K以上的数据进行压缩
minRatio: 0.8,
deleteOriginalAssets: false // 是否删除源文件
})
]
});
webpack.dev.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
module.exports = merge(common, {
mode: 'development',
devtool: 'inline-source-map',
devServer: {
host: 'localhost',
port: 9917,
static: './dist',
},
});
- 启动命令设置