Grunt filerev, usemin и кеширование файлов

Я использую ворчание filerev Задача добавления кеш-файлов к файлам при изменении их содержимого. usemin задача заменить путь к соответствующему файлу на их исправленные версии, на которые они ссылаются. Все настроено хорошо, и они работают как положено / написано в их документации.

Я постараюсь объяснить проблему сейчас:

Это проект Angular JS, где упрощенная структура выглядит примерно так:

a.html -> b.js -> c.html (partial)

Здесь a.html ссылается на b.js, а b.js загружает c.html как частичный. Сервер настроен на кеширование всех этих ресурсов, поэтому строки кешбастера становятся важными.

Когда я бегу grunt build выполнить filerev а потом useminпереименовывает c.html в c.[md5_hash_of_c].html, b.js в b.[md5_hash_of_b].js а также a.html в a.[md5_hash_of_a].html, После этого он обновляет контрольную линию в b.js за c.html в c.[md5_hash_of_c].html, Точно так же это обновляет a.html также. Это означает, что при вычислении хэшей эти файлы все еще имели невозвращенную версию других файлов. В результате, когда содержание c.html изменения, он обновляет свою ссылку в b.js но не обновляет имя b.js чтобы отразить это изменение.

Это побеждает саму цель получения кеш-ошибок в именах файлов. Потому что теперь браузер имеет b.[md5_hash_of_b].js а также a.[md5_hahs_of_a].html кешируется, призыв к обновлению c.[md5_hash_of_c].html выходит из строя.

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

1 ответ

Решение

Нашел этот вопрос обсуждали в трех разных местах. Третья ссылка наиболее близка к решению.

Я, наконец, в конечном итоге с помощью vermin в качестве замены задачи для filerev а также usemin который внутренне выполняет обе задачи, пока имена файлов не перестанут меняться. Это разделено как суть здесь: https://gist.github.com/markrian/aa185c5ec66232a38a68

Из основных комментариев:

/**
 * Vermin completely manages the running of the filerev and usemin tasks, so
 * that assets that reference other assets are correctly hashed after their
 * referenced assets are spliced in by usemin.
 *
 * Vermin also makes various assumptions about how filerev and usemin are set
 * up. For instance, it assumes that usemin runs immediately after filerev,
 * that filerev renames files in-place, and that usemin relies on
 * `grunt.filerev.summary`, as prepared by filerev (which vermin manipulates).
 * There may be other implicit assumptions that haven't been identified yet.
 *
 * Because grunt tasks can only be inserted into the task stack, to be run
 * sequentially, vermin recursively adds filerev, usemin and itself to the
 * stack to do its work. It maintains its state on the grunt object, and reads
 * that on each run to determine where in the process it is.
 */
Другие вопросы по тегам