Sass 3.3 的计划变更
发表于 2013 年 12 月 20 日,作者 Natalie Weizenbaum
这篇文章最初以 gist 形式发布。
Sass 3.3 即将发布,并将带来多个重大新功能。它支持源地图、SassScript 地图以及在 SassScript 中使用 &
。为了准备发布,我们发布了几个候选版本,确保一切就绪。不幸的是,情况并非如此。
候选版本通常会发现新功能中存在的小错误和不一致,但很少发现真正致命的问题。然而,这次,一些用户发现了一个在 SassScript 中使用 &
的问题,使得我们对 3.3 中该部分的计划的大部分都不可行。这不是一个致命问题,我们认为我们有一个很好的解决方案(我很快就会谈到这个问题),但它确实是一个问题。
背景背景永久链接
要理解问题所在,首先需要了解我们一开始决定让 &
在 SassScript 中可访问的原因。用户经常想要做的一件事是给类添加后缀。有时这取代了嵌套选择器,有时只是为了根据旧类创建一个新类——原因在这个讨论中并不重要。当人们尝试这样做时,他们会写类似 .foo { &-suffix { ... } }
的代码,但这不起作用。原因是 &
与类型选择器(例如 h1
)或通用选择器(*
)具有相同的语法功能,因为它可以被这些选择器中的任何一个替换。在选择器中写 *-suffix
没有意义,所以 &-suffix
也不允许。
但这并没有阻止人们想要这样做。因此,我们决定,“好吧,我们已经使用插值(#{}
)来支持将文本注入选择器中——我们只需使用它”。我们决定将 &
作为 SassScript 中的一种特殊变量添加,其中包含当前选择器的解析表示。然后,你可以通过 @at-root #{&}-suffix
来模拟 &-suffix
[1]。一切都很好,直到我们勇敢的用户发现了问题。
问题问题永久链接
以下是一段演示问题的 SCSS 代码片段。看看你能不能发现问题所在。
.foo, .bar {
@at-root #{&}-suffix {
color: blue;
}
}
你发现问题了吗?没错:在这个例子中,&
是 .foo, .bar
,这意味着选择器编译为 .foo, .bar-suffix
。由于 #{}
注入的是纯文本,Sass 没有机会弄清楚如何分割选择器。
Chris 和我讨论了如何解决这个问题。我们考虑添加一个函数来添加后缀,但这太冗长了。我们考虑让 &
将 CSS 规则的编译拆分为多个并行的规则,每个规则都有一个用于 &
的单个选择器,但这太复杂了,并且在许多边缘情况下都会失败。我们最终得出结论,没有办法让 SassScript &
清洁地支持我们为它设计的用例。
解决方案解决方案永久链接
我们知道我们想要支持 &-suffix
用例,而我们巧妙的计划失败了。我们一起思考,并决定支持它的最佳方法是最直接的方法:我们只需允许 &-suffix
。毕竟,这正是大多数人在想要这种行为时首先尝试的方法,并且由于 &
直接嵌入到选择器中,我们可以轻松处理选择器列表。
这意味着,&-suffix
将在 Sass 3.3 中得到支持,无需使用 #{}
或 @at-root
。我已经创建了 问题 1055 来跟踪它。在编译这些选择器时,如果父选择器是一个会导致无效选择器的选择器(例如 *-suffix
或 :nth-child(1)-suffix
),我们将在那里抛出一个错误,描述为什么生成了该选择器。
我们仍然担心在使用 &-suffix
编写混合宏的情况下,这些混合宏在与某些父选择器配合使用时将无法正常工作,但在这种情况下,我们认为这是所有可用方法中最不坏的选择。
SassScript 中 &
的未来SassScript 中 & 的未来永久链接
除了支持 &-suffix
之外,我们还决定从 3.3 版本中删除 SassScript &
。请放心,它会回归——我们认识到它还有其他很好的用例,我们打算在下一个大版本(可能是 3.4)中将其带回来。此外,它将附带一套用于操作它提供的选择器的函数,因此它将比以往任何时候都更加强大。
我们现在想要推迟在 SassScript 中使用 &
的原因有两个。第一个原因是我们想花一些时间来创建与它一起使用的函数,并对其进行测试。这可能需要以各种方式改变它的工作方式,我们不想为了做到这一点而进行向后不兼容的更改。
第二个原因是我们花了相当多的精力宣传 #{&}
作为 &-suffix
问题的解决方案。很明显,这是我们的责任,但事实如此,我们需要解决这个问题。让 &-suffix
工作很棒,但如果每个人都在使用 #{&}
,因为那是几个月前我们告诉他们的解决方案,那么它就没有发挥出全部潜力。在 &-suffix
工作但 #{&}
不起作用的版本中,将帮助引导用户在提供更高级功能之前找到解决问题的最佳方法。
@at-root
将仍然包含在 Sass 3.3 中。
发布 3.3发布 3.3 永久链接
不幸的是,这种变化将推迟 3.3 的发布,但希望不会推迟太多。我预计这将相对容易实现;主要障碍是弄清楚如何处理它,而这部分已经完成了。我计划在我从冬季假期回来后,将大量时间投入到发布 3.3 上,所以希望(没有承诺)它会在 1 月份的某个时候发布。
@at-root
是必要的,因为 Sass 无法像在没有#{}
的情况下使用&
时那样可靠地判断&
是否在选择器中使用。↩︎