玩转webpack高级特性应对项目优化需求

Tree Shaking清除未引用代码(dead-code)

webpack生产模式打包的优化过程中,自动开启tree shaking,检测未引用代码,然后清除

在mode为development、none时,需要配置optimization

module.exports = {
  // ... 其他配置项
  optimization: {
    // 模块只导出被使用的成员
    usedExports: true,
    // 尽可能合并每一个模块到一个函数中
    concatenateModules: true,
    // 开启压缩代码功能 压缩输出结果
    minimize: true
  }
}

tree-shaking实现 过程用到webpack的两个优化功能

  • usedExports-打包结果只导出外部用到的成员

  • minimize-压缩打包结果例子

sideEffects副作用

用于标识代码是否有副作用,从而提供更大的压缩空间

模块副作用指的是模块执行的时候除了导出成员,是否还做了其他事情

Code Splitting分块打包

webpack实现前端模块化优势固然明显,但也存在弊端:最终会将包打包到一起 All In One的方式导致包过大

合理方案:code Splitting将打包结果按照一定规则分离到每个bundle中,按需加载 降低应用的启动成本,提高响应速度

webpack实现分包的方式

  1. 根据业务配置多个打包入口,输出多个打包结果

  2. 结合ES Modules`动态导入,按需加载模块

多入口打包

多入口打包适用于多页应用,一个页面对应一个打包入口,对于不同页面公用的部分 提取到公共的结果中
例子

动态导入

按需加载:应用运行过程中,需要哪个模块资源,才去加载

webpack支持使用动态导入的方式实现模块按需加载,而且所有导入的模块都会被提取到单独的bundle从而实现分包
例子

优化webpack构建速度和打包结果

为了开发阶段更好的体验,打包结果会越来越臃肿,因为webpack为实现这些特性 自动往打包结果中添加一些内容

不同环境配置

webpack创建不同环境配置的方式:

  • 配置文件中添加相应的判断条件例子

  • 为不同环境单独添加一个配置文件例子

判断环境名返回不同配置对象,适用中小型项目,项目复杂,配置也会变得复杂

├── webpack.common.js ···························· 公共配置
├── webpack.dev.js ······························· 开发模式配置
└── webpack.prod.js ······························ 生产模式配置
生产环境下的优化插件

webpack4的production模式,内部已开启很多通用的优化功能

几个主要优化功能:

Define Pluginn

用来为代码中注入全局成员 production模式下,默认通过DefinePlugin往代码中注入proces.env.NODE_ENV变量

很多第三方模块通过这个变量去判断运行环境例子

Mini CSS Extract Plugin

css文件打包,一般使用style-loader处理,最终打包结果是CSS代码嵌入到JS代码中

mini-css-extract-plugin可以将CSS代码从打包结果中提取出来

需要使用插件提供的loader替换掉style-loader,以此来获取所有样式

打包之后,样式存入独立的文件中,通过link标签引入页面

Optimize CSS Assets Webpack Plugin

生产模式会自动压缩js代码,但是通过mini-css-extract-plugin打包的css文件不会自动压缩

此插件不是配置在plugins中 而是添加到optimization对象中的minimizer属性

原因:配置在plugins中 插件在任何情况下都会工作,配置在minimizer中只会在minimizer特性开启会工作

这样配置会导致js文件不会被压缩

原因:设置了minimizer使用自定义压缩器插件,内部的js压缩器(terser-webpack-plugin)会被覆盖,需手动添加回来

[例子](

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

推荐阅读更多精彩内容