默认情况下,CSS 模块中的 CSS 是本地的。但是当你使用:global qualifier/block 时,如果你想切换回local CSS,那么你应该这样做。
假设您正在使用 global 模式使用 css-loader 选项的 CSS 模块:
module: {
rules: [
{
test: /\.css$/i,
use: [
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
// THIS IS IMPORTANT
modules: 'global'
}
}
],
}
]
}
对于上述配置,请考虑以下示例:
.abc { color: red; }
:global(.abc) { color: green; }
:local .xyz { color: blue; }
:local(.xyz) .pqr { color: yellow; }
.abc :local .xyz .pqr { color: cyan; }
它会被编译成下面的 CSS。
/* Since it is global model for CSS modules, classname is not hashed */
.abc { color: red; }
/* .global(.abc) has no effect here */
.abc { color: green; }
/* :local .xyz means anything after :local will be hashed */
.dkzEiLgPjIar3vTOyiHv { color: blue; }
/* .local(.xyz) .pqr means only .xyz is hashed */
.dkzEiLgPjIar3vTOyiHv .pqr { color: yellow; }
/* Everything after the :local is hashed i.e. both .xyz and .pqr */
.abc .dkzEiLgPjIar3vTOyiHv .k3SKPTpkzRcircxhU4Dd { color: cyan; }
:local 和 :local(selector) 之间的区别很微妙。前者是激进的(在它之后是散列选择器),后者是宽松的。如果我将 CSS Scope 用作本地,即 modules: true 或 modules: 'local',则适用相同但相反的逻辑。
现在你的问题是,我为什么要在 :global 内部使用 :local 是当我有一些组件在某个或顶级组件内部时应该更改其样式。想象一下,.text 在.blogArticle 内时的大小应该是18px。否则这个组件应该默认呈现为14px:
:local .text { font-size: 14px; }
.blogArticle :local(.text) { font-size: 18px ;}
但总的来说,你是对的。您很少需要将local 放在global 中。你这样做的唯一原因是一些遗留的复杂 CSS,你正在迁移到更新的代码库,并希望将相关的 CSS 块更紧密地结合在一起以获得更好的可读性。最后但同样重要的是,考虑像这样的深层嵌套遗留 CSS:
.abc :local .xyz .pqr :global(.def) {
color: cyan;
}
我开始global,然后切换到:local,然后再切换到:global(.def)。但是需要这样做是反模式/代码异味的一个很好的例子。