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
配置完 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>