feng xiaohan

CSS Modules

CSS 模块化,主要是包括两个方面:局部作用域和模块依赖。

局部作用域

保证某个组件的样式不会影响到其他组件,其原理就是使用一个独一无二的 class 名,不会与其他选择器重名。

为什么不使用 id 来确定:样式复用,样式覆盖问题,语义化。

CSS Modules 提供各种插件,支持不同的构建工具。

全局作用域

CSS Modules 允许使用:global(.className)的语法,声明一个全局规则。凡是这样声明的 class,都不会被编译成哈希字符串。

局部作用域

  • 显示局部作用域::local(.className)
  • (隐式)局部作用域:.className(直接写)

定制哈希类名

对于插件 css-loader 来说,默认的哈希算法是[hash:base64],这会将.title 编译成.\_3zyde4l1yATCOkgn-DBWEL这样的字符串。

CSS 组合

在 CSS Module 中可以使用composes继承别的 class 的样式:

.className {
  background-color: blue;
}

.title {
  composes: className;
  color: red;
}

引入其他 CSS 模块样式

选择器也可以继承其他 CSS 文件里面的规则。

.className {
  background-color: blue;
}
.title {
  composes: className from "./another.css";
  color: red;
}

导出变量

CSS Modules 支持使用变量,不过需要安装 PostCSS 和 postcss-modules-values 插件。

npm install --save postcss-loader postcss-modules-values
  • 例如在 webpack 中引入 postcss-loader
var path = require("path");
var webpack = require("webpack");
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var values = require("postcss-modules-values");

module.exports = {
  entry: ["./src/index"],
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "public"),
    publicPath: "/public/",
  },
  module: {
    loaders: [
      { test: /\.js$/, loader: "babel-loader", exclude: /node_modules/ },
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract(
          "style-loader",
          "css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader"
        ),
      },
    ],
  },
  postcss: [values],
  plugins: [new ExtractTextPlugin("style.css", { allChunks: true })],
};
  • 设置变量

colors.css

@value blue: #0c77f8;
@value red: #ff0000;
@value green: #aaf200;
  • 引入 css 文件中
/* import your colors... */
@value colors: "./colors.css";
@value blue, red, green from colors;

.button {
  color: blue;
  display: inline-block;
}