Предотвращение кэширования браузером ресурсов приложения UI5

У нас есть приложение SAPUI5, развернутое на SAP PO. Проблема в том, что всякий раз, когда мы вносим изменения и развертываем новую версию нашего приложения, изменения не отражаются, и нам нужно выполнить жесткую перезагрузку и очистить кеш браузера, чтобы получить новые изменения.

Это вызывает много проблем, так как мы не можем просить клиентов очищать кеш после каждого изменения.

Ниже приведены неудачные методы, которые мы пробовали до сих пор:

  1. Включение «resources/sap-ui-cachebuster/sap-ui-core.js» в начальной загрузке SAPUI5.

  2. Использование «Application Cache Buster» для ресурса приложения (с использованием sap-ui-cachebuster-info.json)

  3. Установка заголовка HTML для отсутствия кеша:

<meta http-equiv='cache-control' content='no-cache, no-store, must-revalidate'>
<meta http-equiv='Expires' content='-1'>
<meta http-equiv='Pragma' content='no-cache'>
  1. Очистите файлы cookie с помощью следующего кода:
document.cookie.split(";").forEach(function(c) { 
document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/"); 
});

Ни одно из вышеперечисленных решений пока не сработало. Вот что мы видим на вкладке «Сети» в Chrome:

введите здесь описание изображения

ПРИМЕЧАНИЕ. Приложение развернуто в SAP PO 7.4 (стек JAVA).


person Rahul Bhardwaj    schedule 24.05.2017    source источник
comment
Когда вы используете cachebuster, вы видите загружаемый файл sap-ui-cachebuster-info.json? Если да, вы должны увидеть метки времени, когда каждый файл вашего приложения был обновлен. Верны ли эти временные метки?   -  person Stephen S    schedule 24.05.2017
comment
Привет, Стивен. Я создал файл и обновил метку времени. К сожалению, sap-ui-cachebuster-info.json также читается из кеша диска.   -  person Rahul Bhardwaj    schedule 24.05.2017
comment
К сожалению, cachebuster работает с SAP NetWeaver AS для ABAP только в соответствии с этим< /а> документ   -  person Stephen S    schedule 24.05.2017


Ответы (1)


У нас была та же проблема, что и у вас, с SAP MII, и я потратил несколько месяцев на несколько вызовов OSS для SAP, чтобы предоставить приемлемое решение.

Они сделали это в SP3 SAP MII (мы еще не обновили, но я надеюсь, что их исправление правильное), но это не будет применяться в вашем случае, поскольку вы используете SAP PO, но это все еще стек Java.

Поэтому я думаю, вам следует открыть вызов OSS, рекомендуя SAP ознакомиться с примечаниями SAP:

Они, вероятно, перенаправят вас к следующей теме переполнения стека: http://stackoverflow.com/questions/118884/how-to-force-browser-to-reload-cached-css-js-files

Но это всего лишь обходной путь, веб-сервер SAP на стеке Java, похоже, работает неправильно, и они должны внести исправления.

Надеюсь, что это поможет вам.

ИЗМЕНИТЬ

Hi,

Вот обновление, есть обходной путь, который мы иногда используем. У нас есть параметр URL, который используется для определения необходимости перезагрузки страницы. Ниже приведен фрагмент кода JS, который мы встроили на страницу index.html приложения SAPUI5.

Надеюсь, что это поможет вам.

    <script>

window.onload = function () {

    version = undefined;
    fCheckVersionMatch = false;

    onInit();
};

/***************************************************************************
 * Function launch when we start the application it test
 *  - if the Reload parameters is set in the url
 *      - if we are loading an hold application with a false reload value
 ****************************************************************************/
var onInit = function() {
    checkParamReload();
};

/***************************************************************************
 * Check in the url if there is the reload value and if this value is less 
 * than the difference with the date now => avoid when using favorite link
 * to load a previous version with an incorrect time stamp
 ****************************************************************************/
var checkParamReload = function() {

    var sUrlParameters = window.top.document.location.search;
    var regexReload = /(\?|&)reload=([^&]*)/;
    var aReload = sUrlParameters.match(regexReload);
    var nTime = aReload == null ? NaN : parseInt(aReload[2]);

    if ( isNaN(nTime) || Math.abs(Date.now() - nTime) > 60000 ) {               
        // In case no reload tag is present or it's value is more than 1 minute ago, reload page
        reloadPage(true); // True means force reload => reset retry count.
    }

};

/***************************************************************************
 * Reload page and make sure the reload param is updated.
 * If force reload is used, retry count is resetted, otherwise it is
 * it is incremented up to a limit, which - in case it is reached - stops
 * the reload process and instead display an error message.
 ****************************************************************************/
var reloadPage = function (bForce) {

    var retries = 0;
    var oLocation = window.top.document.location;

    var sSearch = oLocation.search;
    sSearch = queryReplace(sSearch, "reload", _ => Date.now());
    if (bForce) {
        sSearch = queryReplace(sSearch, "retry", _ => 0);
    } else {
        sSearch = queryReplace(sSearch, "retry", function (n) {
            if (isNaN(parseInt(n))) {
                return 0;
            } else {
                retries = parseInt(n);
                return retries + 1;
            }
        });
    }

    if (retries < 10) {
        // Reload Page
        window.top.document.location.replace(oLocation.origin + oLocation.pathname + sSearch + oLocation.hash);
    } else {
        // Display error
        document.getElementById('Error').style.display = "block";
    }

};

var queryReplace = function (sQuery, sAttribute, fnReplacement) {
    // Match the attribute with the value
    var matcher = new RegExp(`(\\?|&)${ sAttribute }=([^&]*)`);
    var sNewQuery = sQuery.length < 2 ? `?${ sAttribute }=` : sQuery;
    if (sNewQuery.search(matcher) < 0) {
        // If we could not match, we add the attribute at the end
        sNewQuery += "&" + sAttribute + "=" + fnReplacement("");
    } else {
        sNewQuery = sNewQuery.replace(matcher, (_, delim, oldVal) => delim + sAttribute + "=" + fnReplacement(oldVal));
    }
    return sNewQuery;
}

</script>
person Almiriad    schedule 30.05.2017