frontendmasters Web Performance with Webpack

Web Performance with Webpack

Top Performance Issues

  • 应用程序加载需要多长时间?还是交互有多快?
  • 初始下载时必须下载的 Javascript 数量、以同样的方式获得 CSS 的数量、所发送的并发网络请求数量。

Performance Goals

  • JS 200KB 以内
  • CSS 100KB 以内
  • HTTP2 的使用
  • 代码的覆盖范围

Code Coverage

  • chrome 调试面板 Shift + Cmd + P
  • 首屏体验并不需要那么多代码

Code Splitting

  • Google Web Toolkit 先驱
  • webpack 零配置代码分割,将在构建步骤中创建这些惰性包。
  • 在构建时,单独的 JavaScript 块只会异步加载。

Types of Code Splitting

  • 动态 import 语法,浏览器还在提案中,但 webpack 已经实现
  • 动态和静态代码拆分
  • webpack 中没有任何内容纯粹是动态的。不同的只是构建时间。
  • 懒加载才是正确的路子

Code Splitting Demonstration

  • 代码拆分过程实际上是调用该模块并将其加载到此处
  • webpack 在你使用动态 import 会返回一个 promise

Webpack Code Splitting Under the Hood

  • 首先有一个 webpackJsonpCallback 函数,拿到一些数据,这些数据将是一个数组。而且它将通过我们称之为 chunkIds,或者是模块。
  • 之后有一个模块缓存和一个 chunk 缓存,它会为已安装的块设置初始 ID。
  • __webpack_require__.e 实现了懒加载转换,实际设置了一个 JSONP 请求去请求 chunk,可能是一个数组,所以需要 Promise.all
  • 有一个名为 webpackJsonp 的单个全局变量,默认为数组,它是块缓存的实际注册其他块的地方。
  • 因此,每当我们进行懒加载时,我们只是访问已经异步分离为单独文件的模块。

Load a Heavy Module Asynchronously

  • 对重型库使用 eval 作为源映射,它实际上被分离到每个单独的文件中。
  • 减少初始代码加载量

Code Splitting in Vue, React, & Frameworks

  • vue 一行代码就实现
  • react react-loadable
  • Angular 组件级别坑爹,路由级别还行
  • Preact 提了一嘴

Code Splitting Named Exports

  • 命名或默认导出失去了 tree-shaking 异步 bundle 的能力
  • 例子中从 lodash 访问一个函数,直接从路径中去访问

Vendor Bundles are an Anti Pattern

  • webpack4 抛弃 commonChunk 的原因,也是认为这是反模式
  • vendor 会增加解析 js 代码的成本
  • 异步 bundle 也许是个更好的解决办法

Dynamic Code Splitting

  • 将一个变量赋给一个返回动态导入的函数,从而动态加载某些东西,这就是动态代码拆分
  • 但肖恩的态度是避免这种方式:ContextModule 决定了这些模块仍然是静态的。
  • 所以 webpack 会发出一个警告,当你尝试只使用一个变量时它就不会起作用。

Dynamic Code Splitting Walkthrough

  • 写了一个例子 0501 分支
  • 实际上并不需要任何其他延迟加载的块
  • 使用这种动态代码拆分的关键是你必须传递部分路径等信息才能知道

Introducing Magic Comments

  • 它专门用于动态导入语句,在动态导入的模块路径之前添加注释
  • 当我们使用代码拆分作为一种技术时,添加 bundle 包时没有创建名称,所以注意可以命名或标记其中一个懒加载的 bundle
const getFooter = () => import(/* webpackChunkName: "footer" */ "./footer");

Webpack Modes

  • 使用 webpackMode 来控制代码拆分的发生方式,默认是 lazy
  • lazy-once 在开发模式下可以提高构建速度
const setButtonStyle = (color) => import(/* webpackMode: "lazy-once" */`./button-styles/${color}.js`);
  • 使用 DefinePlugin 区分环境,webpack 会为此变量注入一个宏替换。

Webpack Prefetch & Preload

  • 4.8 增加的功能
  • Webpack 借鉴了浏览器的 preload 和 perfetch
  • 对于每个需要延迟加载的块,我们将创建一个 link 元素,然后加上 preload 属性。添加到 script 里去。
const getLodash = () => import(/* webpackPreload: true */"lodash-es");
  • 基本上删除了等待网络的所有成本

Wrapping Up Code Splitting

  • 做一个组件库时允许用户使用动态导入来加载所需的部分,最好能动态导入

Webpack Config Organization

webpack 配置碎片化

Building Your Library with Webpack

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

推荐阅读更多精彩内容