2015-04-14 2 views
9

Я работаю над страницей Angular.js и вношу изменения в «частичный» html. Обновление страницы заставляет Firefox правильно запросить главную страницу html с сервера, но последующие «частичные» шаблоны, которые визуализируются на стороне клиента, никогда не запрашиваются повторно и вместо этого захватываются из BFCache, поэтому изменения этих файлов не являются обнаружено.Как заставить Firefox обойти BFCache для партитур Angular.JS?

Скриншот из Firebug: BFCache firebug screenshot

Я могу подтвердить с помощью сервера разработки (Джанго), что эти обертоны никогда не просил.

Я пробовал все виды обновления, включая расширение Reload Plus.

+0

Вы посмотрели на [это] (http://stackoverflow.com/questions/7248111/how-to-prevent-content-being-displayed-from-back-forward-cache-in-firefox)? Вы пытаетесь по-прежнему использовать BFCache для этих партикулов или допустимо полностью отключить использование BFCache? – Charlie

+0

Я действительно хочу использовать BFCache, я просто хочу, чтобы во время разработки иногда рассказывал Firefox, чтобы очистить кеш и перезагрузить определенные (или все) частичные. – GDorn

ответ

5

Они менее идеальны, но для решения этой проблемы есть два варианта.

Один из них - это аддон Clear Cache, который можно настроить для очистки диска и кеша памяти и перезагрузки текущей вкладки. Я не уверен, что это полностью очищает кеш или только для домена текущей вкладки, но это, вероятно, весь кеш.

Другой отключить кэш браузера в поджигатель: firebug disable cache

я не уверен, если это просто отключает кэш для текущей страницы, текущей области или во всем мире.

Было бы неплохо иметь вариант «Перезагрузить эту страницу и все, на что ссылается эта страница».

1

Я бы просто установить флаг в шаблонах, чтобы добавить простую функцию OnUnload так:

{% if CLEARBFCACHE %} <body onunload="myFunction()"> {% endif %} 

Затем установите CLEARBFCACHE = 1 (в settings.py), когда в процессе развития.

Если вам необходимо протестировать производственный набор CLEARBFCACHE = 0, то разверните его на промежуточном сервере или (если у вас нет отдельного сервера), я считаю, что вы можете изменить URL-адрес от 127.0.0.1 до locahost, чтобы заставить Firefox думать это другой сайт.

0

Другим вариантом является, чтобы ваш веб-сервер разработки отправить заголовок Cache-Control, по крайней мере, HTML файлы:

Cache-Control: no-cache, max-age=0, must-revalidate, no-store 

Источник: How to Defeat the Browser Back Button Cache

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

0

Потому что вы делаете одностраничное приложение. Поэтому правильным решением должно быть:

(1) установить физическую страницу (то есть главную страницу) в «Cache-Control: No-cache». Физическая страница должна быть небольшой, так как логические страницы динамически загружаются JavaScript, поэтому загрузка физической страницы должна быть быстрой.

(2) для частичной страницы (то есть логической страницы), каждый раз меняйте имя папки при выпуске новой сборки

Например: при развертывании новой версии предположим, что физическая страница является индексом.html

Внутри index.html, все файлы шаблона JavaScript, css и angularJs находятся в папке - {{TimeStamp}}. Поскольку index.html не имеет кеша, браузер всегда будет получать последний index.html. Поскольку все JS, css и другие HTML-файлы шаблонов находятся в другой папке из последней версии. , поэтому браузер загрузит все файлы из новой папки, а не из кеша.

вы можете создать процесс сборки, чтобы сделать это автоматически: искать все js, css-файлы в index.html и заменять имя ресурса/** с активным - {{TimeStamp}}/**, а затем копировать все файлы для актива - {{TimeStamp}} из папки с активами

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

(3) для файла шаблона angularJs, так как он также загружен JS, , поэтому мы настоятельно рекомендуем использовать относительный путь (связанный с текущим JS-кодом), чтобы получить его. некоторые примеры кода JS как это:

function _getCurrentJSPath() { 
    var scripts = document.getElementsByTagName("script"); 
    var currentFile = scripts[scripts.length - 1].src; 
    var currentPath = currentFile.substr(0, currentFile.lastIndexOf('/')) + "/"; 
    return currentPath; 
} 
... 
templateUrl: _getCurrentJSPath() + 'currencyField.html', 
+0

Как настроить физическую страницу (то есть главную страницу) на «Cache-Control: No-cache»? Я читал, что теги не будут работать, и мне не повезло с ними. – CDelaney

1

Другим вариантом было бы, чтобы включать в себя частичную следующим образом:

angular 
    .module("app") 
    .directive("appPartial", function() { 
     return { 
      templateUrl: "partials/partial1.htm"+getTempStr(), 
      restrict: "E", 
      scope: {}, 
      controller: PartialController, 
      controllerAs: "vm" 
     } 
    }); 

function getTempStr(){ 
    // dev 
    return "?a=" + (new Date().getTime()).toString(); 
    // prod 
    //return ""; 
} 

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

Чтобы использовать BFCache в производственной среде, вы можете раскомментировать строку «возврат», а не другую обратную линию.

Смежные вопросы