Re[3]: Надёжное обновление страницы
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.07.20 12:46
Оценка: 20 (3)
Здравствуйте, ·, Вы писали:

·>Страница предназначена для отображения на мониторе, комп стоит в шкафу, без клавы/мыши. Если страница сломалась во время обновления надо заходить на комп удалённо лишь ради того, чтобы нажать F5.


Можно посмотреть на PWA (Progressive Web App), т.е. добваить к твоему приложению манифест и воркер скрипт. Минимальный пример здесь
Там ты полностью контролируешь то что именно браузер получает из сети, и решаешь за него, что вернуть (из кэша например), если сервер недоступен или при загрузке произошла ошибка.
Обновление там тоже делается явно.
Отредактировано 17.07.2020 12:50 bnk . Предыдущая версия . Еще …
Отредактировано 17.07.2020 12:47 bnk . Предыдущая версия .
Re: Надёжное обновление страницы
От: Reset  
Дата: 18.07.20 01:34
Оценка: 18 (1)
·>Как правильно сделать надёжное обновление?

Открываешь страницу-сторожа в том же домене, что и нужная тебе страница. В ней делаешь скрипт, который открывает новую страницу с нужной информацией (твоим мониторингом). Когда мониторинг нужно обновить, делаешь close() из сторожевой страницы. Страница-сторож держит веб сокет к серверу и получает от него команды на обновление рабочей страницы при смене версии или зависании рабочей страницы. Рабочая страница тоже держит сокет и в него пуляет keep-alive. Сервер сторожевой странице будет либо так же пулять keep-alive, либо уведомит об изменении конфигурации падением веб сокета к сторожу (после восстановления сокета рабочую страницу нужно будет пересоздать close/open). Сторож примитивный, поэтому шансов сломаться у него мало, менять его тоже вряд ли нужно (хотя можно предусмотреть, чтобы он сам себя перезагрузил заходом на другой URL, закрыв перед этим страницу мониторинга).
// watchdog page
var worker_url = "https://domain.local/monitoring.html";
while ( true )
{
    var win = window.open(worker_url, '_blank');
    win.focus();
    // Тут слушаем веб сокет, переоткрываем его при отключении, читаем команду на перезагрузку рабочей страницы и, возможно, на перезагрузку себя
    win.close();
}
<body>
<p style="font.color=Вырви_глаз; font.size=Очень_большой; выравнивание=посредине">
Ahtung!!!<br>
Это сторожевая страница для мониторинга. Без нее он может перестать работать.<br>
Не закрывайте эту страницу, если нужно, чтобы мониторинг работал.
</p>
</body>
Re[3]: Надёжное обновление страницы
От: L.K. Марс  
Дата: 17.07.20 12:56
Оценка: 6 (1)
Или ещё вариант: периодически запускаемый bash-скрипт проверяет заголовок окна браузера (командой wmctrl). Если заголовок не соответствует заголовку сайта, значит произошёл сбой и нужно "нажать" F5 (командой xdotool). Заголовок ставится яваскриптом после диагностики страницы (загрузились ли все скрипты и стили).
Re[4]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 16:31
Оценка: 6 (1)
Здравствуйте, Lazytech, Вы писали:

L>·>Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.

L>По идее, можно добавить в конце body небольшой JavaScript-код, который будет проверять по каким-то признакам, загрузился ли bundle.js, и при необходимости принудительно обновит страницу.
Если в момент принудительного обновления страницы не будет сети или сервак будет лежать, то всё сломается. Браузер покажет какой-нибудь "page not found" и усё.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Надёжное обновление страницы
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.07.20 11:38
Оценка: +1
Здравствуйте, ·, Вы писали:

·>Пытаюсь сделать single page app с автообновлением.


·>Есть открытая в браузере страница. Иногда выкатывается новая версия приложения. Браузер каким-то образом должен это обнаружить и перезагрузить эту страницу.


Обычно делают простейший вариант — переименовывают все js и css файлы в новой версии. Большинство фреймворков делают это автоматически при сборке приложения (или "дедовский" вариант с добавлением суффикса версии к файлам). Браузер подгрузит такие изменения автоматически, после того как загрузит новый index.html

То есть, тебе ничего не надо делать, все и так будет обновляться. Достаточно использовать любой фреймворк для сборки, типа webpack.

