ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
22 июля
1062484 Топик полностью
fk0, легенда (18.12.2020 23:49, просмотров: 487) ответил SciFi на Вопрос по веб-интерфейсам. Скажем, железяка выдаёт статические файлы HTML и Javascript, ну и динамические JSON. Хочется, чтобы статические кешировались в браузере, как принято в приличном обществе. Но также хочется, чтобы после обновления прошивки не нужно было заставлять юзверя делать принудительный рефреш (HTML и JS поменялись, с кешированными версиями веб-интерфейс будет глючить). Какие есть способы этого добиться? Натыкался на такой вариант:
Вообще-то браузер должен делать запрос HEAD /file.html и сравнивать ответ с атрибутами file.html, и если что-то поменялось -- уже делать GET и получать новый файл. Только вот по-моему какие-то проблемы с этим были... да, менять имя файла в URL или параметры GET-запроса (после '?') -- самый верный способ. Но вообще это уже не модно, не молодёжно, и не современно. Сейчас модные и прогрессивные веб-аппликации вообще без интернета умеют. 

Во-первых кеш-манифест: https://en.wikipedia.org/wiki/Cache_manifest_in_HTML5

Но когда я с ним сталкивался, у меня как раз была такая история, что нет сети -- загрузило из кеша, запустилось, сеть появилось -- обновление хрен загрузит. С тех пор много воды утекло, так что уже не скажу что там как. И вот эти Update и т.п. из манифеста через ()() работали.


Во-вторых можно аппликацию склеить в огромный блоб (внутрь html вставить все ресурсы: скрипты, другие html, шрифты, иконки) и сжать... Да можно и по кусочкам хранить и не сжимать. Но сам факт, что веб-аппликацию можно самостоятельно загружать (и не натыкаться на глюки кеширования браузера) и самостоятельно же сохранять в web storage: https://en.wikipedia.org/wiki/Web_storage

Т.е. идея такая: грузишь вначале маленькую html-ку в которой лоадер. Который грузит тебе веб-аппликацию и сохраняет в web-storage. Сам лоадер (в отличии от аппликации) практически никогда не обновляется и кешируется через манифест (см. выше). Лоадер следовательно всегда быстро стартует (даже без сети, единожды загруженный), вытаскивает из web storage аппликацию и запускает. И всё, интернет не нужен! А уже в коде самой аппликации есть логика, которая лазает на сервер, если есть интернет, и подпольно, или явно, как удобнее, вытягивает блоб с новой аппликацией (лучше таки склеить и пожать, чтоб через GPRS нормально работало) и перезапускает сама себя.


Обновление, соответственно возможно путём обновления блоба на сервере. Не трогая лоадер. Ну а если аппликация настолько сломалась, что не может самообновиться (можно сделать, чтоб при критических ошибках тупо запускался лоадер и качал всё сначала вообще-то), то всегда можно сам лоадер обновить и через манифест и кеш он рано или поздно скачается (ну или юзер кеши почистит на худой конец).


Сейчас оно вроде как называется "прогрессивное веб-приложение" ( https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%B2%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5 ),

а когда я пытался что-то делать, то такого понятия не знал и делал по-наитию. Может сейчас оно всё как-то лучше можно сделать, я не вникал. Но собственно не думаю, что нужны какие-то супер-пупер фреймворки, javascript и html самодостаточны. Единственное, на мой взгляд, что позитивного с того времени изменилось:


1) появились web workers: https://en.wikipedia.org/wiki/Web_worker

и появились нотификации (работают с помощью worker'ов): https://en.wikipedia.org/wiki/Push_technology http://caxapa.ru/1037587


2) появился web-assembly: реально ЭТО БОМБА, АТОМНАЯ, по этой теме нужно делать отдельный сводный-системный топик. Реально Web Assembly -- это супер-пупер мета-технология на уровень выше, чем многое, что сейчас условно модно и популярно. Просто пока даже полного понимания не пришло, что же родилось. Но оно может начисто вымести с рынка все другие технологии desktop-аппликаций, мне уже очевидно. И не только. Оно так же конкурирует с виртуальными машинами и managed-языками вроде Java и C#. И даже превосходит. Качественно. Причём родилось оно случайно, примерно так же, как и мета-программирование в C++. Но я уже уверен, что в недалёком будущем "программа для компьютера" -- это будет программа для виртуальной машины web-assembly. На "голом компьютере" никто ничего запускать не будет. А писать будут на тех же C, C++, Dart, Go, Rust, Python и C#... Но уже в песочнице.


Практически сейчас web-assembly позволяет относительно тяжёлый, сложный и т.п. код компилировать на C/C++ и т.п. (список расширяется...) в бинарь который может работать внутри браузера. Если то же самое на javascript делать сложно и неудобно (в основном по причине того, что javascript -- язык с динамической типизацией, а хочется несколько более дуракоустойчивое программирование).


Вдогонку: обновление веб-аппликации может осуществляться не загрузкой целиком новой, а загрузкой только бинарного диффа. Который может применяться к устаревшей версии и таким образом может получаться новая версия. Размер обновления может быть на порядок меньше всей веб-аппликации! На сервере соответственно хранить набор файликов: OLDVER-NEWVER.bin. Ссылка по теме: http://caxapa.ru/897519

[ZX]