webpack构建速度和体积优化策略

一. 都有哪些策略?

  1. Scope Hoisting
  2. Tree-sharking
  3. 公共资源分离
  4. 图片压缩
  5. 动态Polyfill

二. 具体是什么,有哪些细节?

1. 初级分析:使用webpack内置的stats(构建的统计信息)

2. 速度分析:使用spees-measure-webpack-plugin

用法如下:

const SpeedMeasureWebpackPlugin = require(‘speed-measure-webpack-plugin’);
const smp = new SpeedMeasureWebpackPlugin();
const webpackConfig = smp.wrap({
    plugins: [
        new Myplugin(),
        new MyOtherPugin()
    ]
})

可以看到每个loader和插件执行耗时
为什么要用速度分析插件?

  1. 为了分析整个打包耗时
  2. 分析每个插件和loader的耗时情况

3. 体积分析:使用web pack-bundle-analyzer

代码示例:

const BundleAnalyzerPlugin = require(“webpack-bundle-analyzer”)
  .BundleAnalyzerPlugin;

module.exports = {
  plugins: [new BundleAnalyzerPlugin()()]
};

可以分析哪些问题?

  1. 依赖的第三方模块文件大小
  2. 业务里面的组件代码大小

4. 使用更高版本的webapck和node.js

webpack4相比较webpack3构建时间降低了60%-80%;

webpack4做了哪些优化?
  1. V8带来的优化(for of 替代forEach 、 Map和Set替代 Object,includes替代indexOf)
  2. 默认使用更快算法的md4 hash算法
  3. webpack AST可以直接从loader传递给AST,减少解析时间
  4. 使用字符串方法替代正则表达式。

5. 多进程/多实例构建

  1. 使用HappyHack解析资源
  2. 使用 thread-loader解析资源
  3. 并行压缩

6. 分包

  1. 设置Externals
  2. 预编译资源模块

7.缓存

目的:提升二次构建速度
缓存思路:

  1. babel-loader开启缓存
  2. Terser-webpack-plugin开启缓存
  3. cahcher-loader或者hard-source-webpack-plugin

8.缩小构建目标

目的:尽可能的少构建模块

  1. 比如babel-loader不解析node_modules
module.exports = {
    rules: [
        test: /\.js$/,
        loader: ‘happypack/loader’,
        // 不解析node_modules
        exclude: ‘node_modules’
    ]
}
  1. 减少文件搜索范围
module.exports = {
    resolve: {
        alias: {
          ‘react’: path.resolve(__dirname, ‘./node_modules/react/umd/react.production.min.js’),
        // 减少模块搜索层级
        modules: [path.resolve(__dirname, 'node_modules')],
        extensions: ['.js'],
        mainFields: ['main']
    }
}

9. 使用Tree Shaking擦除无用的js和css

什么是tree shaking?

1个模块可能有多个方法,只要其中的某个方法使用到了,则整个文件都会被打到bundle里面,tree shaking 就是只把用到的方法打入bundle,没用到的方法在uglify阶段擦除掉。(也就是按需打包使用到的方法)

无用的css如何删除?

  1. PurifyCss: 遍历代码,识别已经用到的css class
  2. uincss : html需要通过jsdom加载,所有的样式通过PostCSS解析,通过document.querySelector来识别在html文件里面不存在的选择器

10. 图片压缩

使用imagemin或者tinypng API,通过配置image-webpack-loader即可。

{
        test: /.(png|jpg|gif|jpeg)$/,
        use: [
          {
            loader: “file-loader”,
            options: {
              name: “[name]_[hash:8].[ext]”
            }
          },
          {
            loader: “image-webpack-loader”,
            options: {
              mozjpeg: {
                progressive: true,
                quality: 65
              },
              // optipng.enabled: false will disable optipng
              optipng: {
                enabled: false
              },
              pngquant: {
                quality: "65-90",
                speed: 4
              },
              gifsicle: {
                interlaced: false
              },
              // the webp option will enable WEBP
              webp: {
                quality: 75
              }
            }
          }
        ]
      }

imagemin的优点:

  1. 有很多定制选项
  2. 可以引入更多的第三方优化插件
  3. 可以处理多种图片格式

imagemin的压缩原理

  1. pngquant:是一款PNG压缩器,通过将图像转换为具有alpha通道(通常比24/32位PNG文件小60%-80%) 的更高效的8位PNG格式,可显著减小文件大小。
  2. Pngcrush: 其主要目的是通过尝试不同的压缩级别和PNG过滤方法来降低PNG IDAT数据流的大小。
  3. optipng: 其设计灵感来自于pngcrush.optinpng可将图像文件重新压缩为更小尺寸,而不会丢失任何信息。
  4. tinypng: 将24位PNG文件转换为更小有索引的8位图片,同时所有非必要的metadata也会被剥离

11. 使用动态Polyfill服务:Polyfill Service

Polyfill Service原理:识别不同的user agent,下发不同的Polyfill

如何使用?

  1. polyfill.io官方提供服务,网址如下:https://polyfill.io/v3/polyfill.min.js
  2. 基于官方自建polyfill服务:(网址换成自己的网址即可)

三:这一章跟你有什么关系?

这一章是webpack的进阶用法,提出了在拥有基本webpack配置的情况下如何更优秀。是高级前端用的到工程化优化方案。
通过学习这一章,我意识到webapck社区也是真的强,现在场景下的需求基本都有对应的loader和插件可供使用。
前端工程化,webpack值得好好深入学习。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 我要将感伤无限放大!
    自乱阵脚阅读 151评论 0 0
  • 开始决定要写东西了,写些什么不知道,总之就是要写。 在半年前开始断断续续的看书、也有了写心得总结的念头,但也只是念...
    奇峰丹色阅读 426评论 5 9
  • 作者:高晓松 2001年1月30日,杰出的华人女性赵小兰出任美国政府劳工部长,成为美国首任华人女部长。首先,在美国...
    左右文摘阅读 278评论 0 0
  • 希望有一天能不在这样 一点真实的交流都没有 希望有一天能不在这样 挑问题就最在行 希望有一天能不在这样 一言不合就...
    蓝色与白色阅读 183评论 0 0
  • 在英语中“First snow(初雪)”既可以是专有名词,也可以是普通名词。2016年11月21日,北京,郑州迎来...
    简孟龙阅读 200评论 2 1