Vue中模块和作用域样式有什么区别?

Rob*_*ier 9 vue.js vue-loader

<style module><style scoped>Vue有什么区别?

官方文档(link1,link2)仅声明scoped使用PostCSS转换并module使用CSS模块.但两者之间真正的功能区别是什么?

(注意:如果他们使用的PostCSS转换是该插件,它实际上使用CSS模块......)

Ada*_*hes 19

它们都是处理范围CSS的方式,并且几乎完全相同.他们处理它的方式有点不同.

Vue中的Scoped样式只是普通的CSS,但是添加了一些额外的类作用域.它类似于影子DOM,因为它会将内容范围扩展到组件.这种方法的好处是你可以继续编写CSS,但是你可以获得一些额外的范围,如果这是你想要的.

CSS模块的不同之处在于它使用Webpack根据块和类编译唯一的类名.它有点自动创建独特的BEM类.它具有CSS之上的许多附加功能(您不必使用它).

CSS模块不是特定于Vue的东西,因此如果您了解到可以将它应用于可以导入CSS模块的任何构建.然而,Vue CSS范围很简单,如果你知道CSS(几个选择器都是真的),就没有什么可以学习的了.

CSS Modules类将由webpack构建为.{component}__{className}__{randomHash}.

Scoped Vue CSS将由postcss构建为.{className}[data-v-{componentHash}].将componentHash被施加到该组件中的每一个元素.

这两种方法都是基于哈希和类名编译CSS.Scoped CSS还为HTML添加了额外的数据属性.CSS模块使用javascript来管理样式.

虽然他们都做了几乎相同的事情,但对我而言,唯一真正的区别在于如何创建类.我想CSS模块应该更高效,因为所有类的特异性较低,但它实际上取决于编写CSS的人.在我个人看来,我会坚持使用更简单的一个(我会让你决定哪一个)

  • 我想补充一点,作用域样式的一个大问题*可以*是使用外部库或全局样式。您在组件中使用的类按原样传递。因此,一个无辜的 `.wrapper[data-v-54321]` 类也会应用全局/外部 `.wrapper` 类所具有的任何 CSS。这通常是一个“显示”值,而且……好吧,接下来的有趣时光!:D (3认同)
  • 谢谢。我也自己读书。您没有详细解释的另一个重要区别是如何在HTML中应用类。在CSSModules中,您需要将JavaScript对象与绑定一起使用(`:class =“ $ style.className”),而在Scoped样式中,您应应用类常规(class =“ className”)。 (2认同)