上一章我們學習如何來處理 html 文件,打包、hash戳我們已經瞭解了,那麼接下來這一章我們要學習的是如何來處理樣式,好比:css、less這些應該如何處理呢?那麼,讓咱們一塊兒來學習吧!!!css
咱們知道,webpack 默認是支持 js 模塊的,那麼,咱們如今 src 目錄下面創建一個 css 文件,而後在 js 中引入css文件,固然有小夥伴會問了,爲何不在 html中引入 css呢? 咱們的 html 文件只是一個模板,在它裏面引入css的話它會原封不動的輸出,咱們的css並不會打包到build目錄下面,因此這種方法是不行的。 html
首先咱們新建一個css文件,而後在js文件中引入咱們的css文件,如上圖。這個時候咱們啓動一下服務來看一下:(npm run dev
) 這個時候是會報錯的,提示咱們說不支持,由於這個東西默認不是一個模塊,你須要一個合適的 loader去解析這個模塊。
loader的做用:把咱們的源代碼進行轉化,能夠幫咱們轉化出來一個模塊。webpack
如上所述,這個時候就須要來配置咱們的 css模塊了。web
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html',
filename: 'index.html',
minify: {
removeAttributeQuotes: true,
collapseWhitespace: true
},
hash: true
})
],
module: { //模塊
rules: [ //規則
// css-loader(處理咱們的css,主要負責解析 @import這種語法的)
// style-loader 它是把 css 插入到 head 的標籤中
// loader的特色: 但願單一性(一個loader處理一件事情)
// loader 的用法 :一個 loader 用字符串表示,多個loader 須要用 []表示
// loader 的順序,默認是從右向左執行 從下到上執行
// loader 還能夠寫成對象的方式,能夠傳參數
{
test: /\.css$/, //用正則來匹配以 css 結尾的文件
use: [
//咱們要先處理 css樣式,在插入到 head標籤中去
'style-loader',
'css-loader'
]
}
]
}
複製代碼
上面的配置已經詳細的介紹了我們用到的這兩個loader的做用,那麼如今讓咱們重啓一下服務,看一下loader起做用了嗎: npm
運行結果如圖,爲何沒有找到呢,那是由於咱們只是配置了 loader,可是尚未安裝這兩個loader,因此找不到,安裝命令:
這個時候已經運行正常了,那麼,讓咱們來訪問一下頁面: 能夠看到,頁面的背景如今應景變成了紅色,和我們設置的顏色是同樣的,說明 css-loader 運行成功。 打開調試工具,能夠看到咱們的樣式是插入到head標籤中的,這說明咱們的 style-loader也是起做用的。yarn add css-loader style-loader -D
. 安裝好以後再從新啓動服務: 數組
配置文件中也說明了這個,如今來讓咱們試一試。瀏覽器
重啓服務: 緩存
如圖,和咱們設置的樣式是同樣的,說明這兩個loader都運行成功。
yarn add less less-loader -D
module: { //模塊
rules: [ //規則
{
test: /\.css$/, //用正則來匹配以 css 結尾的文件
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.less$/,
use: [
'style-loader',
'css-loader',
'less-loader' //把 less --->轉換爲 css
]
}
]
}
複製代碼
這個時候咱們可以看到樣式已經生效,說明 less文件能夠加載了。 併發
從上圖咱們能夠看到,咱們所寫的css、less樣式都會放到head標籤中,那麼咱們如何單獨把css的內容抽離出來用link標籤的形式引入呢:less
css
的插件 : yarn add mini-css-extract-plugin -D
let MiniCssExtractPlugin = require('mini-css-extract-plugin')
plugins: [ //數組, 放着全部的 webpack插件
new MiniCssExtractPlugin({
filename:'main.css', //抽離出來的css的文件的名字
})
],
複製代碼
module: { //模塊
rules: [ //規則
{
test: /\.css$/, //用正則來匹配以 css 結尾的文件
use: [
MiniCssExtractPlugin.loader,//這個loader的做用是:抽離出來 css而後用 link 標籤引入到 模板文件中
'css-loader'
]
![](https://user-gold-cdn.xitu.io/2019/11/14/16e68118b17b28e6?w=1477&h=705&f=jpeg&s=127105) },
{
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,//這個loader的做用是:抽離出來 css而後用 link 標籤引入到 模板文件中
'css-loader',
'less-loader' //把 less --->轉換爲 css
]
}
]
}
複製代碼
npm run build
命令,看一下是否單獨抽離出來css文件:
能夠看到,咱們的css文件已經被單獨抽離出來了,啓動一下服務看一下頁面效果:
如今已經變成抽離出來的css文件是用link標籤來引入的。
css有些樣式爲了支持每一個瀏覽器,須要添加前綴,接下來咱們學習一下如何自動添加前綴。 咱們先來試一下如今的效果,咱們在less文件中添加樣式:
執行打包命令能夠看到打包出來的main.css文件中樣式並無添加前綴:
yarn add postcss-loader autoprefixer -D
而後進行配置:加前綴的 loader 是在 解析 css
的 loader以前,配置 css
規則中的配置:module: {
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader' //自動添加前綴的 loader
]
},
{
// 能夠處理 less 文件。
test: /\.less$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader', //自動添加前綴的 loader
'less-loader', //把 less ->轉換爲 css
]
},
]
},
複製代碼
這個時候你啓動服務的話是會報錯的(由於它須要一個配置文件):
postcss.config.js
(在項目的根目錄下創建) ,這個配置文件裏面的內容須要導出自動加前綴的插件:module.exports = {
plugins: [
require('autoprefixer')
]
}
複製代碼
那麼,這個時候咱們在來打包看一下:
已經將咱們的樣式前綴添加上了。
根據上圖咱們能夠看到,這個時候的css代碼是沒有打包的。
optimize-css-assets-webpack-plugin
,安裝插件。let OptimizeCss = require('optimize-css-assets-webpack-plugin')
複製代碼
module.exports = {
optimization: { //優化項
minimizer: [
new OptimizeCss() //優化css
]
},
plugins: [ //數組, 放着全部的 webpack插件
new HtmlWebpackPlugin({
template: './src/index.html', //模板文件(html文件)的位置
filename: 'index.html', //打包後的文件名字
minify: { //壓縮 html 文件
removeAttributeQuotes:true, //刪除屬性的雙引號
collapseWhitespace:true //摺疊空行,變成一行
},
hash: true,
}),
new MiniCssExtractPlugin({
filename:'main.css', //抽離出來的css的文件的名字
})
],
}
複製代碼
讓咱們打包一下,看一下效果:
咱們打包出來的css已經被壓縮。可是,這個時候咱們能夠看一下咱們的 js 文件,js 文件已經恢復到原樣了,並無被打包。
uglifyjs-webpack-plugin
這個插件 來 壓縮 js. 先要安裝插件。optimization: { //優化項
minimizer: [
new UglifyJsPlugin({
cache: true, //是否用緩存
parallel: true, //是不是併發打包(一塊兒壓縮多個)
sourceMap: true
}),
new OptimizeCss() //優化css
]
},
複製代碼
運行命令,打包看結果:
js又從新打包好了,css也能夠打包了。