最後一個單元提供了網路工作站總覽。網路工作者可以 只要將主執行緒的 JavaScript 移除, 不同的網路工作執行緒執行緒,有助於改善您網站的互動性 。 主執行緒。然而,僅提供總覽並不足夠 在本單元中 並提供網路工作者的具體使用案例。
其中一個用途可能是網站必須從 圖像,這個概念並非個廣為人知的概念。事實上,Flickr 等網站 使用者 可以查看 EXIF 中繼資料,瞭解 其代管的圖像,例如色彩深度、相機廠牌和型號等 資料。
不過,擷取圖片並轉換為 ArrayBuffer
的邏輯。
並擷取 EXIF 中繼資料可能會耗用大量資源
透過主執行緒呼叫幸好,網路工作站範圍允許這項工作
主執行緒的關閉。接著,透過網路工作站的訊息管道
EXIF 中繼資料會以 HTML 字串的形式傳回至主執行緒,且
向使用者顯示
沒有網路工作站的主執行緒外觀
首先,請觀察主執行緒在沒有 網路工作站。如要這樣做,請按照下列步驟操作:
- 在 Chrome 中開啟新分頁,然後開啟開發人員工具。
- 開啟效能面板。
- 前往 https://exif-worker.glitch.me/without-worker.html。
- 在效能面板中,按一下右上角的「Record」 「開發人員工具」窗格
- 貼上這個圖片連結,或選擇其他包含 Exif 的其中一個圖片連結 中繼資料—然後在欄位中按一下「Get the JPEG!」按鈕。
- 介面填入 EXIF 中繼資料後,請再次點選「Record」, 停止錄製。
請注意,除了可能出現的其他執行緒,例如光柵化器 執行緒等等,應用程式的所有內容都在主執行緒上。主要透過 執行緒後,會發生以下情況:
- 表單會接收輸入內容,並調度
fetch
要求來取得初始資訊 部分包含 Exif 中繼資料的圖片部分 - 圖片資料會轉換為
ArrayBuffer
。 exif-reader
指令碼可用來從 圖片。- 中繼資料會被剪輯以建構 HTML 字串,並填入 中繼資料檢視者
差別在於前者的實作行為相同,但前者需要 工人!
網路工作站的「主執行緒」外觀
現在您已瞭解從 主執行緒上的 JPEG 檔案,先看一遍 下列工作站中的
- 在 Chrome 中開啟另一個分頁,然後開啟開發人員工具。
- 開啟效能面板。
- 前往 https://exif-worker.glitch.me/with-worker.html。
- 在效能面板中,按一下右上角的記錄按鈕 「DevTools」窗格的角落。
- 將這個圖片連結貼到欄位中,然後按一下「Get the JPEG!」按鈕。
- 介面填入 Exif 中繼資料後,點選記錄按鈕 即可停止錄製。
這正是網路工作人員的強大力量。與其在主執行緒上進行「所有細節」 然而,以 HTML 填入中繼資料檢視器中的所有資訊都是在 個別執行緒。也就是說,主執行緒可以釋出給主執行緒,以便執行其他作業。
最大的優勢可能是這個應用程式
未使用網路工作站,因此主節點並未載入 exif-reader
指令碼
而不是網路背景工作執行緒也就是說
下載、剖析及編譯 exif-reader
指令碼後,
主執行緒。
現在,讓我們來探討網路工作程式程式碼如何實現上述所有目標!
查看網路工作站程式碼
光是看網路工作人員帶來的差異是不夠的 至少在這個例子中,也就是程式碼看起來會是什麼樣子 定義或部署 Pod
從網路工作站可以先執行的主要執行緒程式碼開始 輸入圖片:
// scripts.js
// Register the Exif reader web worker:
const exifWorker = new Worker('/js/with-worker/exif-worker.js');
// We have to send image requests through this proxy due to CORS limitations:
const imageFetchPrefix = 'https://res.cloudinary.com/demo/image/fetch/';
// Necessary elements we need to select:
const imageFetchPanel = document.getElementById('image-fetch');
const imageExifDataPanel = document.getElementById('image-exif-data');
const exifDataPanel = document.getElementById('exif-data');
const imageInput = document.getElementById('image-url');
// What to do when the form is submitted.
document.getElementById('image-form').addEventListener('submit', event => {
// Don't let the form submit by default:
event.preventDefault();
// Send the image URL to the web worker on submit:
exifWorker.postMessage(`${imageFetchPrefix}${imageInput.value}`);
});
// This listens for the Exif metadata to come back from the web worker:
exifWorker.addEventListener('message', ({ data }) => {
// This populates the Exif metadata viewer:
exifDataPanel.innerHTML = data.message;
imageFetchPanel.style.display = 'none';
imageExifDataPanel.style.display = 'block';
});
這段程式碼會在主執行緒上執行,並設定表單傳送圖片網址
網路工作站。接著,網路工作站程式碼的開頭為 importScripts
這個陳述式會載入外部 exif-reader
指令碼,然後設定
訊息管道與主要執行緒:
// exif-worker.js
// Import the exif-reader script:
importScripts('/js/with-worker/exifreader.js');
// Set up a messaging pipeline to send the Exif data to the `window`:
self.addEventListener('message', ({ data }) => {
getExifDataFromImage(data).then(status => {
self.postMessage(status);
});
});
這段 JavaScript 程式碼會設定訊息管道,這樣當使用者
提交具有 JPEG 檔案的表單,該網址會傳送至網路工作處理程式。
接著這段程式碼會從 JPEG 檔案擷取 Exif 中繼資料
建立 HTML 字串,並將該 HTML 傳回 window
,
向使用者顯示:
// Takes a blob to transform the image data into an `ArrayBuffer`:
// NOTE: these promises are simplified for readability, and don't include
// rejections on failures. Check out the complete web worker code:
// https://glitch.com/edit/#!/exif-worker?path=js%2Fwith-worker%2Fexif-worker.js%3A10%3A5
const readBlobAsArrayBuffer = blob => new Promise(resolve => {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
};
reader.readAsArrayBuffer(blob);
});
// Takes the Exif metadata and converts it to a markup string to
// display in the Exif metadata viewer in the DOM:
const exifToMarkup = exif => Object.entries(exif).map(([exifNode, exifData]) => {
return `
<details>
<summary>
<h2>${exifNode}</h2>
</summary>
<p>${exifNode === 'base64' ? `<img src="data:image/jpeg;base64,${exifData}">` : typeof exifData.value === 'undefined' ? exifData : exifData.description || exifData.value}</p>
</details>
`;
}).join('');
// Fetches a partial image and gets its Exif data
const getExifDataFromImage = imageUrl => new Promise(resolve => {
fetch(imageUrl, {
headers: {
// Use a range request to only download the first 64 KiB of an image.
// This ensures bandwidth isn't wasted by downloading what may be a huge
// JPEG file when all that's needed is the metadata.
'Range': `bytes=0-${2 ** 10 * 64}`
}
}).then(response => {
if (response.ok) {
return response.clone().blob();
}
}).then(responseBlob => {
readBlobAsArrayBuffer(responseBlob).then(arrayBuffer => {
const tags = ExifReader.load(arrayBuffer, {
expanded: true
});
resolve({
status: true,
message: Object.values(tags).map(tag => exifToMarkup(tag)).join('')
});
});
});
});
在此您可以閱讀一些內容,不過這也是相當涉及網路工作人員的使用。
不過,結果值得信賴,並非僅限於此用途。
網路工作處理程序可用於處理各種作業,例如隔離 fetch
呼叫
處理回應、處理大量資料而不封鎖
但這只適用於啟動條件。
改善網頁應用程式的效能時,請開始思考 任何能在網路工作處理環境中合理完成的任何工作。增益可能會包括 而且網站整體的使用者體驗更出色。