Подтвердить что ты не робот

Выполнение веб-работника из разных источников

Я разрабатываю библиотеку, которую хочу разместить на CDN. Библиотека будет использоваться во многих разных доменах на нескольких серверах. Сама библиотека содержит один script (назовем его script.js), который загружает веб-рабочего (worker.js).

Загрузка самой библиотеки довольно проста: просто добавьте тег <script type="text/javascript" src="http://cdn.mydomain.com/script.js"></script> в домен, в котором я хочу использовать библиотеку (www.myotherdomain.com). Однако, поскольку библиотека загружает работника из http://cdn.mydomain.com/worker.js new Worker('http://cdn.mydomain.com/worker.js'), я получаю SecurityException. CORS включен на cdn.mydomain.com.

Для веб-работников не разрешается использовать веб-исполнителя в удаленном домене. Использование CORS не поможет: браузеры, похоже, игнорируют его и даже не выполняют проверку предполета.

Для этого нужно выполнить XMLHttpRequest, чтобы получить источник рабочего, а затем создать URL-адрес BLOB и создать рабочего, используя этот URL-адрес. Это работает для Firefox и Chrome. Однако это не работает для Internet Explorer или Opera.

Решение состоит в том, чтобы разместить работника на www.myotherdomain.com или разместить прокси файл (который просто загружает работника из cdn с помощью XHR или importScripts). Мне не нравится это решение: мне нужно разместить дополнительные файлы на сервере, и поскольку библиотека используется на нескольких серверах, обновление будет затруднено.

Мой вопрос состоит из двух партов:

  • Возможно ли иметь работника в удаленном источнике для IE 10 +?
  • Если это так, как лучше всего работать с кросс-браузером?
4b9b3361

Ответ 1

Для тех, кто находит этот вопрос:

ДА.

Это абсолютно возможно: трюк использует iframe в удаленном домене и общается с ним через postMessage. Удаленный iframe (размещенный на cdn.mydomain.com) сможет загружать веб-исполнителя (расположенного на cdn.mydomain.com/worker.js), поскольку оба они имеют одинаковое происхождение. Затем iframe может выступать в качестве прокси-сервера между вызовами postMessage. Однако script.js несет ответственность за фильтрацию сообщений, поэтому обрабатываются только действительные рабочие сообщения.

Недостатком является то, что скорость передачи данных (и скорость передачи данных) действительно снижается.

Короче:

  • script.js добавляет iframe с src="//cdn.mydomain.com/iframe.html"
  • iframe.html на cdn.mydomain.com/iframe.html, выполняет new Worker("worker.js") и действует как прокси-сервер для событий message из окна и worker.postMessage (и наоборот).
  • script.js связывается с рабочим, используя iframe.contentWindow.postMessage и message событие из окна. (с надлежащей проверкой правильного происхождения и идентификации работника для нескольких работников).