Где находится favicons sqlite для очистки истории браузера
Решил все-таки написать статью про SQLite, в которой хочу обобщить свой 3-х летний опыт использования этой БД под Windows. Вижу, что тема популярная, но информации мало.
Что такое SQLite?
SQLite — это встраиваемая кроссплатформенная БД, которая поддерживает достаточно полный набор команд SQL и доступна в исходных кодах (на языке C).
Исходные коды SQLite находятся в public domain, то есть вообще никаких ограничений на использование.
Текущая версия: 3.7.13
SQLite можно скомпилировать самому, но я скачиваю ее уже скомпилированную в виде Windows DLL.
Для собственной сборки обычно скачивают т.н. «amalgamation»,
т.е. исходники SQLite в виде единого файла на языке C + sqlite3.h.
Чтобы уменьшить размер кода SQlite, выкинув ненужные ништяки, используются всякие DEFINE.
Насколько SQLite популярна?
Кратко: она везде. Как минимум, на любом смартфоне.
Насколько она надежна?
Очень. При выпуске версии она проходит через ряд серьезнейших автоматических тестов (проводится ~ 2 млн тестов), покрытие кода тестами 100% (с августа 2009).
А какие еще инструменты дают разработчики?
Доступна консольная утилита для работы с базами (sqlite3.exe, «a command-line shell for accessing and modifying SQLite databases»).
И все?
Да, от основных разработчиков — все. Однако, другие люди пишут всякие менеджеры и пр.
Лично я так и не нашел идеального и пользуюсь консолью.
Что значит «достаточно полный набор SQL»?
Как известно, в своем развитии SQL устремился в разные стороны. Крупные производители начали впихивать всякие расширения. И хотя принимаются всякие стандарты (SQL 92), в реальной жизни все крупные БД не поддерживают стандартов полностью + имеют что-то свое. Так вот, SQLite старается жить по принципу «минимальный, но полный набор». Она не поддерживает сложные штуки, но во многом соответствует SQL 92.
И вводит некие свои особенности, которые очень удобны, но — не стандартны.
Что конкретно в поддержке SQL может вызвать недоумение?
Нельзя удалить или изменить столбец в таблице (ALTER TABLE DROP COLUMN…, ALTER TABLE ALTER COLUMN… ).
Есть триггеры, но не настолько мощные как у крупных RDBMS.
Есть поддержка foreign key, но по умолчанию — она ОТКЛЮЧЕНА.
Нет встроенной поддержки UNICODE (но ее, вообщем, нетрудно добиться).
Нет хранимых процедур.
А что своего хорошего или необычного?
Не понял — что там с типом? Зачем нужен тип столбца тогда вообще?
Тип столбца определяет как сравнивать значения (нужно же их привести к единому типу при сравнении, скажем, внутри индекса).
Но не обязывает заносить значения именно такого типа в столбец. Нечто вроде weak typing.
Допустим, мы объявили столбец как «A INTEGER».
SQlite позволяет занести в этот столбец значения любого типа (999, «abc», «123», 678.525).
Если вставляемое значение — не целое, то SQlite пытается привести его к целому.
Т.е. строка «123» превратится в целое 123, а остальные значения запишутся «как есть».
Так можно вообще не задавать тип столбца?
Очень часто так и делается: CREATE TABLE foo (a,b,c,d).
А как с архитектурой? Сервера-то нету?
Сервера нету, само приложение является сервером. Доступ к БД происходит через «подключения» к БД (нечто вроде хэндла файла ОС), которые мы открываем через вызов соот-й функции DLL. При открытии указывается имя файла БД. Если такого нету — он автоматически создается.
Допустимо открывать множество подключений к одной и тоже БД (через имя файла) в одном или разных приложениях.
Система использует механизмы блокировки доступа к файлу на уровне ОС, чтобы это все работало
(эти механизмы обычно плохо работают на сетевых дисках, так что не рекомендуется использовать SQlite с файлом на сети).
Изначально SQlite работал по принципу «многие читают — один пишет».
То есть только одно соединение пишет в БД в данный момент времени. Если другие соединения попробуют тоже записать, то словят ошибку SQLITE_BUSY.
Можно, однако, ввести таймаут операций. Тогда подключение, столкнувшись с занятостью БД, будет ждать N секунду прежде, чем отвалиться с ошибкой SQLITE_BUSY.
И как быть?
Либо одно подключение и все запросы через него, либо исходить из возможного таймаута и предусмотреть повтор выполнения SQL.
Есть и еще одна возможность: не так давно появился новый вид лога SQlite: Write Ahead Log, WAL.
Если включить для БД именно этот режим лога, то несколько подключений смогут одновременно модифицировать БД.
Но в этом режиме БД уже занимает несколько файлов.
Ну понятно теперь почему SQLite — ужасна, ведь у нее нет ГЛОБАЛЬНОГО КЭША?
А почему все жалуются, что SQLite — тормозит?
Две причины. Первая — настройки по умолчанию. Они работают на надежность, а не на производительность.
Вторая — непонимание механизма фиксации транзакций. По умолчанию после любой команды SQlite будет фиксировать транзакцию (то есть ожидать пока БД окажется в целостном состоянии для отключения питания). В зависимости от режима паранойи SQLite потратит на это от 50 до 300 мс (ожидая окончания записи данных на диск).
Что делать-то? Мне нужно вставить 100 тыс записей и быстро!
Удалить индексы, включить режим синхронизации OFF (или NORMAL), вставлять порциями по N тысяч (N — подобрать, для начала взять 5000). Перед вставкой порции сделать BEGIN TRANSACTION, после — COMMIT.
А вот я нашел ошибку! Как рапортовать?
Лично у меня возникла ситуация, которую я трактовал как дефект SQLIte. Я описал это в рассылке. В следующей версии поведение SQLite было исправлено.
Некоторые пользователи сталкиваются со странной проблемой в Mozilla Firefox, когда они видят неправильный значок для каждого сайта, который они добавили в закладки. Например, вместо отображения значка Reddit для тем, отмеченных закладкой Reddit, в браузере отображается значок YouTube (или что-то еще). Эта проблема, похоже, не связана с конкретной версией Windows, так как сообщается, что она возникает в Windows 7, Windows 8 и Windows 10.
Firefox неверные значки внутри панели закладок
Что вызывает проблему с иконками в Firefox?
Мы исследовали эту конкретную проблему, изучив различные пользовательские отчеты и стратегии исправления, которые обычно используются для устранения этой конкретной проблемы на компьютерах Windows. Как выясняется, есть несколько разных причин, почему эта конкретная проблема возникает:
Если вы в настоящее время пытаетесь решить эту конкретную проблему, эта статья предоставит вам несколько шагов по устранению неполадок. Ниже вы найдете несколько различных возможных исправлений, которые другие пользователи в аналогичном сценарии успешно использовали для решения проблемы.
Для достижения наилучших результатов мы рекомендуем вам следовать методам в том порядке, в котором они представлены. Даже если не все исправления применимы к вашему сценарию, все равно стоит придерживаться структуры при устранении неполадок — просто не забудьте Откажитесь от методов, которые не относятся к вам.
Метод 1: Обновление Firefox до последней версии
Эта конкретная проблема почти так же стара, как сам браузер. Firefox выпустил несколько обновлений, которые включали исправление для этой проблемы, но некоторые пользователи все еще сталкиваются с ним в последних сборках. Однако, поскольку проблема была решена, вы должны начать с того, что убедитесь, что используете последнюю версию Firefox. Начиная со сборки 58, разработчики объявили, что они исправили большинство экземпляров, которые, как известно, вызывают эти конкретные проблемы.
Хотя это не обязательно решит проблему, если ваши значки уже испорчены, это гарантирует, что это не повторится в будущем. Вот краткое руководство по обновлению Firefox до последней версии:
- Откройте Firefox и нажмите кнопку действия в правом верхнем углу.
- Затем в появившемся меню нажмите на Помогите и выберите О Firefox.
- В следующем окне дождитесь загрузки обновления, затем нажмите Перезапустите, чтобы обновить Firefox начать процесс обновления.
Обновление Firefox - После завершения процесса обновления перезагрузите компьютер и посмотрите, была ли проблема решена.
Если ваш браузер Firefox уже был обновлен до последней версии или этот метод не исправил ваши сломанные значки, перейдите к следующему способу ниже.
Способ 2: добавление ‘/’ за ссылкой
Это может показаться глупым исправлением, но многие затронутые пользователи сообщают, что простое добавление в конце URL-адреса перед его посещением в конечном итоге решило проблему для них. Однако некоторые пользователи сообщали, что это исправление было временным, поскольку проблема вернулась спустя несколько дней.
Исправление сломанных значков с помощью ‘\’
Если эта проблема оказалась неэффективной или вы ищете постоянный подход, перейдите к следующему способу ниже.
Способ 3: удаление файла favicons.sqlite
Самое быстрое и эффективное решение, которое решит проблему в большинстве случаев, это просто перейти к Данные приложения папку Firefox, найдите папку своего профиля и удалите имя файла favicons.sqlite пока Firefox закрыт.
Этот процесс заставит Firefox создать новый файл favicon .sqlite при следующем запуске браузера. Но имейте в виду, что после завершения этой операции все ваши закладки будут иметь общий значок. Только после того, как вы перейдете в закладки, иконка будет обновлена до избранного сайта.
Вот краткое руководство по устранению проблемы путем удаления favicons.sqlite файл:
- Убедитесь, что Firefox и все связанные надстройки полностью закрыты.
- использование Проводник перейти к следующему месту:
Замечания: Имейте в виду, что * YourUsers * а также *Твой профиль* являются просто заполнителями и должны быть заменены вашей собственной информацией. Так же Данные приложения папка будет скрыта по умолчанию — если вы еще не сделали скрытые папки видимыми — используйте ленту в верхней части окна проводника, чтобы нажать Посмотреть, затем убедитесь, что поле, связанное с Скрытые предметы проверено.
Если вы все еще сталкиваетесь с той же самой проблемой, перейдите к следующему способу ниже.
Способ 4: очистка веб-кэша
Другим способом решения этой проблемы является очистка веб-кэша Firefox. Подобно первому способу, это заставит его загружать значки заново. Несколько пострадавших пользователей сообщили, что этот метод наконец-то позволил им решить проблему навсегда.
Вот краткое руководство о том, как очистить веб-кеш Firefox, чтобы решить проблему с фавиконами:
Очистка веб-кэша Firefox
Если вы все еще сталкиваетесь с этой проблемой или ищете способ изменить свои значки вручную, перейдите к следующему способу ниже.
Способ 5: принуждение Firefox к обновлению значков
Вот что вам нужно сделать:
Замечания: Вы получите ошибку, но это нормально, так что не пугайтесь. Шаги, которые мы только что сделали, приведут к истечению срока действия всех значков.
Принудительное истечение срока действия существующих значков
Способ 6: исправление уязвимых фавиконов вручную
Этот метод идеально подходит для тех случаев, когда вы имеете дело только с одним или несколькими сломанными значками. Вот краткое руководство по исправлению уязвимых значков вручную:
- Откройте Firefox и нажмите закладка значок в правом верхнем углу экрана.
- В появившемся меню нажмите на закладки а затем нажмите на Показать все закладки в правой нижней части экрана.
- Внутри Библиотека меню, выберите Панель закладок слева, затем перейдите к Импорт и резервное копирование и выбрать Экспорт закладок в HTML.
- Выберите подходящее место для экспортируемого файла HTML, затем нажмите Сохранить кнопка.
- Щелкните правой кнопкой мыши HTML-файл, который вы только что экспортировали, и отредактируйте его с помощью такой утилиты, как Notepad ++ или похожие. Вы также можете использовать встроенную утилиту блокнота, но код не будет таким читабельным.
- После открытия страницы закладок найдите соответствующую запись в закладке и измените соответствующую ICON_URI =» а также ИКОНА =»данные: изображения / PNG; base64, <> Данные с правильным URL-адресом значка и 64-значным значком. Посмотрев на имя, вы сможете определить, какой ICON принадлежит к какому значку.
- Убедитесь, что вы сохранили изменения, которые вы только что сделали, на странице закладок, которую вы ранее экспортировали.
- Вернуться к Библиотека окно (шаг 2), нажмите на Панель закладок, затем перейдите к Импорт и резервное копирование и выбрать Импортировать закладки из HTML
- Выберите страницу, которую вы ранее изменили и нажмите Открыто.
Редактирование Firefox favicon’s вручную
После завершения этого процесса ваши иконки favicon должны быть исправлены.
Захотел мой друг установить себе FireFox. И не просто установить, а так чтобы было «как у тебя». У FireFox есть встроенный инструмент, для публикации списка установленных дополнении. Я тут же им воспользовался и опубликовал свои дополнения. Но так как друг человек к ИТ не сильно близкий, хотя такой же ленивый, то куда-то там заходить, скачивать, устанавливать, настраивать ему совсем не хотелось. Говорит «зачем все это, у тебя же все на флешке, просто скопируй мне».
Пришлось призадуматься: просто скопировать нельзя, кроме настроек FireFox и его плагинов, там еще есть пароли, история посещении, избранное. Зачем ему знать по каких порносайтам я бродил. Вручную чистить не хочется. Хранится все это в файлах, а не в реестре — FireFox кроссплатформенный, а в Линуксе реестра, насколько я знаю, нет. Значит файлы, в которых это все хранится, надо попробовать заменить на файлы из свежеустановленного FireFox-а.
Задача-минимум: выяснить где FireFox хранить сохраненные пароли и историю.
Задача-максимум: составить общее мнение о назначении файлов в каталоге FireFox.
Предупреждаю сразу, все что удалось узнать — это не результат дизассемблирования, дебагинга, перевода манулов, анализа кода. Это простое сравнение каталогов, чтение в блокноте конфигов и эксперименты с заменой файлов у двух установленных FireFox-ов.
Итак, пробуем включить интуицию, благо имена там вполне осмысленные, смотрим на каталог свежеустановленного FireFox-а и видим там такие подкаталоги:
Теперь, не выключая интуицию, рассмотрим каталог профиля пользователя, в котором есть следующие подкаталоги:
bookmarkbackups — содержит файл с закладками и его бэкапы в формате JSON (то, что json легкочитаемый — враки, чуть глаза не сломал, когда открыл его в блокноте);
chrome — пользовательские css-стили;
extensions — дополнения (таков официальный перевод);
minidumps — хранит минидампы памяти, записанные при падении FireFox-а;
searchplugins — пользовательские поисковые движки;
Как видите, остались еще вопросы по некоторым файлам. По другим файлам я не уверен, что они выполняют именно ту роль, которая здесь им приписана. Надеюсь что кто-то сможет дополнить в комментариях или напишет свой пост о внутреннем устройстве любимого нами Огненного Лиса. И может новой его версии, которую нам обещают в феврале. Удачного все сёрфинга.
Заказывай стафф с атрибутикой Mozilla и. пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!
№1 09-07-2008 11:50:12
"Разрастание" Firefox на накопителе: urlclassifier3.sqlite > 40 Мб!
Хочу описать одну интересную ситуацию.
Несколько лет подряд работаю на разных версиях FF Portable, расположенном (в криптоконтейнере) на USB-флешке, зашифрованной при помощи Truecrypt (тремя алгоритмами - Serpent-Twofish-AES).
Флешка старенькая, есть у меня в хозяйстве и побольше, однако я дорожу именно ею из-за скорости чтения / записи.
Сам криптоконтейнер - это обычный файл, размером в 100 Мб, в котором поместились portable-варианты Firefox, Thunderburd, Eraser и Password Save.
Недавно стал замечать, что катастрофически теряю место в криптоконтейнере.
Т.е. вначале было свободно примерно 50 Мб, но когда осталось примерно 1-2(!), тут я уже заинтересовался ситуацией.
Кэш в ФФ я не включаю в принципе, количество сохраненных резервных копий букмарков у меня сведено к единице, количество резервных копий паттернов в Ад-Блок Плюс - тоже стоит на единице. Личные данные, накопленные во время сессии, автоматически стираются при выходе из ФФ.
И тут я вспомнил про две опции в ФФ - информировать, подозреваются ли сайты:
1) в атаках;
2) в имитации других сайтов.
И обычным виндовым поиском я обнаружил, что файлик urlclassifier3.sqlite разросся у меня до размеров. больше чем в 40 Мб! Стал экспериментировать - выключил эти обе опции, перезагрузил ФФ - результат тот же - т.е. на диске свободного пространства не прибавилось.
Пришлось удалять вручную.
После перезагрузки ФФ сам автоматически создал такой же файл, но размером уже в 32 кб.
Короче говоря, если кто-то столкнется со случаем немотивированного "разрастания" ФФ на носителе - копайте в эту сторону.
В Firefox Portable этот файлик сидит в: . \FirefoxPortable\Data\profile
Project Rosenfox: Pure, fast and secure inner settings for Mozilla Firefox. Global and complete manual on GitHub.
Статья состоит из двух частей: теоретической и практической.
В теоретической части мы кратко рассмотрим карту импортов и более подробно Clear-Site-Data .
В практической части мы поднимем два сервера — один будет запускаться локально и, помимо прочего, обслуживать статические файлы нашего приложения, другой мы развернем на Heroku . Сначала мы запросим данные (включая куки) от серверов, сохраним эти данные в браузере с помощью трех наиболее популярных механизмов (локальное хранилище, индексированная база данных и интерфейс кеширования), затем попробуем очистить их с помощью заголовков Clear-Site-Data . Для разрешения путей импортируемых в приложении модулей мы будем использовать карту импортов.
Исходный код проекта находится здесь.
Ресурсы
О механизмах для хранения данных на стороне клиента, которые мы будем использовать в приложении, я рассказывать не буду. Вот ссылки на отличные ресурсы, посвященные каждому из них:
Инструменты
При разработке приложения мы будем использовать несколько инструментов, основными из которых являются следующие:
Теория
Карта импортов
Карта импортов (imports map) позволяет использовать так называемые голые спецификаторы импорта (bare import specifiers) в инструкциях import и выражениях import() без участия сборщиков типа Webpack или других инструментов для разрешения путей импортируемых модулей во время выполнения кода.
Предположим, что в нашем проекте используются библиотека lodash и утилита very-simple-fetch :
Для того, чтобы импортировать эти модули без помощи "бандлера", необходимо указать полный путь к соответствующим файлам, хранящимся в директории node_modules :
Карта импортов позволяет связать кастомные ключи — названия модулей — с их расположением. Для этого в теге с типом importmap определяется объект с ключом imports и парами ключ / значение, где значение — это путь к модулю, а ключ — синоним (алиас) для этого пути:
После определения карты импортов, у нас появляется возможность импортировать наши модули следующим образом:
Карты импортов также предоставляют много других интересных возможностей. К сожалению, в настоящее время они поддерживаются только Chrome . Если вы пользуетесь другим агентом, при разработке приложения в практической части статьи импортируйте модули напрямую из node_modules .
Clear-Site-Data
Данный заголовок принимает следующие директивы:
Директивы могут указываться как по одной:
так и через запятую:
Последний пример аналогичен следующему:
К сожалению, в настоящее время данный заголовок не поддерживается Safari (ох уж этот современный IE :)).
Вот как это должно работать в теории. Скоро мы выясним, что на практике это работает немного по-другому, а кое-что и вовсе не работает.
Практика
Фронтенд и локальный сервер
Создаем директорию для проекта, переходим в нее, инициализируем проект и устанавливаем зависимости:
Создаем файл server.js для локального сервера и директорию public для статических файлов, а в ней файлы index.html , style.css и script.js :
Не забудьте создать файл .gitignore с node_modules .
Начнем с public/index.html . Создаем контейнер для UI и секцию с кнопками для взаимодействия с локальным сервером:
Обратите внимание на атрибуты data-action кнопок. Это небольшая хитрость позволит нам сильно упростить и сократить код скрипта. А по классам, вы, наверное, догадались, какой CSS-фреймворк мы используем для стилизации.
Добавляем карту импортов для модулей very-simple-fetch и idb :
Честно говоря, поиск нужного файла в директории node_modules — занятие не из приятных. К тому же приходится искать не просто основной файл, но нужную версию файла. Например, ES-модуль idb хранится в директории esm .
Подключаем наш скрипт с типом module :
С вашего позволения файл со стилями style.css я пропущу.
Переходим к public/script.js .
Давайте подумаем, что должен делать наш скрипт.
Вот мои идеи на этот счет:
- записать данные в локальное хранилище
- записать данные в индексированную БД
- записать данные в кеш с помощью Cache API
- получить куки от локального сервера
- при нажатии кнопки отправлять на сервер запрос, в ответ на который сервер будет устанавливать заголовок Clear-Site-Data с соответствующей директивой.
Приступим к реализации ( // -> — означает сигнатуру):
Обратите внимание на то, как мы формируем URL запроса. Мы добавляем к адресу сервера значение атрибута data-action кнопки. Это первая половина хитрости.
Теперь займемся сервером ( server.js ).
Что он должен делать?
Я хочу, чтобы он делал следующее:
Мы передаем клиенту куки вместе с загружаемыми модулями. Получается, что мы делаем это дважды, но это не критично. Поскольку у нас один домен и названия куки совпадают, мы в итоге получим только одно куки.
Обратите внимание на то, как мы извлекаем тип операции — директиву для Clear-Site-Data — из тела запроса. Мы разбиваем строку в массив по символу - и извлекаем второй элемент (элемент по индексу 1). Таким образом, если сервер получил clear-storage , то типом операции (директивой) будет storage .
Также обратите внимание на то, что директива должна быть закавычена, причем кавычки обязательно должны быть двойными ( " ).
Пришло время запустить сервер и убедиться в том, что все работает.
Добавляем в файл package.json команду для запуска сервера для разработки:
Выполняем эту команду в терминале:
Открываем инструменты разработчика, переходим в раздел Application (“Приложение”) и проверяем, что все наши данные успешно сохранены в браузере:
Видим, что данные из локального хранилища, индексированной БД и локального кеша были успешно удалены.
Кажется, что все хорошо, однако нажатие кнопки Reload contexts приводит к возникновению ошибки:
Текст ошибки говорит нам о том, что браузер не может распознать тип операции (тип данных для очистки).
Дело в том, что директива "executionContexts" в настоящее время поддерживается только Samsung Internet , т. е. можно сказать, что не поддерживается. В сети можно найти информацию о том, что данная директива, скорее всего, будет удалена из спецификации.
Дальше интересней: нажатие кнопки Clear all site data также приводит к ошибке:
Хотя должно приводить к очистке данных всех типов.
Здесь мы имеем дело с багом Chrome . Вот все, что мне удалось найти по данному багу. Кажется, в ближайшее время никто не собирается его фиксить.
В Firefox это работает:
Кажется, что эти директивы правильно интерпретируются браузером, т. е. приводят к очистке данных указанного типа.
Но что насчет определения принадлежности данных к источнику ответа перед их очисткой? Для того, чтобы убедиться в том, что удаляются только такие данные необходимо поднять еще один сервер. Для чистоты эксперимента развернем этот сервер на Heroku .
Удаленный сервер
Начнем с самого сервера. Создаем для него директорию, переходим в нее, инициализируем проект и устанавливаем зависимости:
Определяем команду для запуска сервера в package.json :
Создаем файл index.js следующего содержания:
- origin — заголовок Access-Control-Allow-Origin
- credentials — заголовок Access-Control-Allow-Credentials
- allowHeaders — заголовок Access-Control-Allow-Headers
Без этих настроек и еще одной на клиенте мы не сможем получить куки от "удаленного" сервера.
Для того, чтобы иметь возможность разворачивать приложения на Heroku , необходимо создать там аккаунт, а также глобально установить heroku-cli :
Инициализируем репозиторий и добавляем в него файлы приложения:
Создаем проект на Heroku :
Проверяем, что наш проект привязан к Heroku-проекту, и отправляем файлы:
Полную инструкцию по деплою приложения на Heroku можно найти здесь.
Добавляем в public/index.html раздел с кнопками для взаимодействия с удаленным сервером:
И вносим несколько изменений в public/script.js :
В разделе Application находим кешированные данные и куки от heroku:
И это не баг Chrome (или баг не только Chrome ), точно такой же результат мы получаем в Firefox :
Директива * также не удаляет кешированные данные, полученные от heroku:
К сожалению, по этой проблеме информации найти не удалось. Если вдруг вы знаете, в чем дело, пожалуйста, сообщите в комментариях.
Вывод
Итак, что мы имеем в сухом остатке?
Карта импортов в настоящее время поддерживается только Chrome . Будет ли она поддерживаться другими браузерами, и, если будет, когда это произойдет, неизвестно. Поэтому, несмотря на интересные возможности, использовать ее при разработке реальных приложений пока нельзя.
Что касается заголовка Clear-Site-Data , то, в целом, он неплохо справляется со своей задачей, однако тот факт, что он не поддерживается Safari , а также учитывая баг в Chrome и не очень понятное поведение браузеров по очистке кешированных данных, говорить о возможности его использования в продакшне также преждевременно.
Читайте также: