webpack4 css modules

demo 代碼點此,webpack4 中經過 css-loader 開啓 css 模塊化, 開始前先作點準備工做。css

不瞭解 css 模塊化的,能夠前往查看github_css_modules.html

## 準備工做

安裝 webpack:node

npm init -y
npm i -D webpack webpack-cli css-loader

建立 webpack.config.js 進行配置:webpack

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: {
    main: './src/index.js'
  },
  module: {
    rules: [
      // 不在 node_modules 中的 css,開啓 css modules
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              /* 之前版本是經過 true 開啓,相關配置接着寫
                modules: true
                localIdentName: '[name]__[local]--[hash:base64:5]'
                */
              // 如今是給 modules 一個 options 對象開啓
              modules: {
                // 從新生成的 css 類名
                localIdentName: '[name]__[local]--[hash:base64:5]'
              }
            }
          }
        ]
      },
       // 在 node_modules 中的 css,不開啓
      {
        test: /\.css$/,
        include: /node_modules/,
        use: [
          MiniCssExtractPlugin.loader, 'css-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, './src/index.html'),
      filename: 'index.html'
    }),
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css'
    })
  ],
  output: {
    filename: '[name].[hash].bundle.js',
    path: path.resolve(__dirname, './dist')
  }
}

更多 css-loader 的配置建議前往 github_css-loader 查看,由於版本更新後,配置可能會有變。git

## 編寫 css

配置完 webpack,寫 css 時要使用相關語法,由於是經過 webpack 打包時進行編譯,從新生成新的 css 類名來防止全局變量名污染的。github

注意: css modules 只針對類、Id選擇器生效,不會對標籤選擇器進行模塊化。 web

/* 全局樣式 */
:global(.header) {
  color: #696969;
  background-color: #fff;
}

:global .main {
  color: #363636;
  background-color: #fff;
}

/* less 等預處理語言能夠這樣寫 */
/* :global {
  .footer {
    color: #303030;
    background-color: #fff;
  }
} */


/* 局部樣式 */
:local(.header) {
  color: red;
  background-color: #c2b1b1;
}

:local(.main) {
  color: yellow;
  background-color: rgb(136, 96, 96);
}

:local(.footer) {
  color: blue;
  background-color: #929292;
}

編譯後的 css 代碼:shell

/* 全局樣式 */
.header {
  color: #696969;
  background-color: #fff;
}

.main {
  color: #363636;
  background-color: #fff;
}

/* less 等預處理語言能夠這樣寫 */
/* :global {
  .footer {
    color: #303030;
    background-color: #fff;
  }
} */


/* 局部樣式 */
.index__header--1JD7j {
  color: red;
  background-color: #c2b1b1;
}

.index__main--1j9-Y {
  color: yellow;
  background-color: rgb(136, 96, 96);
}

.index__footer--gJKjp {
  color: blue;
  background-color: #929292;
}

## 使用

由於 css 類名是從新編譯後的,因此使用時不能直接使用原 css 類名,要經過 import 語法使用。npm

import styles from './index.css';

export const Header = () => {
  return `
    <h1 class=${styles.header}>header</h1>
  `
}

在 html 裏面是這樣的:less

<h1 class="index__header--1JD7j">header</h1>
相關文章
相關標籤/搜索