Не очень понял почему ты хочешь файлы с сервера загружать "вручную". Это как-то супер подозрительно
Отредактировано 17.07.2020 11:44 bnk . Предыдущая версия . Еще …
Отредактировано 17.07.2020 11:42 bnk . Предыдущая версия .
Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 11:03
Оценка:
Пытаюсь сделать single page app с автообновлением.

Есть открытая в браузере страница. Иногда выкатывается новая версия приложения. Браузер каким-то образом должен это обнаружить и перезагрузить эту страницу.

Для обнаружения у меня в данный момент открывается websocket — если соединение прервано — считается, что время проверить версию на сервере. Если способ попроще? Или сойдёт?

Допустим мы обнаружили что надо перезагрузить страницу. Наивный window.reload может не сработать если в этот момент сервер лежит, например. Поэтому надо как-то убедиться, что сервер в порядке и возвращает ожидаемый результат. Ну это можно как-то попинговать какой-нибудь урл, или открывая websocket. Но даже если пинг прошел, во время reload тоже может что-нибудь упасть. Загрузка страницы может прерваться в произвольный момент и страница опять будет поломана.

Т.е. в идеале надо как-то вначале загрузить файлы (как минимум index.html и необходимые зависимости .js и .css. В принципе webpack позволяет все .js+.css в один bundle собрать. Т.е. нужно как минимум index.html+bundle.js как-то предварительно подргузить, проверить, что они загрузились целиком и без ошибок в кеш браузера, потом как-то объяснить браузеру, чтобы он отобразил страницу целиком из кеша атомарно.

Как правильно сделать надёжное обновление?

Интересуют современные браузеры, совместимость с IE5 не требуется.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Надёжное обновление страницы
От: fmiracle  
Дата: 17.07.20 12:23
Оценка:
Здравствуйте, ·, Вы писали:

·>Допустим мы обнаружили что надо перезагрузить страницу. Наивный window.reload может не сработать если в этот момент сервер лежит, например. Поэтому надо как-то убедиться, что сервер в порядке и возвращает ожидаемый результат. Ну это можно как-то попинговать какой-нибудь урл, или открывая websocket. Но даже если пинг прошел, во время reload тоже может что-нибудь упасть. Загрузка страницы может прерваться в произвольный момент и страница опять будет поломана.


Софт для космической атомной станции?
Тебе надо только index.html перезачитать, дальше браузер все вытащит по новым ссылкам (вебпак умеет давать новые имена для скриптов и статики). Вероятность, что при работающем сервер вдруг упадет загрузка очень мала. А если все же в каких-то редких случаях и упадет, то что? Пользователь увидит ошибку, сделает обновление страницы и все загрузится, хм?
Re[2]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 12:28
Оценка:
Здравствуйте, bnk, Вы писали:


bnk>·>Есть открытая в браузере страница. Иногда выкатывается новая версия приложения. Браузер каким-то образом должен это обнаружить и перезагрузить эту страницу.

bnk>Обычно делают простейший вариант — переименовывают все js и css файлы в новой версии. Большинство фреймворков делают это автоматически при сборке приложения (или "дедовский" вариант с добавлением суффикса версии к файлам). Браузер подгрузит такие изменения автоматически, после того как загрузит новый index.html
bnk>То есть, тебе ничего не надо делать, все и так будет обновляться. Достаточно использовать любой фреймворк для сборки, типа webpack.

bnk>Не очень понял почему ты хочешь файлы с сервера загружать "вручную". Это как-то супер подозрительно

Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.

Страница предназначена для отображения на мониторе, комп стоит в шкафу, без клавы/мыши. Если страница сломалась во время обновления надо заходить на комп удалённо лишь ради того, чтобы нажать F5.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Надёжное обновление страницы
От: vsb Казахстан  
Дата: 17.07.20 12:34
Оценка:
Я бы попробовал сделать AJAX-запрос /index.html и потом заменить тело страницы на полученные данные при успешной загрузке.

Чтобы обезопасить себя от недозагруженных скриптов, можно сделать так:

В самом начале страницы сделай reloadIndexHtmlTimeout = setTimeout(reloadIndexHtml, 10000). Прям в теге скрипт. Первый кусок страницы-то уж точно придёт. Ну и эту функцию reloadIndexHtml туда же. В общем 1-2 IP пакета и в браузере этот скрипт выполнится и пойдёт отсчёт. Дальше, если будут любые проблемы с загрузкой, через 10 секунд опять пойдёт попытка AJAX-ом загрузить и тд. Тут уже сам пиши, чтобы было надёжно отработаны ошибки, ретраи и тд. А так — в самом конце сделай аналог document.addEventListener("DOMContentLoaded", function() { clearTimeout(reloadIndexHtmlTimeout); }). Конкретно этот код, мне кажется, не сработает, то бишь он будет работать даже при загрузке JS с ошибками, поэтому надо погуглить, как определить тот факт, что JS не загрузился и тут прописать эти условия. Ну или в конце своего JS-файла просто поставляй флажок, если полностью прогрузится, то этот флажок проставится.
Отредактировано 17.07.2020 12:40 vsb . Предыдущая версия . Еще …
Отредактировано 17.07.2020 12:35 vsb . Предыдущая версия .
Re[3]: Надёжное обновление страницы
От: Lazytech Ниоткуда  
Дата: 17.07.20 12:39
Оценка:
Здравствуйте, ·, Вы писали:

·>Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.


По идее, можно добавить в конце body небольшой JavaScript-код, который будет проверять по каким-то признакам, загрузился ли bundle.js, и при необходимости принудительно обновит страницу.
Re[3]: Надёжное обновление страницы
От: L.K. Марс  
Дата: 17.07.20 12:45
Оценка:
·>Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.

Ну тогда index.html должен загружаться один раз — и всё.

А обновления (html,css,js) должны загружаться аяксом (с проверкой контрольной суммы) и потом вставляться внутрь index.html.
Re[3]: Надёжное обновление страницы
От: fmiracle  
Дата: 17.07.20 13:06
Оценка:
Здравствуйте, ·, Вы писали:

·>Я хочу себя обезопасить от внезапных ошибок сети. Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.

·>Страница предназначена для отображения на мониторе, комп стоит в шкафу, без клавы/мыши. Если страница сломалась во время обновления надо заходить на комп удалённо лишь ради того, чтобы нажать F5.

Вроде как Service Workers для этого придуманы, но сам я с ними еще не работал. Насколько их можно применить для обновления Js-кода самого приложения —
Re[4]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 16:24
Оценка:
Здравствуйте, L.K., Вы писали:

LK>·>Допустим index.html загрузился. Дальше браузер идёт загружать bundle.js и тут wifi пропадает на минуту. Имеем поломанную страницу.

LK>Ну тогда index.html должен загружаться один раз — и всё.
LK>А обновления (html,css,js) должны загружаться аяксом (с проверкой контрольной суммы) и потом вставляться внутрь index.html.
Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Надёжное обновление страницы
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.07.20 16:34
Оценка:
Здравствуйте, ·, Вы писали:

·>Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...


Честно говоря, твои опасения совершенно непонятны. Выглядит как боязнь темноты. Типа, вдруг я пойду ночью в туалет, а из толчка вылезет питон и укусит меня за жопу
Возможно есть какие-то особенности твоего приложения, что его отличает от миллионов других?
Отредактировано 17.07.2020 16:36 bnk . Предыдущая версия .
Re[5]: Надёжное обновление страницы
От: L.K. Марс  
Дата: 17.07.20 16:40
Оценка:
·>Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...

Все таймеры перед обновлением, разумеется, останавливаются. Обработчики событий тоже останавливаются. HTML-объекты удаляются.

Остаётся только "изначальный"/"неизменный" скрипт, который умеет проверять наличие новой версии, закачивать её, проверять контрольную сумму и добавлять полученные скрипты на страницу.
Re[2]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 16:42
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>В самом начале страницы сделай reloadIndexHtmlTimeout = setTimeout(reloadIndexHtml, 10000). Прям в теге скрипт. Первый кусок страницы-то уж точно придёт.

Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 16:45
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>·>Я опасаюсь, что какие-то глобальные объекты страницы (таймеры, например) будут застревать в текущей странице и вообще бардак начнётся из-за месива разных версий кода...

bnk>Честно говоря, твои опасения совершенно непонятны. Выглядит как боязнь темноты. Типа, вдруг я пойду ночью в туалет, а из толчка вылезет питон и укусит меня за жопу
bnk>Возможно есть какие-то особенности твоего приложения, что его отличает от миллионов других?
Обычно веб-приложениями пользуются интерактивно. А у меня приложение просто отображает информацию, не подразумевает что юзер что-то нажимает, только смотрит. Один раз открыл в окошке — и всё, только глядеть туда.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Надёжное обновление страницы
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.07.20 16:52
Оценка:
Здравствуйте, ·, Вы писали:

bnk>>Честно говоря, твои опасения совершенно непонятны. Выглядит как боязнь темноты. Типа, вдруг я пойду ночью в туалет, а из толчка вылезет питон и укусит меня за жопу

bnk>>Возможно есть какие-то особенности твоего приложения, что его отличает от миллионов других?

·>Обычно веб-приложениями пользуются интерактивно. А у меня приложение просто отображает информацию, не подразумевает что юзер что-то нажимает, только смотрит. Один раз открыл в окошке — и всё, только глядеть туда.


Это что-то типа календаря?
Тогда возможно имеет смысл все закэшировать (то есть, все файлы иметь на клиенте).
Насколько я знаю, сейчас для этого две возможности — servece workers (можно просто, можно PWA), или (устаревшая) cache manifest
Оба варианта предоставляют вполне документированный и детерминированный механизм обновления, обеспечивающий целостность приложения.
Отредактировано 17.07.2020 16:55 bnk . Предыдущая версия . Еще …
Отредактировано 17.07.2020 16:54 bnk . Предыдущая версия .
Re[8]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 17:07
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>·>Обычно веб-приложениями пользуются интерактивно. А у меня приложение просто отображает информацию, не подразумевает что юзер что-то нажимает, только смотрит. Один раз открыл в окошке — и всё, только глядеть туда.

bnk>Это что-то типа календаря?
Ну да, что-то вроде. Точнее типа summary health monitor, набор красных/зелёных лампочек, номера текущих версий, етс.

bnk>Тогда возможно имеет смысл все закэшировать (то есть, все файлы иметь на клиенте).

bnk>Насколько я знаю, сейчас для этого две возможности — servece workers (можно просто, можно PWA), или (устаревшая) cache manifest
bnk>Оба варианта предоставляют вполне документированный и детерминированный механизм обновления, обеспечивающий целостность приложения.
Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Надёжное обновление страницы
От: vsb Казахстан  
Дата: 17.07.20 17:24
Оценка:
Здравствуйте, ·, Вы писали:

vsb>>В самом начале страницы сделай reloadIndexHtmlTimeout = setTimeout(reloadIndexHtml, 10000). Прям в теге скрипт. Первый кусок страницы-то уж точно придёт.

·>Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала?

Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
Re[9]: Надёжное обновление страницы
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.07.20 18:50
Оценка:
Здравствуйте, ·, Вы писали:

bnk>>Тогда возможно имеет смысл все закэшировать (то есть, все файлы иметь на клиенте).

bnk>>Насколько я знаю, сейчас для этого две возможности — servece workers (можно просто, можно PWA), или (устаревшая) cache manifest
bnk>>Оба варианта предоставляют вполне документированный и детерминированный механизм обновления, обеспечивающий целостность приложения.

·>Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна.


Я бы тогда только на sw смотрел. "cache manifest" упомянул поскольку постольку.
Кстати, как ты вообще запускаешь обновление, если панель никак не взаимодействует с пользователем?
Re[4]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 18:54
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>·>Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала?

vsb>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
Не очень понял. Ну допустим мы успешно вытянули аяксом обновлённый index.html. Что дальше?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[10]: Надёжное обновление страницы
От: · Великобритания  
Дата: 17.07.20 19:01
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>·>Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна.

bnk>Я бы тогда только на sw смотрел. "cache manifest" упомянул поскольку постольку.
bnk>Кстати, как ты вообще запускаешь обновление, если панель никак не взаимодействует с пользователем?
Не очень понял которое обновление ты тут имеешь в виду. Обновляется версия приложения на веб-сервере. Открытая у пользователя страница это должна обнаружить (у меня это сделано через websocket через который так же поступают отображаемые данные). Как только это обнаружится, страница должна автоматически обновиться тоже. Но сделать это атомарно — либо сидеть на текущей версии пытаясь обновиться и ловя всевозможные ошибки, либо загрузить и успешно запустить новую версию, а не упасть по пути с каким-нибудь DNS error.
Т.е. никакого взаимодействия с пользователем не нужно и не должно быть.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: Надёжное обновление страницы
От: bnk СССР http://unmanagedvisio.com/
Дата: 17.07.20 19:09
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, bnk, Вы писали:


bnk>>·>Ага, PWA и SW уже смотрю... cache manifest вообще стоит смотреть, раз он устарел? Поддержка старых браузеров мне не нужна.

bnk>>Я бы тогда только на sw смотрел. "cache manifest" упомянул поскольку постольку.
bnk>>Кстати, как ты вообще запускаешь обновление, если панель никак не взаимодействует с пользователем?
·>Не очень понял которое обновление ты тут имеешь в виду. Обновляется версия приложения на веб-сервере. Открытая у пользователя страница это должна обнаружить (у меня это сделано через websocket через который так же поступают отображаемые данные). Как только это обнаружится, страница должна автоматически обновиться тоже. Но сделать это атомарно — либо сидеть на текущей версии пытаясь обновиться и ловя всевозможные ошибки, либо загрузить и успешно запустить новую версию, а не упасть по пути с каким-нибудь DNS error.
·>Т.е. никакого взаимодействия с пользователем не нужно и не должно быть.

Понятно. Может тогда проще такое не средствами браузера сделать, а через (внешний) скрипт например?
Типа если это все равно устройство, там же может есть сервисы, поставить cron job, или что там есть. Пусть скачает папку, да запустит из нее новую версию если все ОК.
Все равно такое думается лучше перезапускать, мало ли зависнет.
Re[4]: Надёжное обновление страницы
От: Mystic Artifact  
Дата: 17.07.20 19:20
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).


