- From: Dan Clark <notifications@github.com>
- Date: Wed, 08 May 2019 14:18:27 -0700
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/759/490654382@github.com>
@matthewp , @bzbarsky
Option 2 vs 3 would not behave differently in terms of the the styles that are applied. The difference is just whether a doubly-`@imported` stylesheet in a CSS module tree would have distinct identities for each time that it is `@imported` (as is the case for non-module CSS), or whether each `@import` of the same stylesheet in a CSS module tree would point to the same `CSSStyleSheet` object. I suppose that the order in which CSS files are fetched could be affected by whether `@imports` are modules or not but this is more of an implementation detail as that doesn't change the form of the final cascade and CSS OM.
I think it would be helpful to write out the example being discussed above as code:
**a.css**:
```css
div { background-color: azure }
```
**b.css**:
```css
@import url("a.css");
div { background-color: brown }
```
**c.css**:
```css
@import url("a.css");
div { background-color: chartreuse }
```
**main.html**:
```html
<style>
@import url("b.css");
@import url("c.css");
</style>
<div>This div will be chartreuse</div>
<script>
let style = document.querySelector("style");
let bSheet = style.sheet.rules[0].styleSheet;
let cSheet = style.sheet.rules[1].styleSheet;
let aSheetFromBSheet = bSheet.rules[0].styleSheet;
let aSheetFromCSheet = cSheet.rules[0].styleSheet;
console.log(`${aSheetFromBSheet === aSheetFromCSheet}`); // Prints 'false'; duplicate @imports have their own identities
</script>
```
**mainUsingCSSModules.html**
```html
<script type="module">
import bSheet from "./b.css";
import cSheet from "./c.css";
document.adoptedStyleSheets = [bSheet, cSheet];
let aSheetFromBSheet = bSheet.rules[0].styleSheet;
let aSheetFromCSheet = cSheet.rules[0].styleSheet;
console.log(`${aSheetFromBSheet === aSheetFromCSheet}`); // Prints 'false' if option 2, 'true' if option 3
</script>
<div>This div will be chartreuse</div>
```
For mainUsingCSSModule.html, the resulting cascade is mostly the same regardless of whether we go with option 2 or option 3. The difference is that for option 3, a single `CSSStyleSheet` is shared by the `@import` from B and the `@import` from C since "a.css" would participate in the module graph and thus be processed only once for the page. As @justinfagnani pointed out this is similar to JS modules where multiple imports of a single script share one instance.
However, option 3 may come with certain other complications that we would need to contend with. For example, what is the `parentStyleSheet` and the `ownerRule` of `aSheetFromBSheet`/`aSheetFromCSheet` if they are the same `CSSStyleSheet`? I'm not sure that this divergence from existing invariants is worth it, especially since as @bzbarsky pointed out [here](https://github.com/w3c/webcomponents/issues/759#issuecomment-490309265), browser engines should generally coalesce duplicate stylesheet loads anyway, minimizing the additional performance wins that would come with option 3. Is there some concrete improvement in developer experience that option 3 would provide that would tip the scale in its direction?
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/759#issuecomment-490654382
Received on Wednesday, 8 May 2019 21:18:49 UTC