В прошлом я писал пост о том, что такое
веб-работники . Короче говоря, Web Workers позволяют веб-разработчикам запускать код JavaScript в фоновом режиме, что может помочь повысить производительность веб-страницы. Эта статья расскажет, что такое встроенные веб-работники и как их создавать.
Встроенные веб-работники
При работе с веб-работниками в большинстве случаев вы создаете отдельный файл JavaScript для выполнения работником. Встроенные веб-работники — это веб-работники, которые создаются в том же контексте веб-страницы или на лету. Причина для этого очевидна: иногда мы хотим уменьшить количество запросов, выполняемых страницей, а иногда нам нужно создать некоторые функциональные возможности на лету. Выполнение внешних файлов JavaScript не может помочь нам в этом.
Существует два вида встроенных веб-работников:
- Page inline worker — код JavaScript работника создается встроенным внутри веб-страницы. В этом случае вы будете использовать тег script с идентификатором и типом javascript / worker. тип укажет браузеру не анализировать написанный встроенный JavaScript и будет ссылаться на него как на строку. Вот пример для такого тега скрипта:
-
<script id="worker" type="javascript/worker"> postMessage('worker sent message'); </script>
Позже вы сможете извлечь скрипт по его идентификатору и использовать его свойство textContent для извлечения рабочего тела.
- На лету работника — код JavaScript работника предоставляется из внешнего источника в виде строки.
В обоих случаях для запуска работника вам потребуется создать объект BLOB-объекта и URL-адрес BLOB-объекта.
Создание веб-работника
Основным способом создания встроенного веб-работника является использование объекта BlobBuilder, который был добавлен файловым API HTML5 . BlobBuilder позволяет создать объект блоб из заданной строки. Он включает в себя две основные функции — функцию добавления и функцию getBlob . Функция append добавляет данные в подчеркивающий BLOB-объект, а getBlob возвращает созданный объект BLOB-объекта.
После того, как вы создадите объект BLOB из встроенной рабочей реализации, вам нужно будет создать из него URL. Причина в том, что Web Workers получает URL в качестве параметра. Для нашего спасения HTML5 определяет еще две функции в File API — createObjectURL и revokeObjectURL . Обе функции существуют в объекте window.URL . URL-адреса BLOB-объектов — это уникальные URL-адреса, которые создаются и сохраняются браузером вплоть до выгрузки документа. Функция createObjectURL получает объект BLOB-объекта и возвращает URI BLOB-объекта, который можно использовать. Функция revokeObjectURL используется для освобождения созданного URL-адреса BLOB- объекта . Если вы создаете много URL-адресов BLOB-объектов, вы должны использовать revokeObjectURL чтобы освободить ссылки на неиспользуемые URL-адреса BLOB-объектов
Давайте рассмотрим пример создания встроенного веб-работника:
var bb = new BlobBuilder(); bb.append(workerBody); var workerURL = window.URL.createObjectURL(bb.getBlob()); var worker = new Worker(workerURL);
В этом примере создается BlobBuilder и к нему добавляется workerBody. WorkerBody может быть любым фрагментом кода, который вы хотите запустить внутри Web Worker. После создания блоба в памяти вы будете использовать функцию createObjectURL, чтобы создать URL-адрес блоба и использовать его в качестве параметра для веб-рабочего. Если вы хотите использовать тег script из первого примера кода, вы можете написать следующий код:
var bb = new BlobBuilder(); bb.append(document.querySelector('#worker').textContent); var workerURL = window.URL.createObjectURL(bb.getBlob()); var worker = new Worker(workerURL);
Полный пример
Я хотел создать экспериментальный пример кода, чтобы показать, как инкапсулировать предыдущую встроенную реализацию Web Workers в объекте JavaScript и использовать его, вот так:
<!DOCTYPE html> <html lang="en"> <head> <title>Inline WebWorker</title> <meta charset="utf-8" /> <script> // create a namespace for the object var workerHelpers = workerHelpers || {}; // set the blob builder and window.URL according to the browser prefix if needed var BlobBuilder = BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; window.URL = window.URL || window.webkitURL; workerHelpers.InlineWorkerCreator = function () { }; workerHelpers.InlineWorkerCreator.prototype = function () { createInlineWorker = function (workerBody, onmessage) { if (BlobBuilder) { var bb = new BlobBuilder(); bb.append(workerBody); var workerURL = window.URL.createObjectURL(bb.getBlob()); var worker = new Worker(workerURL); worker.onmessage = onmessage; return workerURL; } else { console.log('BlobBuilder is not supported in the browser'); return; } }, releaseInlineWorker = function (workerURL) { window.URL.revokeObjectURL(workerURL); }; return { createInlineWorker: createInlineWorker, releaseInlineWorker: releaseInlineWorker }; } (); window.addEventListener('DOMContentLoaded', function () { var creator = new workerHelpers.InlineWorkerCreator(); var workerURL = creator.createInlineWorker('postMessage(\'worker sent message\');', function (e) { console.log("Received: " + e.data); }); console.log(workerURL); // release the URL after a second setTimeout(function () { creator.releaseInlineWorker(workerURL); }, 1000); }, false); </script> </head> <body> </body> </html>
Резюме
В посте я объяснил причину создания встроенных веб-работников. Я также показал, как создать встроенный Web Worker, и представил реализацию объекта JavaScript, который можно использовать для этого.
Буду благодарен за любые комментарии по поводу предоставленного кода.