Сохраняются ли общие веб-воркеры при перезагрузке одной страницы, переход по ссылкам

Общие веб-рабочие ] предназначены для того, чтобы несколько страниц с одного и того же сайта (источника) могли совместно использовать одного веб-воркера.

Однако мне не ясно из спецификации (или других руководств и информации о Shared Workers), будет ли Shared Worker сохраняться, если у вас есть только одно окно / вкладка с сайта и вы переходите на другую страницу на том же сайте. .

Это было бы наиболее полезно в случае соединения WebSocket от Shared Worker, которое остается подключенным во время навигации по сайту. Например, представьте, что биржевой тикер или область чата будут сохраняться (без необходимости повторного подключения WebSocket) даже во время навигации по сайту.

22
задан kanaka 17 February 2012 в 23:14
поделиться

2 ответа

Я провел некоторое тестирование, чтобы найти ответ на этот вопрос на практике.

Firefox пока не поддерживает создание подключений WebSocket из Web Workers: https://bugzilla.mozilla.org/show_bug.cgi?id=504553 Так что Firefox не имеет значения, пока эта ошибка не будет устранена.

IE 10 не поддерживает Shared Web Workers , поэтому он также не актуален. Так что остается Chrome.

Вот пример для тестирования веб-работников с общим доступом.

Сначала HTML:

<!DOCTYPE html>
<html>
<body>
    <a href="shared.html">reload page</a>
    <script>
        var worker = new SharedWorker("shared.js");
        worker.port.addEventListener("message", function(e) {
            console.log("Got message: " + e.data);
        }, false);
        worker.port.start();
        worker.port.postMessage("start");
    </script>
</body>
</html>

Затем реализация самого совместно используемого работника в shared.js:

var connections = 0;

self.addEventListener("connect", function(e) {
    var port = e.ports[0];
    connections ++;
    port.addEventListener("message", function(e) {
        if (e.data === "start") {
            var ws = new WebSocket("ws://localhost:6080");
            port.postMessage("started connection: " + connections);
        }
    }, false);
    port.start();
}, false);

Результаты теста в Chrome 20 ( ответ ):

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

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

Итак, в Chrome 20: Общие веб-работники не сохраняются при перезагрузках страницы и переходят по ссылкам при переходах по ссылкам .

23
ответ дан 29 November 2019 в 05:15
поделиться

У меня был успех с несколько обходной техникой, при которой, когда я хочу перейти на следующую страницу, но при этом поддерживаю SharedWorker, я открываю (надеюсь, ненавязчивое) всплывающее окно, которое создает того же работника, жду, пока оно станет активным, и отправьте сообщение в исходный порт / окно, которое затем перейдет на новую страницу и затем, когда эта страница загрузится, закроет всплывающее окно. Эта стратегия всегда поддерживает хотя бы одно активное соединение, поэтому работник никогда не решает завершить работу.

Эта техника кажется достаточно надежной до сих пор. Хотя просмотр всплывающего окна несколько раздражает, в некоторых случаях это разумный компромисс.

3
ответ дан 29 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: