Предотвратить RequireJS от кэширования необходимых сценариев - PullRequest
293 голосов
/ 29 ноября 2011

RequireJS, похоже, выполняет что-то внутреннее, что кэширует требуемые файлы javascript.Если я внесу изменение в один из обязательных файлов, мне придется переименовать файл, чтобы изменения вступили в силу.

Обычный прием добавления номера версии в качестве параметра строки запроса к концу имени файла не работает с requirejs <script src="jsfile.js?v2"></script>

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

Межплатформенное решение:

Я сейчас использую urlArgs: "bust=" + (new Date()).getTime() для автоматическогоочистка кэша во время разработки и urlArgs: "bust=v2" для производства, где я увеличиваю жестко запрограммированную версию num после развертывания обновленного необходимого сценария.

Примечание:

@ DustinGetz упоминал в своем недавнем ответе, что Chrome Developer Tools будет сбрасывать точки останова во время отладки, когда файлы Javascript постоянно обновляются следующим образом.Одним из обходных путей является запись debugger; в коде для запуска точки останова в большинстве отладчиков Javascript.

Решения для конкретного сервера:

Для конкретных решений, которые могут работать лучше дляваша серверная среда, такая как Node или Apache, см. некоторые ответы ниже.

Ответы [ 12 ]

0 голосов
/ 11 октября 2016

Динамическое решение (без urlArgs)

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

Выможете сохранить исходную функцию requirejs.load, перезаписать ее своей собственной функцией и снова проанализировать ваш измененный URL-адрес в исходном requirejs.load:

var load = requirejs.load;
requirejs.load = function (context, moduleId, url) {
    url += "?v=" + oRevision[moduleId];
    load(context, moduleId, url);
};

В нашем процессе сборки я использовал "gulp-rev" для сборкифайл манифеста со всеми версиями всех используемых модулей.Упрощенная версия моей задачи gulp:

gulp.task('gulp-revision', function() {
    var sManifestFileName = 'revision.js';

    return gulp.src(aGulpPaths)
        .pipe(rev())
        .pipe(rev.manifest(sManifestFileName, {
        transformer: {
            stringify: function(a) {
                var oAssetHashes = {};

                for(var k in a) {
                    var key = (k.substr(0, k.length - 3));

                    var sHash = a[k].substr(a[k].indexOf(".") - 10, 10);
                    oAssetHashes[key] = sHash;
                }

                return "define([], function() { return " + JSON.stringify(oAssetHashes) + "; });"
            }
        }
    }))
    .pipe(gulp.dest('./'));
});

. При этом будет сгенерирован AMD-модуль с номерами ревизий для moduleNames, который включен как oRevision в main.js, где вы перезаписывает функцию requirejs.loadкак показано ранее.

0 голосов
/ 09 января 2016

Это в дополнение к принятому ответу @phil mccull.

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

ПредварительноКоманды построения:

set textTemplatingPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
if %textTemplatingPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe" set textTemplatingPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
%textTemplatingPath% "$(ProjectDir)CacheBuster.tt"

enter image description here

Шаблон T4:

enter image description here

Сгенерированный файл: enter image description here

Сохранение в переменной перед загрузкой require.config.js: enter image description here

Ссылка в require.config.js:

enter image description here

...