Что значит перезагрузить страницу аяксом? Ты документ/текст предлагаешь подменить? (Ну т.е. e.innerHTML = newContent?
Отредактировано 17.07.2020 19:25 Mystic Artifact . Предыдущая версия .
Re[5]: Надёжное обновление страницы
От: vsb Казахстан  
Дата: 17.07.20 20:32
Оценка:
Здравствуйте, ·, Вы писали:

vsb>>·>Не понял почему "точно"? Вот у нас есть загруженная работающая страница. Поступил сигнал "обновиться". Если просто тупо сделать window.reload, то index.html может вообще не прийти, а покажется например какой-нибудь "DNS error", если сеть временно отвалилась. Что конкретно ты предлагаешь делать при поступлении сигнала?

vsb>>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).
·>Не очень понял. Ну допустим мы успешно вытянули аяксом обновлённый index.html. Что дальше?

Заменяешь всю страницу новым текстом. Что-то вроде document.open(); document.write(newHtml); document.close();

Старые таймеры будут тикать, да, могут быть непредвиденные спецэффекты. Хотя, думаю, в целом вероятность таковых невелика. Если это важно, можно переопределить setTimeout/setInterval и вести учёт всех таймеров, чтобы отменить их перед заменой документа.
Отредактировано 17.07.2020 20:34 vsb . Предыдущая версия . Еще …
Отредактировано 17.07.2020 20:33 vsb . Предыдущая версия .
Re[5]: Надёжное обновление страницы
От: vsb Казахстан  
Дата: 17.07.20 20:32
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

