轨道用于IE 4096选择器/样式表极限资产管道溶液(Rails asset pipeline so

2019-06-27 09:40发布

问题

微软的IE浏览器支持文档解释了在Internet Explorer 6-9:

  1. 第31个风格的标签后,所有的风格标签不适用。
  2. 第一4,095规则之后的所有样式规则不适用。
  3. 在使用了@import规则不间断的导入外部样式表导入其他样式表,样式表是超过三个层次的深度被忽略的页面。

有很多的这个问题的证据脚本演示 。 又见祝福 。

解决方案所需

我们需要一种方法来通过在资产管道链轮产生,以保持最大选择数低于4096编译的样式,并链接分头他们部署Rails应用程序的HTML。 我们如何能够通过处理资产(尤其是样式表)的编译输出作为参数的方法,然后可以修改这些文件?

见下尝试了一个地方开始。 如果有人可以帮助我找到一种方法,使任何操作(或一个全新的解决方案),这将是太棒了!

现有的解决方案的尝试

  • 祝福创建通过拆分样式表,以保持每一片的最大选择数下的极限来解决这个问题。 祝福在node.js中的服务器上运行 我还没有看到一个Ruby等价呢。 埃里克领域试图成为指南针编译祝福资产 (在节点中运行),但解决方案取决于指南针处理资产编译,因而似乎并不与资产管道的工作。 注意,不是链接到多个样式表,保佑增加@include语句到第一片,这可能是去,以避免接触标记的方式。

  • 当基督教彼得斯(@crispy) 发现了这个问题 ,他实现了一个分流器一样祝福也通过罗盘输出到自定义模块,它的Rails 3.1之前,伟大的工作。 后来,他改编与与Rails资产管道整合SprocketsEngine他的分路器 。 我试图实施新的代码,但它似乎并没有自动功能(尽管在控制台手动调用时分离器工作正常)。

相关信息

有关在IE 6-9的CSS限制的详细信息,请参阅以下相关问题:

  • 难道IE 8对每个页面样式表的数量限制吗?
  • Internet Explorer的CSS规则的限制

Answer 1:

我们有一个自动化的(尽管在某种程度上别扭)解决方案生产工作为Rails 3.1的应用程序与地方资产的管道。 瑞安已经在引用他的问题的解决,但我试着拿出一个更全面的答案。

资产管线管,并通过不同的链轮引擎的资产。

所以,你可能有如ie.css.sass.erb通过再培训局链轮引擎运行,然后传递到萨斯链轮引擎等,但它始终是在一个文件,一个文件了。

在这个特殊的问题,我们希望能有1个入站文件和n外送文件。 我们还没有找到一种方法,使这可能与链轮。 但是,我们发现了一个解决办法:

提供一个ie.css.sass ,其中包括完整的样式表和一个ie_portion2.css.sass.split2刚刚导入完整ie.css文件:

//= include 'ie.css'

对于split2文件扩展名,我们注册一个链轮引擎:

require 'css_splitter'
Rails.application.assets.register_engine '.split2', CssSplitter::SprocketsEngine

当与split2扩展评估资产,我们通过其内容到CssSplitter并指示它提取部分2(> 4095种选择):

require 'tilt'
module CssSplitter

  class SprocketsEngine < Tilt::Template
    def self.engine_initialized?
      true
    end

    def prepare
    end

    def evaluate(scope, locals, &block)
      part = scope.pathname.extname =~ /(\d+)$/ && $1 || 0
      CssSplitter.split_string data, part.to_i
    end
  end
end

这也将工作进一步件(split3,...)。

CSS的分路器识别有效的地方,样式表可在低于4096个选择被分成几部分并返回请求的一部分。

其结果是,你必须在头部连结,并分别预编译ie_portion2.css。

我希望我的修订CSS分配器要点是完全够应用解决方案。

更新:

上述CssSplitter mentionend已发行的创业板现在: https://github.com/zweilove/css_splitter



Answer 2:

我在生产中使用的解决方案是非常简单的,不是自动的,但工作得很好。 对我来说这是应该做的明显的事情,所以也许你已经想到它,不喜欢它 - 无论哪种方式,在这里我们去:

我假设你使用的青菜,如果没有,我想你应该:)



首先 ,分裂您application.css.scss :在单独的文件,如application_a.css.scssapplication_b.css.scss



其次 ,在你application.css.scss文件,使用:

@import "application_a"
@import "application_b"



第三 ,你的布局模板,既包括完整的文件,或者两个部分:

<!--[if !IE]><!-->
  # link to application.css.scss
<!--<![endif]-->

<!--[if IE]>
  # link to application_a.css.scss
  # link to application_b.css.scss
<![endif]-->

附注:不要通过资产管道产生样式表清单文件,通过SASS做到这一点,它的@import声明,其他的一切都会导致问题。



文章来源: Rails asset pipeline solution for IE 4096 selector/stylesheet limit