Проблема с кэшированием при асинхронной загрузке JavaScript с событием onload - PullRequest
3 голосов
/ 09 сентября 2010

В настоящее время я пытаюсь загрузить некоторые js-файлы асинхронно, чтобы они не могли блокировать остальную часть сайта. Я в основном следовал описаниям, найденным здесь:

Асинхронный Javascript

С точки зрения неблокирующей загрузки файла javascript это прекрасно работает, но у меня возникла проблема, что файл javascript кэшируется и остается в кэше, даже если я изменяю содержимое (также выполнение shift-reload ничего не помогает) .

Мой текущий код загрузки скрипта выглядит следующим образом:

 (function() {
   function xx_async_load() {
     var xx = document.createElement('script');
     xx.type = 'text/javascript';
     xx.async = true;
     xx.src = 'http://myserver.de/myjs.js';
     var el = document.getElementsByTagName('script')[0];
     el.parentNode.insertBefore(xx, el);
   }

   if (window.addEventListener) {
     window.addEventListener('load', xx_async_load, false);
   } else if (window.attachEvent){
     window.attachEvent('onload', xx_async_load);
   }

 })();

Если я вызываю код внутри «xx_async_load» напрямую и изменяю myjs.js, изменения распознаются, но если я загружаю это через событие onload, оно всегда остается в кэше, а измененные никогда не распознаются.

Кто-нибудь знает решение, как заставить браузер распознавать изменения в кэшированных файлах (проблема возникает в Opera, FF и IE работают нормально)?

РЕДАКТИРОВАТЬ: Если я смотрю на вкладку «Сеть» Operas Dragonfly, даже не делается запрос на перезагрузку для кэшированного файла JS, кажется, что он непосредственно загружает его из кэша даже не проверяя файл на сервере.

EDIT2: Я проверю, как долго он остается в кеше. Если его нет до завтра, то все в порядке. В противном случае я все еще могу предложить обходной путь с параметром даты (поэтому принимаю этот ответ). Спасибо еще раз.

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010

Да, это довольно просто.

Просто укажите случайный параметр для вашего URL, например: URL = http://www.yoururl.com -> http://www.yoururl.com/?number=(random число)

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

Дайте мне знать, помогло ли это

1 голос
/ 09 сентября 2010

Хороший способ решить эту проблему - вычислить md5 () содержимого файла, а затем добавить это значение к URL-адресу в качестве параметра.Таким образом, файл продолжает кэшироваться до тех пор, пока содержимое файла остается одним и тем же.

Другой способ - контролировать поведение кэширования сценария с помощью HTTP-заголовков, таких как ETag, или уменьшить максимальное время истечения срока действия кэша..

0 голосов
/ 08 января 2013

Ознакомьтесь с директивами Apache для управления кэшем ....

Вы, вероятно, хотите что-то подобное в своем файле apache.conf или в файле .htaccess

Пример расскажетбраузер для кэширования файла JS и не проверяет наличие новой версии, пока не пройдет 7 дней

<Directory "C:/apache_htdocs">
    #
    # Enable caching for static files
    # A86400  = Access + 01 days
    # A604800 = Access + 07 days

    <FilesMatch "\.(js)$">
        ExpiresActive On
        ExpiresDefault                            A604800
        ExpiresByType application/x-javascript    A604800
        ExpiresByType application/javascript      A604800
        ExpiresByType text/javascript             A604800

        Header set Cache-Control "public, max-age=604800, pre-check=604800"
    </FilesMatch>
</Directory>
...