Я работаю над приложением JavaScript, которое будет выполнять некоторые вычисления на стороне клиента (внутри браузера). Тем не менее, вычисление позже окажется довольно дорогим, и выполнение их в основном потоке заблокирует пользовательский интерфейс. Поэтому я решил запустить их в веб-воркере.
Поскольку логика для вычислений уже написана в модулях JavaScript и связана с веб-пакетом (точнее, они являются модулями машинописного текста как часть реагирующего приложения), наиболее естественным подходом является использование worker с типом module
. Однако, как и в 2022 году, эта функция не поддерживается в старых браузерах, в частности, ее не поддерживает Fire Fox. Это мешает мне использовать эту функцию.
Единственное решение, которое я могу придумать только с классическим рабочим, — это скопировать все эти модули (и их зависимости) в один файл js, что будет кошмаром для удобства обслуживания. Есть ли способ обойти эту проблему (например, сгенерировать этот единственный файл js программно, не вмешиваясь в существующий код)? В частности, поскольку я использую webpack, я задумался над созданием отдельного бандла всего кода модуля для воркера. Но я недостаточно знаком с webpack, чтобы попробовать это.
@spender Спасибо, я очень удивлен, что это работает. Я использую вебпак v5. Единственная незначительная жалоба, которую я имею, заключается в том, что это создает только предопределенного рабочего. Было бы лучше, если бы я мог создать встроенного рабочего процесса (с Blob
), чтобы я мог связать с рабочим процессом некоторые динамические данные инициализации, неизвестные во время компиляции. С этим мне придется передавать эти динамические данные через postMessage
.
Возможно, стоит взглянуть на что-то вроде comlink
или, поскольку вы контролируете свой собственный веб-пакет, он даже обернут как comlink-loader
.
@spender Я только что посмотрел comlink
. Это именно то, что мне нужно. Большое спасибо.
WebPack версии 5 предлагает рабочая поддержка из коробки.
Относительно легко включить worker-loader
, чтобы получить что-то подобное в Webpack версии 4.
Однако, если цель состоит в том, чтобы поговорить с веб-работником (т. е. передать параметры, получить результаты), то, возможно, стоит изучить comlink
Google или даже интегрировать comlink-loader
в конфигурацию вашего веб-пакета.
Comlink makes WebWorkers enjoyable. Comlink is a tiny library (1.1kB), that removes the mental barrier of thinking about postMessage and hides the fact that you are working with workers.
Webpack поможет вам... Я предлагаю вам прочитать документацию для
worker-loader
(v4) или встроенная поддержка воркеров в v5, чтобы увидеть, к чему это приведет.