在Rails中从/ public目录提供字体的缺点是什么?

时间:2012-02-29 19:56:46

标签: ruby-on-rails ruby-on-rails-3.1 fonts asset-pipeline

我喜欢资产管道,但对于我的生活,我无法让它服务我的字体。我浪费了几个小时谷歌搜索和尝试SO解决方案(nopenopenope)。

相反,我创建了/public/fonts,将所有字体放在那里并使用url('/fonts/myAwesomeFont.ttf')引用它们。一切都很完美。

这种做法有不利之处吗?

是否在资产预编译中压缩了字体文件?

4 个答案:

答案 0 :(得分:6)

我们将字体保存在/ app / assets / fonts文件夹中,对于我的记忆,我们不需要进行任何其他配置。

但是,在引用字体时,您必须在CSS文件中使用asset_path帮助程序(与在CSS中引用资产管道图像时相同)。这需要将文件扩展名从 .css 更改为 .css.erb 。很难从你的描述中确定,但我猜这可能是问题所在。


实施例

我们在应用中使用Museo500字体并将其存储在app / assets / fonts中:

app/assets/fonts:
  - museo700-regular-webfont.eot
  - museo700-regular-webfont.woff
  - museo700-regular-webfont.ttf
  - museo700-regular-webfont.svg

@ font-face声明如下:

@font-face {
    font-family: 'Museo700';
    src: url('<%= asset_path "museo700-regular-webfont.eot" %>');
    src: url('<%= asset_path "museo700-regular-webfont.eot" %>?#iefix') format('embedded-opentype'),
         url('<%= asset_path "museo700-regular-webfont.woff" %>') format('woff'),
         url('<%= asset_path "museo700-regular-webfont.ttf" %>') format('truetype'),
         url('<%= asset_path "museo700-regular-webfont.svg" %>#Museo700') format('svg');
    font-weight: normal;
    font-style: normal;

}


将资产管道用于二进制文件的好处

我们不对图像或字体资源进行任何预编译(我猜你可以通过gzip字体或其他东西,但我们没有),但我仍然看到通过资产管道托管它们的好处:统一性和约定。使用Rails约定可以提供各种好处。

Ex:在某些时候,您可能希望使用像Amazon Cloudfront这样的CDN,并且需要将生产中的所有资产URL指向CDN副本。如果您通过资产管道托管包括字体和图像在内的所有资产,那么通过取消注释行更改就可以轻松更改production.rb文件中的asset_host:

  # Enable serving of images, stylesheets, and JavaScripts from an asset server
  # config.action_controller.asset_host = "http://assets.example.com"

如果您已使用asset_path帮助程序引用字体,那么这些网址将自动更新以指向CDN。我想使用path_helpers作为资产管道本身也是一个好处,但无论哪种方式都是有益的。

希望这有帮助!

答案 1 :(得分:0)

我对第一个问题的回答是......我不知道

字体文件不应该被Rails资源管道压缩,CSS和JS被压缩,图像可以使用第三部分宝石压缩,如sprockets-image_compressor

答案 2 :(得分:0)

根本没有错。 Asset Pipeline的最大优势是保持你的JS和CSS,它们是代码,组织起来像源代码。在部署时,您的代码在/ public中以不同的格式打包,适合公共使用。

任何发生的压缩都应由Web服务器处理。

答案 3 :(得分:0)

这是我在网上找到的一个很好的解决方案:

http://aokolish.me/blog/2011/12/24/at-font-face-with-the-asset-pipeline