Django-compressor: Sass,使用压缩器和不使用压缩器的结果不同,导致解析错误

创建于 2017-02-15  ·  11评论  ·  资料来源: django-compressor/django-compressor

您好,我在使用 Bootstrap 4 alpha 6 时遇到了一个问题。遇到 BS4 包含后的所有 CSS 都被浏览器忽略了。 深入挖掘,发现生成的css解析错误。

我正在使用 Django 1.8.17、Compressor 2.1.1、Sass 3.4.22

我将在这里记录我发现的第一个解析错误。

错误是stroke='rgba(0, 0, 0, 0.5")',的双引号" stroke='rgba(0, 0, 0, 0.5")',而它应该是stroke='rgba(0, 0, 0, 0.5)' 。 这会导致文档中的解析错误。

无效线路(通过 dj 压缩器)

.navbar-light .navbar-toggler-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5")' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); }

有效行(通过 sass direct)

.navbar-light .navbar-toggler-icon {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"); }

与预编译版本匹配。

_background-image_ 的来源

$navbar-light-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"), "#", "%23") !default;

$navbar-light-color:                rgba($black,.5) !default;

$black:  #000 !default;

我们如何通过 dj 压缩器生成

{% compress css %}
<link rel="stylesheet" type="text/x-scss" media="screen" charset="utf-8"
    href="/static/bootstrap/scss/bootstrap.scss" />
{% endcompress %}
COMPRESS_PRECOMPILERS = (
    ('text/coffeescript', 'coffee --compile --stdio'),
    ('text/x-sass', 'sass {{infile}} {{outfile}} --load-path {}'.format(LIB_PATH)),
    ('text/x-scss', 'sass --scss {{infile}} {{outfile}} --load-path {}'.format(LIB_PATH)),
)

所有11条评论

看起来很糟糕。 任何解决此问题的帮助将不胜感激,我可能在接下来的几周内没有时间。

我去试试我不熟悉你的代码库,所以任何关于从哪里开始/任何预感的指示都是非常有价值的。

一些想法:

  • COMPRESS_ENABLED = False会发生这种情况吗?
  • 您能仔细检查一下 Sass 版本是否相同吗? (抱歉这个,但理论上所有压缩器所做的都是将输入传递给 Sass 进行处理——显然有些事情正在发生,但我想排除这一点。)

@卡尔顿吉布森

  • 已经使用COMPRESS_ENABLED = False ,设置True观察到相同的结果。
  • 这就是我检查 sass 版本的方式。 在该环境中运行服务器
$ sass -v 
Sass 3.4.22 (Selective Steve)

我尝试在压缩器块中包含 sass 版本或预构建的 bootstrap.css 文件,然后是一个仅包含主体背景的文件

@wjdp好的 谢谢。 嗯。

在这种情况下,我可以建议在Compressor.precompile放置一个断点吗? 首先content是否正确传入?

那么在hunks()中从预编译器返回的value是否正确?

我现在正在研究这个。 问题与#764相同。 CssAbsoluteFilter 使用r'url\(([^\)]+)\)'来匹配 URL,因此在第一个右括号处停止。 由于正则表达式无法处理任意数量的嵌套括号,因此我看到了三个选项:

  1. 只处理一层嵌套括号,因为这对任何人来说都足够了
  2. 用更智能的匹配逻辑做好
  3. 使用一些库来解析 css。

我不想花太多时间在这上面,我正在研究选项 1,如果有人想创建一个更强大的解决方案,我很乐意对此进行审查。

建议修复 #828。 它实际上根本不处理嵌套括号,它只需要关闭引号,如果有左引号(因此url("data:...stroke='rgba(0, 0, 0, 0.5)不会匹配),并且为了安全起见,数据 uris 被完全忽略。

@wjdp你可以试试 #828 吗? 它应该可以满足您的需求,但是您的测试运行将是一个很好的确认。

应该做

@carltongibson可以确认 PR 已经为我解决了这个问题。 感谢@karyon的快速工作! :微笑:

太棒了👏🏽 感谢您的跟进。

此页面是否有帮助?
0 / 5 - 0 等级