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.
*/