如何将.CSS文件排除在application.scss中的Rails中



我有yotheme和bootstrap,它们彼此干扰。设计师将Yootheme用于主页,我没有时间翻译它。我如何仅在索引页面上包括yootheme.css,并将其从其他任何地方排除在外?我有

application.haml-布局
/ UIkit CSS
-# %link{:rel => "stylesheet", :href => "https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.30/css/uikit.min.css"}/
%link{:rel => "stylesheet", :crossorigin => "anonymous", :href => "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css", :integrity => "sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ"}/
= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' 
application.scss
 *= require_tree .
 *= require_self

app/assets/stylesheets/yootheme.css

index.haml
=stylesheet_link_tag 'yootheme.css', media: :all

您可以使用sprockets#stub和文件名在您的应用程序中排除。CSS文件,以防止其加载:

*= stub yootheme.css

然后,要手动合并它,您必须将文件添加到assets.rb,重新启动服务器,然后使用stylesheet_link_tag助手自己加载文件:

# config/initializers/assets.rb
# Rails.application.config.assets.precompile += %w( yootheme.css )
# view
= stylesheet_link_tag 'yootheme.css', media: :all

在sass/scss

中不使用require_tree

链轮提供了一些注释中放置的指令 称为require,require_tree和require_self。 请勿在您的SASS/SCSS文件中使用它们。它们非常原始,并且与SASS文件无法正常工作。相反,使用Sass的本地 @Import指令SASS-RAILS已定制以集成 您的铁轨项目的惯例。 https://github.com/rails/sass-rails

如果您不使用任何SASS功能,例如变量,功能,Mixins等,则可以使用require_tree。但是,一旦您这样做,您就会意识到它们在任何文件中都没有可用,除非它们被宣布的文件。那是因为在将文件串在一起之前,每个文件都在SASS编译器中运行。

因此,最好使用@import 'foo'并手动声明哪些文件以及应将其添加到编译样式表中。

它听起来不那么糟糕

默认资产管道设置是一个很好的尝试,要让懒惰程序员不要将所有内容都推入单个CSS/JS文件中,同时仍将其编译到单个优化文件中。确实需要require_tree .才有意义。

我通常关闭资产生成器:

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.generators do |g|
      g.assets false
      # or
      g.stylesheets false
    end
  end
end

相反,我故意将app/assets中的代码组织到模块中。而不是我的任何代码都进入/vendor

您可以使用Glob Imports从库文件夹中导入Sass Mixins和变量 - 但它不能/不应替换require_tree

使用content_而不是单独的布局

使用单独的布局意味着您必须复制整个文件才能更改一两行。

相反,您可以使用content_for在布局中制作动态块:

# application.html.haml:
!!!
%html
  %head
    %title My Rails app
    - content_for :assets
      = stylesheet_link_tag "application"
      = javascript_include_tag "application"
    = csrf_meta_tag
  %body
    = yield

然后在index模板中,我们可以添加到head部分:

- content_for :assets
  = stylesheet_link_tag "some_other_file"

这将添加= javascript_include_tag "application"下的样式表链接,因为content_for将提供的块与已经捕获的内容相连。使用flush: true丢弃任何先前提供的内容(通过布局)。

- content_for :assets, flush: true
  = stylesheet_link_tag "some_other_file"

类似这样的东西

index.haml(布局)..

- if action_name=="index"
   /* include both application.css and yootheme.css for index*/
   = stylesheet_link_tag 'application', 'yootheme.css', media: :all
- else
   /* include only application.css*/
   =stylesheet_link_tag 'application, media: :all

最新更新