Rails 4: Почему шрифты не загружаются в производство?

Я не могу загружать шрифты в свое приложение Rails 4 в процессе производства, он работает нормально в разработке.

Активы предварительно скомпилированы на сервере при развертывании.

У меня есть мои шрифты в

app/assets/fonts

My app.css:

@font-face {
    font-family: 'WalkwayBoldRegular';
    src: url('Walkway_Bold-webfont.eot');
    src: url('Walkway_Bold-webfont.eot?#iefix') format('embedded-opentype'),
         url('Walkway_Bold-webfont.woff') format('woff'),
         url('Walkway_Bold-webfont.ttf') format('truetype'),
         url('Walkway_Bold-webfont.svg#WalkwayBoldRegular') format('svg');
    font-weight: normal;
    font-style: normal;
}

В моем production.rb у меня есть:

config.assets.precompile << Proc.new { |path|
  if path =~ /\.(eot|svg|ttf|woff)\z/
    true
  end
}

Ответ 1

У нас была эта проблема на прошлой неделе - проблема в том, что ваши активы будут скомпилированы, чтобы на них были хэши MD5, в то время как ваш стандартный CSS все равно будет искать свои "стандартные" имена. Это проблема с изображениями и шрифтами.

@font-face {
    font-family: 'akagi';
    src: asset_url('fonts/akagi-th-webfont.eot');
    src: asset_url('fonts/akagi-th-webfont.eot?#iefix') format('embedded-opentype'),
         asset_url('fonts/akagi-th-webfont.woff') format('woff'),
         asset_url('fonts/akagi-th-webfont.ttf') format('truetype'),
         asset_url('fonts/akagi-th-webfont.svg#akagithin') format('svg');
    font-weight: 300;
    font-style: normal;
}

Это пример того, как вы должны использовать scss файлы для динамического загрузки активов. Эти файлы скомпилированы (либо до нажатия, либо во время инициализации) в ваши .css файлы, все из которых правильно синхронизированы.

У нас была схожая проблема с Heroku, и мне удалось заставить ее работать, помещая наши файлы в /stylesheets/layout/fonts.css.scss, а затем вызывая

@import '/layout/fonts';

Мы также вызвали наш application.css → application.css.scss для поддержки функции @import

Ответ 2

Вот общий способ устранения этой проблемы для любой библиотеки.

Воспроизводить ошибку на локальном

  • Запустить сервер рельсов на производстве

    • На терминале rake assets:precompile
    • Это на config/environments/production.rb

        # Rails 4 production
        # config.serve_static_files = true
        # Rails 5, Uncomment to run production on local
        # config.log_level = :debug
        config.public_file_server.enabled = true
      
    • На терминале RAILS_ENV=production rails s
  • Вы должны увидеть ошибку в веб-браузере

Переопределить семейство шрифтов

  • application.css необходимо переименовать в application.scss, так как asset-url будет использоваться
  • Добавьте шрифты, чтобы предварительно скомпилировать файл config/initializers/assets.rb:

    Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf)$/
    
  • Посмотрите определение лица шрифта внутри вашей библиотеки CSS и скопируйте его на application.scss. Это должно быть что-то вроде:

    @font-face {
      font-family: 'my-library';
      src: url('../fonts/my-library.eot');
      src:
        url('../fonts/my-library.eot?#iefix') format('embedded-opentype'),
        url('../fonts/my-library.woff2') format('woff2'),
        url('../fonts/my-library.ttf') format('truetype'),
        url('../fonts/my-library.woff') format('woff'),
        url('../fonts/my-library.svg?#my-library') format('svg');
      font-weight: normal;
      font-style: normal;
    }
    
  • Изменить на:

    @font-face {
      font-family: 'my-library';
      src: asset-url('my-library/fonts/my-library.eot');
      src:
        asset-url('my-library/fonts/my-library.eot?#iefix') format('embedded-opentype'),
        asset-url('my-library/fonts/my-library.woff2') format('woff2'),
        asset-url('my-library/fonts/my-library.ttf') format('truetype'),
        asset-url('my-library/fonts/my-library.woff') format('woff'),
        asset-url('my-library/fonts/my-library.svg?#my-library') format('svg');
      font-weight: normal;
      font-style: normal;
    }
    

Какие изменения были внесены

  • Используйте asset-url вместо url
  • Измените ../fonts или похожи на путь, который понимает asset-url.

Какой путь использовать атрибут-ресурс

Чтобы узнать, какой путь asset-url понимает, перейдите к консоли rails и введите Rails.application.assets.paths. Вы получите что-то вроде:

[
  '/path/1',
  '/path/2',
  '/path/3',
]

Если ваши шрифты находятся на /path/2/my-library/fonts/, то используйте asset-url('my-library/fonts/my-library.eot').

то есть. Вы удаляете путь, найденный на Rails.application.assets.paths.

Проверьте, что вы написали правильный путь

В консоли Rails при разработке:

helper.asset_url('my-library/fonts/my-library.eot')

Должен вернуться:

"/assets/my-library/fonts/my-library-2517b97e2c0e1e6c8ceb9dd007015f897926bc504154137281eec4c1a9f9bdc9.eot"

Обратите внимание на завершающий /assets/ и дайджест в последней части.

Ответ 3

1: - Храните все ваши шрифты в папке приложений/активов/шрифтов.

2: - После использования rake: precompile RAILS_ENV = production все ваши шрифты будут предварительно скомпилированы в папку public/assets с дайджестом.

3: - Вместо использования src: url ('fontname.eot') используйте src: font_url ('fontname.eot') в scss файлах.