CSS Modules

需要 ^9.8.0 以上版本

CSS Modules是一个流行的模块化和组合CSS的系统。 vue-loader提供了将css Modules作为css作用域的一流集成。

用法

只需要在你的<style>上添加 module 属性:

  1. <style module>
  2. .red {
  3. color: red;
  4. }
  5. .bold {
  6. font-weight: bold;
  7. }
  8. </style>

这将打开css-loader的CSS Modules模式,并且将生成的类标识符对象注入到组件中作为名为$ style的计算属性。 你可以在模板中使用它与动态类绑定:

  1. <template>
  2. <p :class="$style.red">
  3. 这里应当是红色的
  4. </p>
  5. </template>

因为它是一个计算属性,它也适用于class的object/array语法:

  1. <template>
  2. <div>
  3. <p :class="{ [$style.red]: isRed }">
  4. 我是红色的?
  5. </p>
  6. <p :class="[$style.red, $style.bold]">
  7. 红色的、加粗的
  8. </p>
  9. </div>
  10. </template>

你也可以从JavaScript访问它:

  1. <script>
  2. export default {
  3. created () {
  4. console.log(this.$style.red)
  5. // -> "_1VyoJ-uZOjlOxP7jWUy19_0"
  6. // 基于filename和className生成的标识符。
  7. }
  8. }
  9. </script>

参考CSS Modules规格了解模式详细信息,如全局异常composition

自定义注入名称

你可以在一个* .vue组件中有多个<style>标签。为了避免注入的样式彼此覆盖,可以通过给module属性一个值来定制注入的计算属性的名称:

  1. <style module="a">
  2. /* 标识符注入为 a */
  3. </style>
  4. <style module="b">
  5. /* 标识符注入为 b */
  6. </style>

配置 css-loader 查询

CSS Modules 通过css-loader进行处理。 使用<style module>css-loader的默认查询是:

  1. {
  2. modules: true,
  3. importLoaders: true,
  4. localIdentName: '[hash:base64]'
  5. }

您可以使用vue-loader的cssModules选项为css-loader提供其他查询选项:

  1. // webpack 1
  2. vue: {
  3. cssModules: {
  4. // overwrite local ident name
  5. localIdentName: '[path][name]---[local]---[hash:base64:5]',
  6. // enable camelCase
  7. camelCase: true
  8. }
  9. }
  10. // webpack 2
  11. module: {
  12. rules: [
  13. {
  14. test: '\.vue$',
  15. loader: 'vue-loader',
  16. options: {
  17. cssModules: {
  18. localIdentName: '[path][name]---[local]---[hash:base64:5]',
  19. camelCase: true
  20. }
  21. }
  22. }
  23. ]
  24. }