首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails处理字体和纱线的资产管道

Rails处理字体和纱线的资产管道
EN

Stack Overflow用户
提问于 2018-02-01 21:48:39
回答 2查看 3K关注 0票数 2

我有一个现有的rails应用程序,在该应用程序中,我正在一个单独的分支上工作,以实现yarn来管理我的供应商资产。我的应用程序栈是:

  • ruby-2.4.0
  • rails 5.1.4
  • 节点9.4.0
  • 纱线1.3.2

安装了纱线之后,我运行了yarn init,它在项目根中生成了一个package.json。添加了几个包后,看起来如下:

代码语言:javascript
复制
# package.json

{
  "name": "my-project-name",
  "version": "1.0.0",
  "private": true,
  "repository": "my-repo",
  "author": "me",
  "license": "MIT",
  "dependencies": {
    "bootstrap": "3",
    "font-awesome": "^4.7.0",
    "jquery": "^3.3.1",
    "jquery-backstretch": "^2.1.16",
    "jquery-ujs": "^1.2.2",
    "waypoints": "^4.0.1"
  }
}

我在app/assets下创建了两个文件,用于包含来自node_modules的样式表和javascripts

代码语言:javascript
复制
# app/assets/javascripts/node_modules.js
//= require jquery
//= require jquery-ujs
//= require bootstrap/dist/js/bootstrap.min.js
//= require waypoints
//= require jquery-backstretch

# app/assets/stylesheets/font_path_overwrite.scss
$fa-font-path: "font-awesome/fonts/";

# app/assets/stylesheets/node_modules.css.scss
/*
 *= require bootstrap/dist/css/bootstrap.min.css
 *= require font_path_overwrite
 *= require font-awesome/scss/font-awesome
*/

我也改变了:

代码语言:javascript
复制
# config/initializers/assets.rb
# ...
Rails.application.config.assets.paths << Rails.root.join('node_modules')

Rails.application.config.assets.precompile += %w(*.js *.scss)
Rails.application.config.assets.precompile += %w(*.png *.woff2 *.woff *.ttf *.eot *.jpg *.gif *.svg *.ico)

# Rakefile
# ...
Rake::Task['assets:precompile'].enhance [:js_deps_install]
task :js_deps_install do
  sh 'yarn install'
end

根据苏-43170792,我添加了一个新的

代码语言:javascript
复制
heroku buildpacks:set heroku/ruby
heroku buildpacks:add --index 1 heroku/nodejs

在我的分期环境中,我部署了这些更改,我突然意识到,我的资产预编译node_modules/文件夹发生了一些奇怪的事情:虽然对于js和css文件来说,一切看起来都很好,但我的字体(特别是字体-可怕的字体)出现了一些问题。

在网络检查器中调试没有找到文件assets/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0,因为它是预编译的,而不是仅仅复制到:

public/assets/font-awesome/fonts/fontawesome-webfont-hash.ttf

我理解为什么我要面对这种情况(这与两个月前的这个未解决的问题非常相似)。

我正在寻找一个干净的解决方案或智能解决方案(例如,创建一个中间件来将普通的.ttf请求重定向到rails抱怨散列版本,并将答案缓存x小时。你有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-09 20:01:57

我想经过几次尝试,我找到了最干净的解决方案:

尝试1: Sass和覆盖字体目录

我在app/assets/stylesheets目录中对sass模块进行了相当广泛的重构。这里有几个例子:

用于字体

代码语言:javascript
复制
// sass_font_awesome.scss
$fa-font-path: "font-awesome/fonts";
@import 'font-awesome/scss/font-awesome';
@font-face {
  font-family: 'FontAwesome';
  src: asset-url('#{$fa-font-path}/fontawesome-webfont.eot');
  src: asset-url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
    asset-url('#{$fa-font-path}/fontawesome-webfont.woff2') format('woff2'),
    asset-url('#{$fa-font-path}/fontawesome-webfont.woff') format('woff'),
    asset-url('#{$fa-font-path}/fontawesome-webfont.ttf') format('truetype'),
    asset-url('#{$fa-font-path}/fontawesome-webfont.svg?#fontawesomeregular') format('svg');
  font-weight: normal;
  font-style: normal;
}

用于图像

代码语言:javascript
复制
// sass_multiselect.scss
$ms-img-path: 'multiselect/js/img';
@import 'multiselect/css/multi-select';
.ms-container{
  background: transparent asset-url('#{$ms-img-path}/switch.png') no-repeat 50% 50%;
  width: 370px;
}

当预编译node_modules文件夹时,这种方法仍然失败。实际上,所有的节点cli脚本在Ugflifier的语法方面都存在一些问题。

尝试2:安装Webpack并创建app/javascripts/pack/application.sass

代码语言:javascript
复制
@import '~font-awesome/scss/font-awesome'
@import '~multiselect/css/multi-select'

我仍然面临着一些相对路径上的问题。我在webpacker文档中找到了解决方案,将以下加载程序添加到我的config/webpacker/environment.js中:

代码语言:javascript
复制
// webpack/environment.js
const { environment } = require('@rails/webpacker')

// resolve-url-loader must be used before sass-loader
environment.loaders.get('sass').use.splice(-1, 0, {
  loader: 'resolve-url-loader',
  options: {
    attempts: 1
  }
});

解决方案:最简单的方法

最后,我发现了webpacker的默认行为,它非常简单:

代码语言:javascript
复制
// app/javascripts/packs/styles.js
import 'font-awesome/scss/font-awesome.scss';
import 'multiselect/css/multi-select.css';

此编译为捆绑的styles.css,而不需要任何额外的加载程序。

我花了相当长的时间才弄清楚,我希望这也会对你有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2018-03-09 21:12:43

我通过重写字体路径使其工作。

application.scss:

代码语言:javascript
复制
$fa-font-path:"font-awesome/fonts";

@import 'font-awesome/scss/font-awesome';

@font-face {
  font-family: 'FontAwesome';
  src: font-url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
  src: font-url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
  font-url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
  font-url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
  font-url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
  font-url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
  //  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
  font-weight: normal;
  font-style: normal;
}

运行rake assets:precompile,您将在public/assets/font-awesome/fonts中看到带有已消化的文件名的字体文件。

编译后的CSS应该从Rails资产访问字体文件:

代码语言:javascript
复制
@font-face{
   font-family:'FontAwesome';
   src:url(/assets/font-awesome/fonts/fontawesome-webfont-7bfcab6db99...979.eot?v=4.7.0)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48572272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档