Я использовал ngrok для туннелирования локального IP (на самом деле это не так, потому что он находится в Google Colab) к общедоступному.
Зайдя в консоль ngrok, я вижу все созданные туннели. Я создал только один туннель для localhost: port, но здесь их два, один для HTTP и другой для HTTPS (разве это не хорошо?).
Если я перейду на https-адрес своего веб-приложения, на консоли я вижу
Но если я перейду на http-адрес, на консоли я получаю
В: Можете ли вы работать с сервис-воркерами, которым нужны HTTP-соединения через туннели на удаленную машину?
A: Очевидно да!
Код, стоящий за этой регистрацией (важно знать, где она не удалась):
IndexController.prototype._registerServiceWorker = function() {
console.log("1.Starting SW function.");
if (!navigator.serviceWorker) {
console.log("2.Browser is NOT compatible with SW or something is not working.");
return; }
console.log("2.Browser is compatible with SW.");
navigator.serviceWorker.register('/sw.js').then(function() {
console.log('3.Registration worked!');
}).catch(function() {
console.log('3.Registration failed!');
});
};
И что еще более усложняет, мое веб-приложение, использующее Service Workers, работает внутри Colab ( Google Colab ). Веб-приложение работает на Node.js внутри Colab.
Если вы работаете с localhost, вам должно быть проще, потому что требование https не применяется при подключении к localhost (согласно теории). [A] и [B]
Это не то же самое, что браузер будет хорошо работать с вашим приложением только потому, что он работает на localhost.
Примечание: мой эксперимент выше ..
- Firefox: работал с указанными ниже настройками и без них.
- Chrome: без добавления URL-адресов в белый список и перезапуска я получил
При переходе в веб-приложение https я получил:
IndexController.js:49 Mixed Content: The page at 'https://0a4e1e0095b0.ngrok.io/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://0a4e1e0095b0.ngrok.io/updates?since=1602934673264&'. This request has been blocked; this endpoint must be available over WSS.
IndexController._openSocket @ IndexController.js:49
IndexController @ IndexController.js:10
(anonymous) @ index.js:16
loadScripts @ loadScripts.js:5
46.../utils/loadScripts @ index.js:15
s @ _prelude.js:1
e @ _prelude.js:1
(anonymous) @ _prelude.js:1
IndexController.js:49 Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
at IndexController._openSocket (https:
При переходе в веб-приложение http я получил:
Navigated to http:
IndexController.js:17 1.Starting SW function.
IndexController.js:19 2.Browser is NOT compatible with SW or something is not working.
Если вы не на локальном хосте и не можете использовать https, вам может потребоваться изменить эти настройки в своем браузере.
Некоторые люди уже объяснили это, но здесь это снова.
Хром:
- Перейдите к chrome: // flags / # unsafely-Treat-insecure-origin-as-secure
- Добавьте URL-адреса, которые хотите добавить в белый список.
- Перезапустить хром
Обратите внимание, что это перезапустит все окна Chrome. Это не решение для меня, потому что мои туннели меняют имя каждый раз, когда они создаются, и я не могу каждый раз перезапускать кучу окон.
Firefox / Waterfox
- Открыть инструменты разработчика
- Открыть настройки
- Отметьте «Включить сервис-воркеров через HTTP (при открытой панели инструментов)»
Firefox / Waterfox
Вероятно, вам не нужно вносить изменения, указанные ниже, но я сделал (мой браузер может быть немного устаревшим). Больше информации здесь .
В about: config
Я включил
dom.serviceWorkers.testing.enabled
dom.serviceWorkers.enabled
Я настоятельно рекомендую посмотреть этот https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers и связанные с ним страницы на том же сайте.
Если кого-то интересует настройка ngrok, это очень просто (версия на Python).
# Install pyngrok python package on your Google Colab Session
!pip install pyngrok
# Set up your ngrok Authtoken (requires free registration)
!ngrok authtoken YOUR_TOKEN_HERE
# Invoke ngrok from Python and start tunneling/connecting
from pyngrok import ngrok
# Open a HTTP tunnel on the default port 80 if not specified
ngrok_tunnel = ngrok.connect('8888')
# You can print it, or go to the ngrok console on https:
print (ngrok_tunnel.public_url)