W3C home > Mailing lists > Public > public-css-archive@w3.org > July 2018

[csswg-drafts] [css-nesting] Concern about combinatorial explosion

From: Xidorn Quan via GitHub <sysbot+gh@w3.org>
Date: Thu, 05 Jul 2018 00:43:08 +0000
To: public-css-archive@w3.org
Message-ID: <issues.opened-338395788-1530751387-sysbot+gh@w3.org>
upsuper has just created a new issue for https://github.com/w3c/csswg-drafts:

== [css-nesting] Concern about combinatorial explosion ==
The most intuitive way to implement nesting rules is probably just expand them internally as their complete form, just like what preprocessors do nowadays.

But this has a problem that it means the number of selectors to match can grow exponentially as the nesting get deeper. This is less a concern when it was handled by preprocessors, because authors would see the exponential result from the generated file. If they see a generated CSS sized hundreds of megabytes or even gigabytes, they know there is a problem. But with nesting rules, they can hand to browsers a CSS file with just a handful of kilobytes which can be expanded to millions of rules, that would be problematic.

Consider something like
```css
.a1, .a2 {
&.b1, &.b2 {
&.c1, &.c2 {
&.d1, &.d2 {
&.e1, &.e2 {
&.f1, &.f2 {
&.g1, &.g2 {
&.h1, &.h2 {
&.i1, &.i2 {
&.j1, &.j2 {
&.k1, &.k2 {
&.l1, &.l2 {
&.m1, &.m2 {
&.n1, &.n2 {
&.o1, &.o2 {
&.p1, &.p2 {
&.q1, &.q2 {
&.r1, &.r2 {
&.s1, &.s2 {
&.t1, &.t2 {
&.u1, &.u2 {
&.v1, &.v2 {
&.w1, &.w2 {
&.x1, &.x2 {
&.y1, &.y2 {
&.z1, &.z2 {
```

It's only 300+ bytes, but can be expanded into 67M selectors. It's probably not good.

Potential solutions includes:
1. restrict the maximum nesting levels (e.g. at most 3 levels are allowed)
2. allow only a single complex selector, rather than a list in nested rules


Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/2881 using your GitHub account
Received on Thursday, 5 July 2018 00:43:10 UTC

This archive was generated by hypermail 2.3.1 : Thursday, 5 July 2018 00:43:11 UTC