它们实际上被称为“CSS 模块脚本”,并且是浏览器的原生功能,与 流行的开源项目 不同,该项目通过在 HTML 和 CSS 中创建唯一的类名标识符来实现作用域样式。
原生 CSS 模块是 ES 模块的一部分(类似于我们最近介绍的 JSON 模块)。
// Regular ES Modules
import React from "https://cdn.skypack.dev/[email protected]";
// Newfangled JSON Modules
import configData from './config-data.json' assert { type: 'json' };
// Newfangled CSS Modules
import styleSheet from "./styles.css" assert { type: "css" };
我第一次从 Justin 的推文中看到这一点
目前这仅限于 Chrome。相关链接
在我写这篇文章时,它只在启用了实验性 Web 平台功能的 Chrome Canary 中有效。 如果你问,“我什么时候可以在各种用户使用各种浏览器的情况下,在生产项目中使用它?”,我只能说:我不知道。 可能要几年。 也可能永远不会。 但它仍然很有趣,值得一试。 也许支持会快速发展。 也许你会参与 Electron 项目或其他可以依赖特定浏览器功能的项目。
这看起来像是对 可构造样式表 的扩展,可构造样式表也是 Chrome 独有的,因此“落后”的浏览器需要先从那里开始。
我在这里尝试了 Justin 的想法
如果我记录从 CSS 模块导入返回的内容,它是一个 CSSStyleSheet

如果你要实际使用样式... 那就是你的事了。 Justin 的想法基本上将样式作为一个单行代码应用,因为碰巧的是 lit-html 支持 CSSStyleSheet
(这些文档没有说明这一点,但我认为他们会在某个时候说明这一点)。 对于原生 Web 组件,差别不大:你导入它,获取 CSSStyleSheet
,然后像这样将其应用于 Web 组件
this.shadowRoot.adoptedStyleSheets = [myCSSStyleSheet];
我认为这一切的重点是
- 我们需要一种在 JavaScript 中导入样式表的方法,这是我所知道的第一个真正清晰的尝试,
- 现在,我们可以对 CSS 进行编程访问,如果我们想在使用它之前对其进行操作,并且
- 它看起来特别适合 Web 组件使用,但它很通用。 一旦你拥有样式表,你可以用它做任何你想做的事情。
这让我希望我们有原生加载器支持。
无法在用户空间中原型化这样的东西已经够糟糕了,但无法为浏览器提供垫片简直让人无法接受——它迫使我们回到捆绑器,而 HTTP/2 和原生模块本应承诺一个更简单的未来。 或者,等待(可能需要几年)浏览器供应商实施并等待用户升级。
我真的希望他们能在引入更多模块类型之前尝试解决加载器问题。
CSS 模块很快将在 Chrome 稳定版中启用,并且该提议已进入 TC39 的第 3 阶段。