本文详细解析Webpack打包后文件体积过大的常见原因及解决方案。通过配置生产环境、关闭SourceMap、提取CSS、压缩JS代码、分离公共依赖以及启用Gzip和HTML压缩等策略,有效减小最终输出文件的大小,提升前端应用加载速度。
Webpack打包体积优化概述
此前一直采用 create-react-app 脚手架进行 React 开发,后因需自定义配置,转而使用 webpack 构建独立脚手架。然而在使用 webpack 进行打包后,发现输出文件体积异常庞大。为此,深入研究并记录了处理 webpack 打包后文件过大的相关方法。
配置生产环境与SourceMap优化
首先进行全局变量配置。
通过指定环境变量,告知 webpack 当前处于 production 环境,并依据生产环境的规范进行打包处理。
//指定环境,将process.env.NODE_ENV环境与library关联
new Webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production'),
}),
优化 devtool 中的 source-map 配置。
devtool 提供了多种选项以增强调试能力,常见的包括 source-map、inline-source-map、cheap-source-map 等。具体用法可参考 Devtool 官方文档、Devtool 配置对比以及 webpack sourcemap 选项解释(https://webpack.github.io/docs/configuration.html#devtool)。若打包后文件体积突然增至数 MB,通常是因为 source-map 所致。虽然 source-map 在开发阶段便于调试,但在生产环境中无需部署,建议在 prod 环境下关闭 source-map。
CSS文件剥离与单独打包
剥离 CSS 文件并单独打包。
安装 webpack 插件 extract-text-webpack-plugin。执行命令:npm install extract-text-webpack-plugin --save-dev。具体使用方法见下文。
plugins:[
new ExtractTextPlugin('static/css/styles.[contenthash].css'),
]
此处使用了 contenthash,webpack 将根据文件内容生成对应的 hash 值。
JS代码压缩与公共依赖提取
使用 UglifyJSPlugin 进行压缩。
通过 UglifyJSPlugin 可压缩 *.js 文件。安装命令为:npm install uglifyjs-webpack-plugin --save-dev。详细用法请参考 UglifyJSPlugin 文档。
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
module.exports = {
plugins: [
new UglifyJSPlugin({
parallel: 4,
uglifyOptions: {
output: {
comments: false,
beautify: false,
},
compress: {
warnings: false
},
},
cache: true,
}),
]
}
提取公共依赖代码。
使用 CommonsChunkPlugin 插件,将多个 js 文件中的公共部分提取出来,生成一个独立文件。该文件包含共用模块,浏览器仅在初始加载时获取一次,随后缓存供后续使用,避免每次访问新界面时重复加载更大的文件。
entry:{
app:'./entry',
vendor:['react','other-lib'],
},
plugins:[
new Webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
}),
]
启用Gzip压缩与HTML优化
开启 gzip 压缩。
使用 compression-webpack-plugin 插件进行压缩。安装命令:npm install compression-webpack-plugin --save-dev。详细用法见 compression-webpack-plugin 文档。具体使用方式如下。
const CompressionPlugin = require("compression-webpack-plugin");
plugins:[
new CompressionPlugin({
asset: '[path].gz[query]', //目标资源名称。[file] 会被替换成原资源。[path] 会被替换成原资源路径,[query] 替换成原查询字符串
algorithm: 'gzip',//算法
test: new RegExp(
'\\.(js|css)$' //压缩 js 与 css
),
threshold: 10240,//只处理比这个值大的资源。按字节计算
minRatio: 0.8//只有压缩率比这个值小的资源才会被处理
})
]
压缩后的结果如图所示。


开启 HTML 压缩,并自动添加上述生成的静态资源。
添加插件 html-webpack-plugin。
安装命令: npm install html-webpack-plugin --save-dev 。具体用法如下。
plugins:[
new HtmlWebpackPlugin({
title: '',
template: __dirname + '/../public/index.html',
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
chunksSortMode:'dependency'
}),
]
以上为本文全部内容,希望对各位的学习有所帮助,也欢迎大家多多支持本站。