本章節,咱們對如何在腳手架中引入CSS,如何壓縮CSS,如何使用CSS Modules,如何使用less,如何使用postcss等問題進行展開學習。css
h1{ display: flex; height: 200px; align-items: center; justify-content: center; color: #8FBC8F; }
import './index.css'
在第一節,咱們知道,webpack只能編譯js文件,不能編譯css,它不認識css文件,因此須要配置loader加載器來預處理。
首先安裝style-loader和css-loader:html
npm install --save-dev style-loader css-loader
在webpack.prod.conf.js中配置:前端
module: { rules: [ { test: /\.(css)$/, use: [ 'style-loader', 'css-loader', ] } ] },
loader的加載順序是從右邊到左邊,css-loader是加載經過import引入的css文件,而style-loader的做用是把樣式插入到DOM中。node
最後,執行npm run build試試看樣式是否生效。react
npm run build
打開頁面,發現樣式已經生效了。打開控制檯查看,你會發現css的確是經過style在頁面上方插入的。webpack
npm install mini-css-extract-plugin --save-dev
在webpack.prod.conf.js中引入web
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module: { rules: [ { test: /\.(css)$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', } ] } ] },
//導出css new MiniCssExtractPlugin({ filename: 'css/[name].[hash].css', chunkFilename: 'css/[id].[hash].css', }),
最後你的webpack.prod.conf.js看起來是這樣npm
const merge = require('webpack-merge'); const baseWebpackConfig = require('./webpack.base.conf'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); module.exports = merge(baseWebpackConfig, { mode: 'production', output: { filename: "js/[name].[chunkhash:16].js", }, module: { rules: [ { test: /\.(css)$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', } ] } ] }, plugins: [ new HtmlWebpackPlugin({ template: 'public/index.html', inject: 'body', minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true }, }), new CleanWebpackPlugin(['../dist'], { allowExternal: true }), //導出css new MiniCssExtractPlugin({ filename: 'css/[name].[hash].css', chunkFilename: 'css/[id].[hash].css', }), ], optimization: { minimizer: [ new UglifyJSPlugin() ], splitChunks: { chunks: "all", minChunks: 1, cacheGroups: { framework: { priority: 200, test: "framework", name: "framework", enforce: true, reuseExistingChunk: true }, vendor: { priority: 10, test: /node_modules/, name: "vendor", enforce: true, reuseExistingChunk: true } } } } });
npm run build
查看下dist目錄,你會看到css已經被編譯到css文件夾中,而且在html文件中成功引入。數組
npm install optimize-css-assets-webpack-plugin --save-dev
在webpack.prod.conf.js中引入optimize-css-assets-webpack-plugin :瀏覽器
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
minimizer參數是配置在optimization參數內,和splitChunks同級。
minimizer: [ new UglifyJSPlugin(), new OptimizeCSSAssetsPlugin({ cssProcessorOptions: true ? { map: { inline: false } } : {} }) ],
npm run build
再次查看dist/css目錄下的css文件,你會發現已是壓縮後的了。
配置loader,傳入的是數組,它的子項,能夠是字符串,好比'css-loader',也能夠是一個對象,支持其餘參數的設置,設置loader爲:
{ loader: 'css-loader', options: { modules: true, localIdentName: '[local]__[hash:7]' } }
modules參數,定義是否開啓css modules,默認是否。localIdentName定義生成class的名稱格式,這樣設置後,若是你定義了一個叫main的class,最後生成的是main__i72tywq這樣的格式。
修改index.js
import React from "react"; import ReactDom from "react-dom"; import indexStyle from './index.css'; ReactDom.render( <h1 className={indexStyle.main}>hello, world!</h1>, document.getElementById("root") );
定義一個main的class
.main{ display: flex; height: 200px; align-items: center; justify-content: center; color: #8FBC8F; }
npm run build
在dist目錄打開編譯後的index.css文件,查看css,發現 class名稱後都加了hash後綴,並且html中的引用也是加了後綴。
npm install less less-loader --save-dev
在webpack.prod.conf.js中的module.rules內增長一個對象:
{ test: /\.(less)$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { modules: true, localIdentName: '[local]__[hash:7]' } }, { loader: 'less-loader' } ] }
npm run build
在dist目錄打開編譯後的index.css文件,查看css,less文件成功被編譯。引入sass也是相似。這裏再也不闡述。
npm install postcss postcss-loader --save-dev
npm install autoprefixer --save-dev
在根目錄新建postcss.config.js
module.exports = () => ({ plugins: { autoprefixer: { browsers: ['last 5 version', '>1%', 'ie >=8'] }, } });
修改webpack.prod.conf.js中的中的module.rules
module: { rules: [ { test: /\.(css)$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { importLoaders: 1, modules: true, localIdentName: '[local]__[hash:7]' } }, { loader: 'postcss-loader' } ] }, { test: /\.(less)$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { importLoaders: 1, modules: true, localIdentName: '[local]__[hash:7]' } }, { loader: 'postcss-loader' }, { loader: 'less-loader' } ] } ] },
npm run build
看下編譯生成的css文件,查看代碼,已經自動加了瀏覽器前綴。
最後你能夠把webpack.prod.conf.js內關於module rules的設置拷貝到webpack.dev.conf.js,修改第一個爲style-loader
module: { rules: [ { test: /\.(css)$/, use: [ 'style-loader', { loader: 'css-loader', options: { importLoaders: 1, modules: true, localIdentName: '[local]__[hash:7]' } }, { loader: 'postcss-loader' } ] }, { test: /\.(less)$/, use: [ 'style-loader', { loader: 'css-loader', options: { importLoaders: 1, modules: true, localIdentName: '[local]__[hash:7]' } }, { loader: 'postcss-loader' }, { loader: 'less-loader' } ] } ] },
你能夠執行 npm run dev來啓動開發環境。