Срок действия кеша на main.ht

Я использую require.js и r.js для упаковки своих модулей AMD. Я использую jquery и requirejs с помощью следующего синтаксиса:

<script data-main="/js/client" src="/js/external/require-jquery.js"></script>

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

Я попробовал несколько вариантов:

<script data-main="js/client.js?b=busted" src="/js/external/require-jquery.js"></script>

но теперь требуются попытки получить client.js из /, а не /js, поэтому он 404s.

Я также попытался добавить

urlArgs : "bust="+new Date().getTime()

до require.config, но, похоже, он не действует.

Я также попытался добавить то же значение к app.build.js, но когда он там, r.js больше не объединяет мои js файлы, просто угадывает их.

Каков надлежащий синтаксис для того, чтобы перегрузить cache. require? js data-main script?

Ответ 1

Как вы определяете свой require.config? Я думаю, что для его вступления в силу до того, как вы импортируете require.js, вам нужно закодировать его следующим образом:

<script type="text/javascript">
    var require = {
        baseUrl: "/scripts/",
        waitSeconds: 15,
        urlArgs : "bust="+new Date().getTime()
    };
</script>
<script data-main="app/main" src="/scripts/require.js"></script>

В частности, перед импортом require.js должен быть создан объект с именем "require".

UPDATE

Как отмечает Джесси в комментариях ниже, есть несколько улучшений, которые вы должны применить к вашему запросу {} для использования в целях производства. Вышеприведенный пример изложено из документации RequireJS и как можно меньше изменен, чтобы ответить на этот вопрос.

Вот несколько вещей, которые следует учитывать при производстве:

  • Вместо того, чтобы использовать текущую дату-время в качестве переменной кэширования, вы должны использовать номер сборки из своей среды разработки. Это позволяет вашим клиентам кэшировать Javascript между версиями, но заставит их обновлять свой кеш при каждом обновлении программного обеспечения.
  • Джесси также использует функцию {} для определения зависимостей вместо использования основного атрибута данных script. Я не знаю, если это строго лучше, но я думаю, что это более чистый вид.
  • Настройте waitSeconds на основе ваших потребностей. Я использовал значение примера из документации RequireJS, но вы должны скорректировать значение или опустить его в зависимости от ваших потребностей.

Итак, если вы применяете эти методы, ваш код может выглядеть так:

<script type="text/javascript">
    var require = {
        baseUrl: "/scripts/",
        waitSeconds: 15,
        urlArgs : "bust="+{{buildNumber}},
        deps : ['app/main']
    };
</script>
<script src="/scripts/require.js?bust={{buildNumber}}"></script>

Обратите внимание, что в этом случае {{buildNumber}} является значением, предоставленным сервером.

ОБНОВЛЕНИЕ 2

Решение проблемы с распаковкой urlArgs имеет проблемы. К сожалению, вы не можете контролировать все прокси-серверы, которые могут находиться между вами и вашим веб-браузером. К сожалению, некоторые из этих прокси-серверов, к сожалению, настроены на игнорирование параметров URL при кешировании файлов. Если это произойдет, неправильная версия вашего JS файла будет доставлена ​​вашему пользователю.

Я бы рекомендовал использовать buildNumber в вашем запросе имени файла Javascript, например buildNumber.myModule.js (префикс) или myModule.buildNumber.js(postfix). Вы можете использовать стиль префикса, изменив baseUrl:

baseUrl: "/scripts/buildNumber",

Обратите внимание на отсутствие "/" в конце baseUrl.

Вам нужно будет использовать модифицированную версию require.js для использования решения postfix. Подробнее об этом можно узнать здесь: fooobar.com/questions/25574/...

Очевидно, что в любом случае вы захотите использовать какое-то решение для замены buildNumber с некоторым типом номера версии, который изменяется с каждой версией.

Ответ 2

Вот мое решение (для экстренных случаев):

  • Найдите следующий код в require.js:

Версия для разработки

//Join the path parts together, then figure out if baseUrl is needed.
url = syms.join('/');
url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js'));
url = (url.charAt(0) === '/' || url.match(/^[\w\+\.\-]+:/) ? '' : config.baseUrl) + url;

ИЛИ

Производственная версия

e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");
  1. и добавьте ?v=x.0 после .js

    url += (ext || (/^data\:|^blob\:|\?/.test(url) || skipExt ? '' : '.js?v=1.0'));

    ИЛИ

    (/^data\:|\?/.test(d)||c?"":".js?v=1.0");