Как кэшировать пакеты веб-пакетов Rails - PullRequest
3 голосов
/ 21 июня 2020

У меня есть приложение Rails 6 с очень большим количеством поставщиков CSS и JS. CSS и JS редко когда-либо меняются. Я хочу, чтобы Rails кэшировал его.

Я создал 2 пакета. 1 содержит весь импорт от поставщика, а другой - импорт JS моего приложения. Я использую javascript_packs_with_chunks_tag в заголовке для обоих.

Каждый раз, когда я изменяю файл JS моего приложения, кеш этого пакета также становится недействительным вместе с пакетом поставщика!

Такое поведение кажется быть нормальным, так как я смог воспроизвести его с новым приложением Rails.

Edit: я могу исправить проблему в новом приложении Rails, отключив компиляцию (webpacker.yml compile: false) и запустив webpack в отдельная вкладка терминала (./bin/webpack --watch --colors --progress), но в моем приложении проблема все еще возникает. Похоже, что Webpack находит некоторую глобальную переменную или ключевое слово, связывающее эти два пакета. К сожалению, журналы Webpack и граф зависимостей не показывают эту «связь». Это 100% не import.

Ответы [ 3 ]

1 голос
/ 02 июля 2020

Комментарии, добавленные здесь к ответу ...

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

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

* В документации webpack есть некоторая двусмысленность, где предполагается, что некоторые версии могут изменить скомпилированное имя файла (ha sh значение), даже с неизменным кодом, из-за временных меток и других вещей, добавленных webpack. В ( документах webpack ) описаны доступные меры по снижению рисков, если вы обнаружите, что имя файла ha sh изменяется.

1 голос
/ 22 июня 2020

Одно простое решение, которое я нашел, заключалось в перемещении поставщиков CSS и JS на звездочки вместо webpack. Мне не нравится это решение, но оно работает.

Для этого используйте операторы включения типа звездочки

<%= javascript_include_tag 'vendor' %>
<%= stylesheet_link_tag 'vendor' %>

и поместите js и CSS вашего поставщика в соответствующие app/assets папки

0 голосов
/ 01 июля 2020

Другое решение - отключить компиляцию webpacker.yml compile: false и запустить webpack отдельно $ ./bin/webpack --watch --colors --progress.

Здесь задокументировано https://github.com/rails/webpacker#development, где написано «Если [. ..] у вас достаточно JavaScript, чтобы компиляция по требованию была слишком медленной ... ".

Мне тоже не нравится это решение, потому что оно не объясняет, почему это необходимо. Проблема не в том, что компиляция выполняется слишком медленно, а в том, что кеширование не происходит. Это решение обычно одновременно решает проблему кеширования ...

...