Как я могу получить доступ к веб-воркерам в Service Worker?

В последнее время я работаю с serviceworker и часто сталкиваюсь с ситуация, когда я хотел бы обработать некоторые необработанные данные, извлеченные перед их сохранением в кеше сервисного работника. Примером использования может быть обработка большого необработанного текстового файла для удаления ненужного пробела. Таким образом, кешированный ответ на мой http-запрос уже будет «оптимизирован».

Я думал, почему бы не сделать это в веб-воркере, но, увы, после долгих поисков я не нашел ни малейшего представления о том, как сделать веб-воркер доступным внутри сервис-воркера. Не похоже, что я могу пройти в контексте веб-воркера, используя postMessage.

Вопрос:
Как я могу получить доступ к Web Workers в Service Worker?


person frequent    schedule 28.01.2017    source источник


Ответы (1)


В настоящее время невозможно получить доступ к веб-воркеру из сервис-воркера. Это может измениться в будущем, и соответствующая проблема со стандартами — https://github.com/whatwg/html/issues/411

Обратите внимание, что можно использовать Cache Storage API из веб-воркера, созданного обычной веб-страницей, поэтому теоретически вы можете делать то, что предлагаете, вне контекста сервис-воркера.

Это вопрос личных предпочтений, а не строгих правил, но мне не нравится схема изменения данных, которые вы получаете из сети, а затем использование Cache Storage API для их сохранения в синтетическом Response объекте. Я предпочитаю использовать Cache Storage API для хранения точных копий того, что вы получаете из сети, чтобы все выглядело одинаково на вашей контролируемой странице независимо от того, выполняется ли запрос из сети или из кеша.

Шаблон, который я использовал ранее и который имеет дополнительное преимущество использования веб-воркеров так, как вы предлагаете, заключается в том, чтобы использовать IndexedDB аналогичным образом. Если ответ уже находится в IndexedDB, вы просто используете его, а если нет, то вы запускаете веб-воркер для обработки сетевого запроса и обработки, а затем сохраняете результат в IndexedDB для использования в будущем.

пример некоторый код для этого, использующий множество функций ES2015+, а также promise-worker и idb-keyval библиотеки для асинхронного кода.

import PromiseWorker from 'promise-worker';
import idbKeyValue from 'idb-keyval';

export default async (url, Worker) => {
  let value = await idbKeyValue.get(url);
  if (!value) {
    const promiseWorker = new PromiseWorker(new Worker());
    value = await promiseWorker.postMessage(url);
    // Don't await here, so that we can return right away.
    idbKeyValue.set(url, value);
  }
  return value;
};

И тогда рабочий мог посмотреть что-то вот так (который преобразует Markdown в HTML):

import 'whatwg-fetch';
import MarkdownIt from 'markdown-it';
import registerPromiseWorker from 'promise-worker/register';

const markdown = new MarkdownIt();

registerPromiseWorker(async url => {
  const response = await fetch(url);
  const text = await response.text();
  return markdown.render(text);
});

Этот подход теряет смысл, если вы имеете дело с большими объемами данных, поскольку при сериализации возникают накладные расходы и не хватает поддержка потоковой передачи по сравнению с тем, что было бы возможно при непосредственном использовании API Cache Storage.

person Jeff Posnick    schedule 31.01.2017
comment
Прохладный. Спасибо за всю информацию и указатели. Дай мне переварить на минутку... - person frequent; 01.02.2017
comment
Ok. все поняли. Я не знал, что Cache API также доступен в веб-воркере, интересно. Я посмотрю на это. Что касается предпочтений в отношении хранения, я понимаю вашу точку зрения и думаю, что она тоже верна. В данный момент я только возюсь, больше интересуясь, можете ли вы использовать кешированный файл в качестве самого хранилища, если он правильно проиндексирован, сохраняя индекс в indexeddb и выполняя запросы с использованием диапазонов байтов (я всегда возвращаюсь к одним и тем же вещам - stackoverflow.com/questions/15200266/) - person frequent; 01.02.2017