vsb>>Если мы перезагружаем работающую страницу, то я написал — делаем это аяксом. То, что я написал выше это для варианта, когда страница загружается браузером изначально (или перезагружается через F5).


MA> Что значит перезагрузить страницу аяксом? Ты документ/текст предлагаешь подменить? (Ну т.е. e.innerHTML = newContent?


Ну это делается не через innerHTML, но концептуально да.
Re[6]: Надёжное обновление страницы
От: Mystic Artifact  
Дата: 18.07.20 07:08
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ну это делается не через innerHTML, но концептуально да.

Дак я и спрашиваю через что конкретно предлагается.6
Re: Надёжное обновление страницы
От: MadHuman Россия  
Дата: 18.07.20 09:03
Оценка:
Здравствуйте, ·, Вы писали:

·>Как правильно сделать надёжное обновление?

у нас сделано так — в каждом аякс запросе, вызванных активностями юзеров, в хидере приходит версия системы.
Если запомненная на клиент-сайде версия системы перестала совпадать с полученной от сервера — значит надо обновлять страницу.
юзеру выдается диалог — версия системы изменилась, необходимо обновить страницу. и на ок делается reload.
недоступность сервера в этот момент — нестрашно. нажмут лишний раз f5. вероятность именно такого расклада мала, в реальности проблем нет.

ps. увидел что тебе нужно чтоб не было взаимодействия с юзером если даже недоступность сервера случится в момент reload, тогда вариант как у нас — не подойдет конечно.
точно это нужно? нажать f5 несложно, и юзеры обычно уже знают как в браузере выглядит проблема с недоступностью инета/сервера..
Отредактировано 18.07.2020 9:07 MadHuman . Предыдущая версия .
Re[7]: Надёжное обновление страницы
От: vsb Казахстан  
Дата: 18.07.20 09:47
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

vsb>>Ну это делается не через innerHTML, но концептуально да.

MA> Дак я и спрашиваю через что конкретно предлагается.6

Насколько я помню, через document.open/write/close. тут
Автор: vsb
Дата: 17.07.20
. Думаю, это уже детали.
Re[8]: Надёжное обновление страницы
От: Mystic Artifact  
Дата: 18.07.20 10:34
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Насколько я помню, через document.open/write/close. тут
Автор: vsb
Дата: 17.07.20
. Думаю, это уже детали.


Вооот. Но это важные детали. Перезаписывание документа не приводит к сбросу/инициализации глобального состояния / контекста JS, что в общем случае может иметь негативные последствия.

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

PS: Ну да, типа таймеров. Вижу ты в курсе, хорошо.
Отредактировано 18.07.2020 10:43 Mystic Artifact . Предыдущая версия .
Re[9]: Надёжное обновление страницы
От: vsb Казахстан  
Дата: 18.07.20 13:36
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA> Как альтернативная идея — можно грузить контент в iframe, нормальным образом, и делать его видимым, когда будет установлен факт, что все загрузилось.


Может быть фреймы и лучше, я просто плохо представляю, какие там ограничения. Если получится реализовать требуемый функционал, с отловом ошибок и тд, то да, я бы тоже за фреймы был.
Отредактировано 18.07.2020 13:37 vsb . Предыдущая версия .
Re[2]: Надёжное обновление страницы
От: · Великобритания  
Дата: 19.07.20 09:49
Оценка:
Здравствуйте, Reset, Вы писали:

R> // Тут слушаем веб сокет, переоткрываем его при отключении, читаем команду на перезагрузку рабочей страницы и, возможно, на перезагрузку себя

Задача надёжной перезагрузки страницы превратилась в задачу надёжной перезагрузки страницы-сторожа... Но так и не решена.
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[12]: Надёжное обновление страницы
От: · Великобритания  
Дата: 19.07.20 09:53
Оценка:
Здравствуйте, bnk, Вы писали:

bnk> Понятно. Может тогда проще такое не средствами браузера сделать, а через (внешний) скрипт например?

bnk> Типа если это все равно устройство, там же может есть сервисы, поставить cron job, или что там есть. Пусть скачает папку, да запустит из нее новую версию если все ОК.
bnk> Все равно такое думается лучше перезапускать, мало ли зависнет.
В таком случае проще просто desktop-приложение написать. А хотелось бы чтобы эту же страницу могли и юзеры открывать у себя в окошке и им не требовалось какие-то доп-манипуляции делать.
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Надёжное обновление страницы
От: · Великобритания  
Дата: 19.07.20 10:06
Оценка:
Здравствуйте, vsb, Вы писали:

vsb> Заменяешь всю страницу новым текстом. Что-то вроде document.open(); document.write(newHtml); document.close();

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

vsb> Старые таймеры будут тикать, да, могут быть непредвиденные спецэффекты. Хотя, думаю, в целом вероятность таковых невелика. Если это важно, можно переопределить setTimeout/setInterval и вести учёт всех таймеров, чтобы отменить их перед заменой документа.

Я использую webpack и npm-либы всякие, хз что и как они делают, какие глобальные переменные используют и где что может утекать через глобальные переменные...

В общем да, в целом понятно, что с чистым web-приложением нормального решения нет. Буду копать service workers...
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Надёжное обновление страницы
От: varenikAA  
Дата: 20.07.20 06:56
Оценка:
Здравствуйте, ·, Вы писали:

·>Как правильно сделать надёжное обновление?


Зачем? Судя по описанию, единственный кейс — люди подходят к монитору без клавы/мышки посмотреть?
Т.е. видимо там происходит какое-то движение на экране. 100% гарантии нет, но если запилить скрипт с вебсокетом, которые сам переподключается в случае ошибки,
то инфу за которой ходят юзеры можно присылать с сервера чуть ли не картинкой по тому же сокету.
А вообще, конечно все очень странно.
Упрощай, не позволяй просочиться сложности в задачу.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.