当前市面上大部分前端应用都是基于webpack进行构建,而随着应用日益庞大,webpack应用就会出现构建速度慢,构建结果体积大等一系列问题。javascript
随着应用的不断迭代,webpack应用最多见的两个问题就是:css
有一个很简单的划分方式,就是以构建(build)为分界线,分红前向治理和后向治理:前端
咱们的治理方向,就是围绕前向治理和后向治理。java
前向治理的核心概念,就是一个字 快
,目的就是提高构建速度,市面上大部分webpack优化文章都是这一类提高构建速度的文章,因此这里就简单介绍一些不错的实践webpack
数据先行,经过speed-measure-webpack-plugin采集性能指标,能够获得webpack在整个编译过程当中在loader、plugin上花费的时间,基于该数据能够专项的进行优化和治理。git
若是经过SMP分析得知在loader编译过程耗时较多,那么能够在核心loader,例如babel-loader中添加缓存。github
{
loader: 'babel-loader',
options: {
cacheDirectory: true
}
}
复制代码
若是经过SMP分析得知在loader编译过程耗时较多,还能够经过使用happyPack,开启多线程编译,提高开发效率。web
dll能够简单理解成提早打包,例如lodash、echarts等大型npm包,能够经过dll将其提早打包好,这样在业务开发过程当中就不用再重复去打包了,能够大幅缩减打包时间。npm
webpack5利用 持久缓存
来提升构建性能,或许升级webpack后,前述的各类优化,都将成为历史。json
后向治理主要保证构建结果的质量
很常见的就是webpack-bundle-analyzeer,提供打包结果的可视化展现,如上图给予的决策帮助是:
业务开发过程当中,随着业务迭代,常常有些文件、模块及代码被废弃,这些废弃代码随着时间推移,将逐渐变为历史包袱,因此针对构建后结果,咱们要作的就是清理其中的deadcode。
前面webpack-bundle-analyzeer虽然是最经常使用的插件,但依旧有一些缺陷:
tree-sharking你们都了解,摇掉不须要的代码,作为最终的输出结果,但反过来讲,这些废弃代码依旧在本地真实不虚的存在着。
因此如何能准确的清理掉deadcode呢?这就须要经过webpack的 统计信息(stats)
来进行更细节的分析
stats是经过 webpack 编译源文件时,生成的包含有关于模块的统计数据的 JSON 文件,这些统计数据不只能够帮助开发者来分析应用的依赖图表,还能够优化编译的速度。
webpack --profile --json > compilation-stats.json
复制代码
经过上述全局命令便可输出统计信息,例如:
{
"version": "1.4.13", // Version of webpack used for the compilation
"hash": "11593e3b3ac85436984a", // Compilation specific hash
"time": 2469, // Compilation time in milliseconds
"filteredModules": 0, // A count of excluded modules when `exclude` is passed to the `toJson` method
"assetsByChunkName": {
// Chunk name to emitted asset(s) mapping
"main": "web.js?h=11593e3b3ac85436984a",
"named-chunk": "named-chunk.web.js",
"other-chunk": [
"other-chunk.js",
"other-chunk.css"
]
},
"assets": [
// A list of asset objects
],
"chunks": [
// A list of chunk objects
],
"modules": [
// A list of module objects
],
"errors": [
// A list of error strings
],
"warnings": [
// A list of warning strings
]
}
复制代码
经过对modules和chunks加以分析,就能够获得webpack完整的依赖关系,从而梳理出废弃文件及废弃代码,同时也能够根据业务形态进行定制。
前面提到分析stats.json,但由于是原始数据,数据量比较大,有必定处理和清洗成本,因此可使用开源的webpack-deadcode-plugin这个插件
lint能够快速的扫描出未使用的变量,这可以极大的提高咱们的deadcode清理效率。
顿时整个应用干干净净,舒舒服服!