測量 Service Worker 中的效能

除了 Jake Archibald 擔心開發人員的技能循環波動不正常,他做出了強大的客服案件,只要聰明地運用 Service Worker,就能大幅改善網站或應用程式的效能。歡迎觀看影片來瞭解總覽。

如果您希望依照 Jake 的建議,大幅縮短網頁載入時間,就必須瞭解服務工作處理程序對網頁要求的影響。

資源操作時間User Timing API 是許多網站 RUM (即時監控) 基礎架構中的重要元件,可讓您全面瞭解所有使用者看到網站的效能 (另一個用途是偵測內容插入情形)。簡而言之,除非您有 Service Worker 或 Web Worker,否則透過網站發出的每個網路要求,幾乎所有面向都能讓您瞭解。

以下的簡短範例說明如何使用它,以取得非目前網域的所有要求清單。

var getThirdPartyRequests = function() {
    var thirdPartyRequests = [];
    var requests = window.performance.getEntriesByType("resource");
    
    var currentHost = window.location.host

    for(var requestIdx = 0; requestIdx < requests.length; requestIdx++) {
    var request = requests[requestIdx];
    var url = new URL(request.name);
    var host = url.host;

    if(host != currentHost) {
        thirdPartyRequests.push(request);
    }
    }
    
    return thirdPartyRequests;
};

「Resource Timing」和「User Timing」API 才是工程師在客服工作人員發生小小變化之前就建立和實作,而上述程式碼無法瞭解服務工作處理程序對 API 的影響。

Chrome 45 (在 2015 年 7 月推出 Beta 版) 最近將協助您向所有工作人員 (網路與 Service Worker) 開放存取 Resource Timing API 和 User Timing API, 讓您隨時掌握所有使用者的網路效能。

從 Service Worker 存取效能指標

最大的變化是將 performance 物件加入工作站結構定義 (Web 和 ServiceWorker) 中,讓您瞭解在 worker 中提出的所有要求的效能時間,還能讓您自行設定 JS 執行作業的測量標記。如果只能掌握目前視窗內容發生的情況,就會錯過下列重要時機資訊:

  • 在 Service Worker 的 oninstall 事件中發出的 fetch() 要求
  • 現在可以追蹤在 onpush 事件中快取資料時提出的 fetch() 要求,藉此瞭解使用者看到的效能。
  • 最後,onfetch 處理常式發出及攔截的 fetch() 要求。

最後一個重點很重要。可以將 Service Worker 視為網路 UI 和網路之間的 Proxywindow 上的 performance 物件只能看到自身叫用要求中的時間與資訊,但無法瞭解在用戶端和網路之間運作的 Service Worker,因此無法瞭解 Service Worker 的影響。

如何使用此功能?

如果是先支援離線功能的一般服務工作人員,則安裝步驟會下載並儲存所有資產供日後使用

這個做法的一個例子,是記錄並記錄安裝步驟的時間資料,以便根據真實的使用者使用情形,判斷如何改善安裝效能。

self.addEventListener("install", function() {
    var urls = [
    '/',
    '/images/chrome-touch-icon-192x192.png',
    '/images/ic_add_24px.svg',
    '/images/side-nav-bg@2x.jpg',
    '/images/superfail.svg',
    '/scripts/voicememo-core.js',
    '/styles/voicememo-core.css',
    '/third_party/Recorderjs/recorder.js',
    '/third_party/Recorderjs/recorderWorker.js',
    '/third_party/Recorderjs/wavepcm.js',
    '/third_party/moment.min.js',
    '/favicon.ico',
    '/manifest.json'
    ];

    urls = urls.map(function(url) {
    return new Request(url, {credentials: 'include'});
    });

    event.waitUntil(
    caches
        .open(CACHE_NAME + '-v' + CACHE_VERSION)
        .then(function(cache) {
        // Fetch all the URL's and store in the cache
        return cache.addAll(urls);
        })
        .then(function () {
        // Analyze all the requests
        var requests = self.performance.getEntriesByType("resource");
        
        // Loop across all the requests and save the timing data.
        return;
        })
    );
});

目前許多網站會使用 RUM,瞭解使用者如何瀏覽網站。Google Analytics (分析) 等工具已經使用 NavigationTiming API 回報網站速度資料,但需要更新,才能納入工作站內容的效能分析結果。

Navigation Timing API 會傳送至 Service Worker

目前還沒有計劃將 Navigation Timing API 加到 Service Worker 中,因為 Service Worker 中沒有傳統導覽功能。有趣的是,對服務工作處理程序來說,在 Service Worker 受控管的一組網頁中,每個導覽都看起來像是資源擷取。如此一來,服務工作人員就能非常有吸引力,集中管理網頁應用程式中的大部分效能邏輯。

我可以查看變更的內容嗎?

我有興趣參與討論與規格