Создание Worker Из Другого Домена

Воркеры — это четкая реализация многопоточности в JavaScript. На данный момент у них имеется достаточное количество ограничений.

Ознакомиться с ними (как рабочими, так и ограничениями) можно прочитать Эта статья из хабраузера Антель .

Для интересующихся также есть ссылки на первоисточники информации.



Создание Worker из другого домена

Сегодня я столкнулся с другой проблемой.

А именно: с проблемой создания воркера из js-файла другого домена, что на данный момент запрещено его спецификацией.

История началась с создания небольшого расширения Google Chrome для Chess.com, использовавшего стороннюю библиотеку.

К сожалению, оказалось, что эта библиотека работает только как рабочая.

Проблема в том, что сам Chrome имеет определенные ограничения на получение файлов из контекста страницы.

Он позволяет внедрять на страницу сторонний код javascript, но не более того.

Это значит, что код из дополнения может получать воркеров на странице только из того домена, на котором он выполнялся.

То есть в моем случае: Chess.com. Конечно, можно было ожидать, что когда-нибудь у меня появится доступ к боевым серверам Chess.com, но мне бы хотелось, чтобы все заработало уже сегодня.

Мне пришлось поискать в Google. К счастью, статья с сайта html5rocks помогла мне найти решение: создать встроенный рабочий процесс через Blob. Подробности Здесь .

Короче говоря, вы можете создать любую текстовую строку и поместить ее в так называемый Blob — наскальный рисунок, прототип модели необработанного внешнего файла.

Например вот так (взято из html5rocks):

  
   

var blob = new Blob([ "onmessage = function(e) { postMessage('msg from worker'); }"]); // Obtain a blob URL reference to our worker 'file'.

var blobURL = window.URL.createObjectURL(blob); var worker = new Worker(blobURL); worker.onmessage = function(e) { // e.data == 'msg from worker' }; worker.postMessage(); // Start the worker.

Здесь мы видим, что создается объект Blob, который в представлении браузера представляет собой «как бы-файл», и в него записывается исходный текст. Но если мы можем создать Blob из любого текста, означает ли это, что мы можем загрузить любой текст с другого сайта, а затем поместить его в Blob? Хорошо, попробуем:

$.

get(" https://example.com/js/worker.js ", {}, function (workerCode) { var blob = new Blob([workerCode], {type : 'javascript/worker'}); var worker = new Worker(window.URL.createObjectURL(blob)); } );

Работает. То есть, по сути, мы можем загрузить на страницу любой внешний файл и запустить его как воркера, независимо от того, принадлежат ли файлы одному или нескольким доменам.

Ну, вот и день.

Напоследок отмечу, что, несмотря на всю сенсационность заголовка, в этом трюке в принципе нет ничего удивительного.

То же самое можно сделать и с однопоточным кодом JavaScript: загрузить его как текст и вызвать через eval. В данном случае единственное, что остается неясным, — это медленное решение о поддержке CORS в Web Workers. Теги: #Chess.com #расширения Google Chrome #JavaScript #workers #javascript из другого домена #cookie monster #кто-нибудь читает эти теги? #JavaScript #Google Chrome

Вместе с данным постом часто просматривают: