Насколько я могу судить, веб-работники должны быть написаны в отдельном файле JavaScript и называться так:
new Worker('longrunning.js')
Я использую закрывающий компилятор для объединения и минимизации всего моего исходного кода JavaScript, и я бы предпочел не иметь своих работников в отдельных файлах для распространения. Есть ли способ сделать это?
new Worker(function() {
//Long-running work here
});
Учитывая, что первоклассные функции так важны для JavaScript, почему стандартный способ выполнения фоновой работы должен загружать целый другой файл JavaScript с веб-сервера?
javascript
web-worker
Бен Дилтс
источник
источник
var worker = new DynWorker(); worker.inject("foo", function(){...});
...Ответы:
http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers
Полный пример BLOB встроенного работника:
источник
Решение html5rocks по встраиванию кода веб-работника в HTML довольно ужасно.
К тому же бланк экранированного JavaScript-as-a-string не лучше, не в последнюю очередь потому, что он усложняет рабочий процесс (компилятор Closure не может работать со строками).
Лично мне действительно нравятся методы toString, но @ dan-man ЭТО регулярное выражение!
Мой предпочтительный подход:
Поддержка - это пересечение этих трех таблиц:
Однако это не сработает для SharedWorker , поскольку URL-адрес должен точно соответствовать, даже если необязательный параметр name совпадает. Для SharedWorker вам понадобится отдельный файл JavaScript.
Обновление 2015 года - наступает особенность ServiceWorker
Теперь есть еще более мощный способ решения этой проблемы. Опять же, сохраните рабочий код как функцию (а не статическую строку) и преобразуйте ее с помощью .toString (), затем вставьте код в CacheStorage под выбранным статическим URL-адресом.
Есть два возможных отступления. ObjectURL, как описано выше, или, что более удобно, поместите настоящий файл JavaScript в /my_workers/worker1.js
Преимущества этого подхода:
источник
Вы можете создать один файл JavaScript, который знает его контекст выполнения и может действовать как родительский сценарий и как рабочий. Давайте начнем с базовой структуры файла:
Как видите, скрипт содержит весь код как для точки зрения родителей, так и для работника, проверяя, является ли его собственный отдельный экземпляр работником
!document
. Несколько громоздкоеscript_path
вычисление используется для точного вычисления пути сценария относительно родительской страницы, поскольку предоставленный путьnew Worker
относится к родительской странице, а не к сценарию.источник
Используя
Blob
метод, как об этом для рабочего завода:Таким образом, вы можете использовать это так ...
РЕДАКТИРОВАТЬ:
Я просто расширил эту идею, чтобы упростить межпотоковое взаимодействие: bridged-worker.js .
РЕДАКТИРОВАТЬ 2:
Приведенная выше ссылка относится к сущности, которую я создал. Кто-то позже превратил это в реальный репо .
источник
Веб-работники работают в совершенно разных контекстах, как отдельные программы.
Это означает, что код не может быть перемещен из одного контекста в другой в форме объекта, поскольку тогда они смогут ссылаться на объекты через замыкания, принадлежащие другому контексту.
Это особенно важно, так как ECMAScript разработан как однопоточный язык, и поскольку веб-работники работают в отдельных потоках, вы рискуете выполнить не поточнобезопасные операции.
Это снова означает, что веб-работники должны быть инициализированы с кодом в исходной форме.
Спецификация от WHATWG говорит
но, к сожалению, это на самом деле не объясняет, почему нельзя было разрешить передачу строки с исходным кодом в конструктор.
источник
лучше читать способ для встроенного работника ..
источник
toString()
, извлек тело и затем поместил это в BLOB-объект. Посмотрите на последний ответ, у меня есть примерВзять ответ Адрии и поместить его в копируемую функцию, которая работает с текущими Chrome и FF, но не с IE10 (работник из blob вызывает ошибку безопасности ).
И вот рабочий пример http://jsfiddle.net/ubershmekel/YYzvr/
источник
Недавний ответ (2018)
Вы можете использовать Гринлет :
Пример:
источник
В зависимости от вашего варианта использования вы можете использовать что-то вроде
Примером будет
источник
Взгляните на плагин vkThread. С помощью плагина htis вы можете взять любую функцию в своем основном коде и выполнить ее в потоке (веб-работник). Таким образом, вам не нужно создавать специальный «файл веб-работника».
http://www.eslinstructor.net/vkthread/
--Vadim
источник
Вы можете использовать веб-работников в одном и том же JavaScript, используя встроенных веб-работников.
Следующая статья поможет вам лучше понять веб-работников, их ограничения и отладку.
Освоение в веб-мастерах
источник
Я думаю, что лучший способ сделать это - использовать объект Blob, ниже вы можете увидеть простой пример.
источник
Попробуйте использовать jThread. https://github.com/cheprasov/jThread
источник
здесь консоль:
источник
https://developer.mozilla.org/es/docs/Web/Guide/Performance/Using_web_workers
источник
Используйте мой крошечный плагин https://github.com/zevero/worker-create
источник
Поэтому я думаю, что у нас есть еще один классный вариант для этого, благодаря литералам шаблонов в ES6. Это позволяет нам обойтись без дополнительной рабочей функции (и ее странной области видимости) и просто написать код, предназначенный для рабочего, в виде многострочного текста, во многом как в случае, когда мы использовали для хранения текста, но без необходимости в документе или DOM сделать это в. Пример:
Вот суть этого подхода .
Обратите внимание, что мы можем добавить любые дополнительные зависимости функций, которые мы хотим, в работника, просто собрав их в массив и запустив .toString для каждого из них, чтобы также сократить их до строк (должно работать, пока они являются объявлениями функций) и затем просто добавив это к строке сценария. Таким образом, нам не нужно импортировать скрипты, которые мы, возможно, уже включили в область написанного нами кода.
Единственный реальный недостаток этой конкретной версии заключается в том, что линтеры не смогут привязывать код работника службы (поскольку это всего лишь строка), что является преимуществом для «подхода с использованием отдельных рабочих функций».
источник
Это всего лишь дополнение к вышеупомянутому - у меня есть хорошие шаблоны для тестирования веб-работников в jsFiddle. Вместо Blob он использует jsFiddles
?js
api:Доступны обычные веб-рабочие и общие рабочие шаблоны.
источник
Я обнаружил, что CodePen в настоящее время не выделяет синтаксис встроенных
<script>
тегов, которых нетtype="text/javascript"
(или которые не имеют атрибута типа).Поэтому я разработал похожее, но немного отличающееся решение, используя помеченные блоки with
break
, и это единственный способ, с помощью которого вы можете освободить<script>
тег из тега, не создавая функцию-обертку (которая не нужна).источник
Простая обещанная версия,
Function#callAsWorker
которая принимает thisArg и аргументы (точно так же, какcall
) и возвращает обещание:источник
close()
метод, чтобы закрыть ваш хук жизни веб-работника. developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope/…close
функция устарела. Тем не менее, рабочие могут быть уволены . Я добавил это сейчас.Я использую такой код, вы можете определить свое сообщение как функцию, отличную от простого текста, чтобы редактор мог выделить ваш код, и jshint работает.
источник
Да, это возможно, я сделал это, используя файлы Blob и передавая обратный вызов
Я покажу вам, что делает класс, который я написал, и как он управляет выполнением обратных вызовов в фоновом режиме.
Сначала вы создаете экземпляр
GenericWebWorker
с любыми данными, которые вы хотите передать обратному вызову, который будет выполняться вWeb Worker
, который включает в себя функции, которые вы хотите использовать, в данном случае число, дату и функцию с именемblocker
Эта блокирующая функция будет выполнять бесконечное время в течение n миллисекунд
а затем вы используете это так
источник
Вы можете поместить содержимое вашего файла worker.js внутри обратных галочек (что допускает многострочную строковую константу) и создать работника из большого двоичного объекта следующим образом:
Это удобно, если по какой-либо причине вы не хотите иметь отдельные теги сценария для работника.
источник
Другое решение - просто обернуть Worker в функцию, а затем создать BLOB-объект, вызывающий функцию следующим образом:
источник
Однострочник для запуска функций у рабочих:
Пример использования:
источник