Фреймворк Phoenix - ресурсы не обновляются без запуска mix phx.digest

После изменения файла актива (css или js) я вижу в журналах, что изменение было замечено и скомпилировано, а браузер также автоматически перезагружается.

[debug] Live reload: priv/static/js/app.js
10:53:15 - info: compiled MyComponent.jsx and 2095 cached files into 2 
files in 2.3 sec

Однако не похоже, что активы в /priv/static действительно были обновлены. Я могу увидеть свои изменения в браузере только после запуска mix phx.digest и жесткого обновления браузера.

Есть идеи, как это исправить?


С использованием:

  • Феникс 1.3
  • бранч 2.10.7

config / dev.exs:

config :my_app, MyApp.Web.Endpoint,
  http: [port: 4000],
  debug_errors: true,
  code_reloader: true,
  check_origin: false,
  watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin",
                cd: Path.expand("../assets", __DIR__)]]

# Watch static and templates for browser reloading.
config :my_app, MyApp.Web.Endpoint,
  live_reload: [
    patterns: [
      ~r{priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$},
      ~r{priv/gettext/.*(po)$},
      ~r{lib/my_app/web/views/.*(ex)$},
      ~r{lib/my_app/web/templates/.*(eex)$}
    ]
  ]

4
792
3

Ответы:

Я столкнулся с той же проблемой, и мне помогло вручную удалить папку static с помощью rm -rf priv/static и перезапустить сервер с помощью mix phx.server. После этого горячая перезагрузка работала без необходимости постоянно запускать mix phx.digest вручную.


TL; DR - Если вы не установите параметр cache_static_manifest на своей конечной точке, он не будет генерировать URL-адреса с поддержкой версий.

Итак, я знаю, что опаздываю здесь примерно на три года, но недавно я понял это. Я обнаружил, что простая установка значения cache_static_manifest в конфигурации конечной точки заставит ее использовать дайджест в любом режиме. (Этот является задокументирован, но не так, как мне показалось особенно ясным.)

Теперь вы можете подумать: «Но я не устанавливал это в режиме dev». Я тоже так думал, пока не понял, что написал наивный config/runtime.exs.

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

Пример:

if Config.config_env == :production do
  config :my_app, MyAppWeb.Endpoint, cache_static_manifest: "priv/static/cache_manifest.json"
end

Другая возможная причина заключается в том, что модуль конечной точки (lib/my_app_web/endpoint.ex) настраивает Plug.Static на использование сжатых ресурсов:

defmodule MyAppWeb.Endpoint do
  use Phoenix.Endpoint, otp_app: :my_app_web

  plug Plug.Static,
    # ...
    gzip: true,

Затем, если выпуск был создан из каталога проекта, а сжатые с помощью gzip ресурсы все еще присутствуют при разработке, они будут обслуживаться вместо вновь сохраненных несжатых ресурсов.

Чтобы этого избежать:

config/dev.exs:

config :my_app, :environment, :dev

config/test.exs:

config :my_app, :environment, :test

config/prod.exs:

config :my_app, :environment, :prod

lib/my_app_web/endpoint.ex:

defmodule MyAppWeb.Endpoint do
  use Phoenix.Endpoint, otp_app: :my_app_web

  in_prod = Application.get_env(:my_app, :environment) == :prod

  plug Plug.Static,
    # ...
    gzip: in_prod,