Chrome團隊:如何曲線拯救KPI

blank

Chrome團隊:如何曲線拯救KPI

大家好,我是卡頌。

當聊到 Chrome ,你第一反應是啥?

市佔率第一的瀏覽器? 鼎鼎大名的 V8 引擎? 瀏覽器除錯的標配—— DevTools

對於 Chrome 團隊成員來說,第一反應很可能是這兩個指標(KPI):

  • UX(user experience)用戶體驗
  • DX(developer experience)開發者體驗

作為開發者,相信你能感受到諸多圍繞這兩個指標的改進:

  • 底層 V8webassembly 引擎的反覆運算
  • lighthouse工具對 UXDX 指標的定量分析
  • ChromeES 標準新特性的快速支援

當一切都做到極致后,圍繞這兩個指標還有什麼可挖掘的呢( KPI 能寫啥呢)?

讓我們一起看看 Chrome 團隊為了更好的 web 體驗,做了哪些曲線救國的努力。

邏輯要順

這裡的邏輯是這樣的:

  1. 當今世界大部分 web 項目依賴開源工具
  2. 更好的開源工具帶來更好的 web 體驗

按照這個邏輯,只要我們( Chrome 團隊)與開源專案合作,讓他們變得更好,那就是為更好的 web 體驗做貢獻(也就能拯救 KPI 了)。

所以,只需要挑選合適的專案,根據其適合的優化類型( UXDX ),展開深度合作就行。

接下來,讓我們看看一些與 Chrome 團隊合作的專案。

與Next.js合作

Next.js作為基於 React 的全功能生產可用框架,其 SSR 功能一直與 React 團隊深度合作。

Chrome團隊基於 SSR 這一場景,為 Next.js 定製了一系列 Timing API

Timing APISSR 相關指標納入統計(比如 hydrate 時間)。

blank

同時, LightHouse 工具可以收集更多 SSR 相關資料供參考:

blank

與Babel合作

我們常用 @babel/preset-env 根據目標瀏覽器版本將高級 ES 語法編譯為 ES5 語法。

這種降級編譯的實現思路為:每個高級語法可以看作一或多個語法轉換的集合。

在遇到高級語法時,將其替換為這些語法轉換的實現。

舉個例子: 函数参数 可以作為 解构 、 、 参数默认值 剩余参数 這3個特性的集合。 對於如下原始碼:

const foo = ({ a = 1 }, b = 2, ...args) => [a,b,args];

經過 @babel/preset-env 編譯后的輸出包含了 解构 、 、 参数默认值 剩余参数 這3個特性的實現:

const foo = function foo(_ref, b) {
 let { a = 1 } = _ref;

 if (b === void 0) { b = 2; }

 for (
   var _len = arguments.length,
     args = new Array(_len > 2 ? _len - 2 : 0),
     _key = 2;  _key < _len; _key++
 ) {
   args[_key - 2] = arguments[_key];
 }

 return [a, b, args];
};

可以看到,編譯后總體代碼量激增!

某些高級語法,現代瀏覽器可能或多或少已經支援了,只是支援度不好。

所以,一個更好的思路是:

將不支援的語法替換為已支援的語法

這樣就能省去「特性實現」這部分代碼。

對於以上例子中的語法,只有一款現代瀏覽器由於自身 bug 導致不支援。

解決辦法是:將 { a = 1 } 取代為 { a: a = 1 }

所以,以上代碼只需編譯為如下形式在現代瀏覽器都能運行:

const foo = ({ a: a = 1 }, b = 2, ...args) => [a,b,args];

對比兩種編譯結果,後者較前者代碼量減少80%!

blank

這種瀏覽器間差異帶來的優化空間, Babel 團隊很難獨自完成。

所以, Chrome 團隊與其合作開發了 @babel/preset-modules ,並且已經作為 bugfixes 參數集成到 @babel/preset-env 中。

與React合作

作為前端領域運行時最重的視圖庫, React 一直在尋找運行時的優化空間。

navigator.scheduling.isInputPending API就是其與 Chrome 團隊合作的產物。

API 傳回函式,呼叫該函數後如果目前有 input 事件正在調度,則傳回 true

比如如下例子,當有滑鼠、鍵盤事件在調度時,暫停 JS 線程執行:

while (workQueue.length > 0) {
  if (navigator.scheduling.isInputPending(['mousedown', 'mouseup', 'keydown', 'keyup'])) {
    break;
  }
  let job = workQueue.shift();
  job.execute();
}

輸入框的輸入能夠更快被瀏覽器渲染,顯著減少瀏覽器調幀(表現為輸入框輸入內容卡頓)。

總結

樹挪死,人挪活。

當項目發展到一定時期,沒有多少內部可優化空間時,需要主動出擊, 赋能 其他 垂直领域 ,聚焦 用户感知赛道 ,採用 复用打法 達成 持久收益

說人話就是:多去其他團隊蹭蹭, KPI 會有的。

你,學會了么?

想了解更多關於 Facebook 與 Google 廣告投放?

What do you think?

Written by marketer

blank

什麼是Google Lighthouse?

使用 Lighthouse 分析前端性能