历时大半年,Github 团队成功减少 30kb 依赖体积

本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com

你没看错,Github前端团队花费大半年时间,成功将项目依赖包体积减少 30kb。

减少的部分是啥呢?jQuery

技术还是技术债

多年以来,Github逐渐发展为一家拥有数百名工程师的公司。

https://pic3.zhimg.com/v2-a8d7e8eceadb88774d497d47f978e292_b.jpg

作为一家大公司,一部分人被划分出来从事性能优化工作。

但是,狼多肉少,哪有那么多可优化点呢?

找新的性能优点难,找你老代码的麻烦还不容易?

于是,团队将目光盯向了 「技术债」

https://pic2.zhimg.com/v2-82d89251a0c4eb30ca20c790a4ef95b5_r.jpg

鲁迅曾说过,前人用过的技术,如果阻碍后人重复造轮子,就成技术债了。

https://pic3.zhimg.com/v2-7dcfa2935025777ad46d707b3fdce732_r.jpg

那么该挑哪个债来还呢?jQuery真是不二人选。原因如下:

  • 广泛依赖,这一改起来工作量绝对有了
  • jQuery代表老一代web开发方式。一下替换个新潮的,这对比,明显!
  • jQuery好说也有 30kb,苍蝇虽小也是肉

说干就干,让我们先评估下工作量。

https://pic2.zhimg.com/v2-e9f920c59afcbfe410cb32be09c79e99_b.jpg最高效的 React 源码进阶之路

工作量 max max max

新人这时候犯嘀咕:“这工作量,我估保守点,逐步替换,一周开发,一周测试,2 周上线?”

组长啪的一下拍桌子:“那得是 996 的小作坊才这么干!我们大公司做事得专业,这事儿得 「稳步迭代,增量解耦」 ”。

首选:我们得建立指标跟踪,统计每行代码中jQuery的调用次数。

实时监控,确保指标稳步下降。

https://pic2.zhimg.com/v2-d189ba6e1ec2132eb88f750cd1b7ba0d_r.jpg

其次,要有专人开发一个lint(见 eslint-plugin-jquery ),全团队普及,避免大家继续使用jQuery方法。

https://pic1.zhimg.com/v2-f94c3d80651998ce866ff1567b6be208_r.jpg

新人问:“那有人添加eslint-disable绕过规则怎么办?”

组长微微一笑,“小伙子,上道了啊。”

https://pic3.zhimg.com/v2-bb4174537e6221801c92c584b32de81a_b.jpg

还得开发一个Github机器人,每当有人提交的新代码中包含eslint-disable规则,机器人会通知团队成员,这样我们能尽快介入review代码。

最后,jQuery作为一个模块化的库,为了保证 「稳步移除」 ,我们需要维护一个自定义jQuery版本。

每当确定一个模块不再使用,就从自定义版本中移除他,并提供一个更小体积的版本。

比如:当完全用fetch替换$.ajax后,就能将AJAX模块剔除。

“这一通操作下来,没有半年工作量,我看不行。” 组长轻靠椅背,轻轻摇了摇头,说道。

https://pic1.zhimg.com/v2-333b03c73349010a88eef7e801180ae0_b.jpg

升华主题

你以为这就完啦?naive

前面做的,只能说稳步推进工作。接下来说的,才是KPI的重中之重。

jQuery被移除,项目必然出现很多原生JS

重复代码多了得抽象、得封装是吧?

“您是说上框架!Vue还是Angular?” 新人抢答道。

“小啦!格局小啦!” 组长长叹一口气。

https://pic1.zhimg.com/v2-9f11a5cdf7522804e343b8d4d66b1920_r.jpg

“当然是拥抱标准。Vue的模版语法也是根据 Web Components 标准演化来的。”

“我们要引!领!时!代!”

从现在开始,所有可复用的功能组件都封装为Web Components

比如 「复制粘贴」 功能,要封装为clipboard-copy

1
2
3
4
<clipboard-copy for="blob-path" class="btn btn-sm BtnGroup-item">
  点击复制
</clipboard-copy>
<div id="blob-path">src/index.js</div>

遵照HTML标准习惯,点击clipboard-copy组件后会将for属性指向的id选择器对应内容复制到剪贴板。

示例代码

具体实现

并且开启Shadow DOM,使组件对外封闭,不会影响其他组件。

你问兼容性?小啦!格局又小啦!

我们这样的企业就是要推动浏览器厂商进步的。

https://pic2.zhimg.com/v2-5f73577d7d10654fa4ba2b7fdc2fb6c9_r.jpg

最终产出了有 1.4k starWeb Components组件库 github-elements

后记

经过大半年的努力,Github团队成功将jQuery从项目依赖中根除,减少30kb依赖体积。

如果你审查Github页面代码,会时不时看到Web Component,比如:

https://pic4.zhimg.com/v2-b4d33829bbb2b562f084be88b1cb16d7_r.jpg

大公司的工作方法论,你学废了么?

最高效的 React 源码进阶之路