Как обновить sh клиент INLINE javascript - PullRequest
5 голосов
/ 15 марта 2020

При использовании внешних файлов js браузеры могут быть вынуждены перезагрузить файлы. Смотрите здесь .

Недавно я обнаружил, что сценарии INLINE также кэшируются, по крайней мере, в Chrome, версия 80.0.3987.132, пример фрагмента:

<html>
    <head>
        <script>alert("I am cached!");</script>
    </head>

    <body>
        <script>alert("Me too!");</script>
    </body>
</html>

Каков способ обновления встроенные сценарии?


Обновление 1: я должен упомянуть, что веб-сервер, возвращающий содержимое, использует HTTP 2.0

Обновление 2: Решение, которое работает , - это иметь вспомогательный скрипт в качестве базы и при загрузке страницы получать «реальный» контент скрипта через ajax или через websocket, а затем добавить его в заголовок следующим образом:

function addScript(content){
    let s = document.createElement('script');
    s.innerHTML = content;
    document.head.appendChild(s);
}

Это делает работу, но не оптимально так как требуется больше запросов, чем необходимо.

Обновление 3: заголовки, отправленные из бэкэнда, похоже, не работают, используя следующие заголовки:

Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
Header().Set("Pragma", "no-cache") // HTTP 1.0.
Header().Set("Expires", "0") // Proxies.

Обновление 4: согласно ответу Jinxmcg, do c https://v8.dev/blog/code-caching-for-devs Don’t change URLs упоминает:

мы можем однажды решить связать кеши с исходным текстом, а не с исходным URL, и этот совет больше не будет действительным.

Вероятно, этот день наступил и также применяется к встроенным сценариям.


Спасибо всем за участие

Окончательное решение (работает по крайней мере в моих обстоятельствах):

1 Заголовки бэкэнда:

w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0") // HTTP 1.1.
w.Header().Set("Pragma", "no-cache") // HTTP 1.0.
w.Header().Set("Expires", "0") // Proxies.

2 Случайные строки в HTML, JS и CSS, пример:

<html>
    <head>
        <style>
            --cache-color: #8528cc; //Random hex color generated by backend
        </style>
        <script>
            console.log("<?php echo date(); ?>");
            alert("I am cached!");
        </script>
    </head>

    <body>
        <div>Hidden DIV with a random value: <?php echo date(); ?></div>
        <script>
            console.log("<?php echo date(); ?>");
            alert("Me too!");
        </script>
    </body>
</html>

Ответы [ 3 ]

7 голосов
/ 18 марта 2020

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

Однако это означает, что браузер получает HTML (включая JS) из своего кэша в вашем случае. Поэтому вы можете попробовать отправить некоторые заголовки вместе со своей страницей, которые заставят браузер не использовать кэшированную копию HTML и использовать новый html + js.

, чтобы проверить, является ли это HTML проблема с кэшем или "inline JS", заставьте ваш html динамически измениться и подтвердите, что он изменяется при refre sh, а встроенное JS выполнение - нет.

Более подробную информацию о js кеше можно найти здесь: https://v8.dev/blog/code-caching-for-devs

1 голос
/ 24 марта 2020

Рассмотрите возможность использования для своих веб-страниц директивы Cache-Control max-age .

Обычно max-age может быть установлено относительно длительное время в секундах. Это сделано для повышения производительности за счет того, что клиент часто повторно использует кэшированные файлы перед их обновлением.

Перед выпуском изменения, которое вы хотите, чтобы клиент немедленно обновил sh, отбросьте max-age. значение уменьшается до нуля или нескольких секунд. Затем дождитесь истечения первоначальной продолжительности времени max-age , чтобы все активные клиенты обновились с новым значением max-age .

По истечении этого периода ожидания проходит, pu sh обновление файла (ов) и возврат к исходному и более длинному max-age значению.

Эта последовательность заставит клиенты желать изменения желаемого изменения файла .

1 голос
/ 24 марта 2020

Использование document.createElement('script') для "refre sh" ваших скриптов - плохое решение. Возможно, что-то не так с вашим кэшированием.

Вы пробовали Cache-Control: "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"? https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

Если вы используете прокси, проверьте proxy-revalidate .

При отладке вы можете попробовать использовать Shift + F5 или удерживать Shift, пока нажмите кнопку перезагрузки, чтобы выполнить полную ссылку sh в Google Chrome. (если вы изменили свой скрипт)

...