webpack4 處理SCSS的方法示例
這節(jié)課講解webpack4中處理scss。只需要在處理css的配置上增加編譯scss的 LOADER 即可。
1. 準(zhǔn)備工作
為了方便敘述,這次代碼目錄的樣式文件只有一個(gè)scss文件,以幫助我們了解核心 LOADER 的使用。
下圖展示了這次的目錄代碼結(jié)構(gòu): 目錄結(jié)構(gòu)

這次我們需要用到node-sass,sass-loader等 LOADER,package.json如下:
{
"devDependencies": {
"css-loader": "^1.0.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"node-sass": "^4.9.2",
"sass-loader": "^7.0.3",
"style-loader": "^0.21.0",
"webpack": "^4.16.0"
}
}
其中,base.scss代碼如下:
$bgColor: red !default;
*,
body {
margin: 0;
padding: 0;
}
html {
background-color: $bgColor;
}
index.html代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script src="./dist/app.bundle.js"></script> </body> </html>
2. 編譯打包scss
首先,在入口文件app.js中引入我們的 scss 樣式文件:
import "./scss/base.scss";
下面,開始編寫webpack.config.js文件:
const path = require("path");
module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: __dirname + "/dist/",
path: path.resolve(__dirname, "dist"),
filename: "[name].bundle.js"
},
module: {
rules: [
{
test: /\.scss$/,
use: [
{
loader: "style-loader" // 將 JS 字符串生成為 style 節(jié)點(diǎn)
},
{
loader: "css-loader" // 將 CSS 轉(zhuǎn)化成 CommonJS 模塊
},
{
loader: "sass-loader" // 將 Sass 編譯成 CSS
}
]
}
]
}
};
需要注意的是,module.rules.use數(shù)組中,loader 的位置。根據(jù) webpack 規(guī)則:放在最后的 loader 首先被執(zhí)行。所以,首先應(yīng)該利用sass-loader將 scss 編譯為 css,剩下的配置和處理 css 文件相同。
3. 檢查打包結(jié)果
因?yàn)?scss 是 css 預(yù)處理語(yǔ)言,所以我們要檢查下打包后的結(jié)果,打開控制臺(tái),如下圖所示:

同時(shí),對(duì)于其他的 css 預(yù)處理語(yǔ)言,處理方式一樣,首先應(yīng)該編譯成 css,然后交給 css 的相關(guān) loader 進(jìn)行處理。
處理sass文件
1.安裝sass和sass-loader
cnpm i node-sass sass-loader -D
創(chuàng)建一個(gè)src/sass/a.sass文件
$color:green;
#div2{
color: $color;
}
module:{ //我寫一個(gè)module
//配置一個(gè)rules(規(guī)則),rules是一個(gè)數(shù)組,里面包含一條一條的規(guī)則
rules:[
{
// test 表示測(cè)試什么文件類型
test:/\.css$/,
// 使用 'style-loader','css-loader'
use:ExtractTextPlugin.extract({
fallback:'style-loader', // 回滾
use:'css-loader',
publicPath:'../' //解決css背景圖的路徑問(wèn)題
})
},
{
test:/\.less$/,
use:ExtractTextPlugin.extract({ //分離less編譯后的css文件
fallback:'style-loader',
use:['css-loader','less-loader']
})
},
{
test:/\.(sass|scss)$/,
use:['style-loader','css-loader','sass-loader']
},
{
test:/\.(png|jpg|gif)$/,
use:[{
loader:'url-loader',
options:{ // 這里的options選項(xiàng)參數(shù)可以定義多大的圖片轉(zhuǎn)換為base64
limit:50000, // 表示小于50kb的圖片轉(zhuǎn)為base64,大于50kb的是路徑
outputPath:'images' //定義輸出的圖片文件夾
}
}]
}
]
},
自動(dòng)添加css前綴
postCss 預(yù)處理器
專門處理css平臺(tái)
1.下載
cnpm i postcss-loader autoprefixer -D
2.準(zhǔn)備建一個(gè) postcss.config.js文件 配置postcss的
module.exports = {
plugins:[
require('autoprefixer') // 自動(dòng)添加css前綴
]
}
3.配置postcss-loader,自動(dòng)添加css前綴
module:{ //我寫一個(gè)module
//配置一個(gè)rules(規(guī)則),rules是一個(gè)數(shù)組,里面包含一條一條的規(guī)則
rules:[
{
// test 表示測(cè)試什么文件類型
test:/\.css$/,
// 使用 'style-loader','css-loader'
use:ExtractTextPlugin.extract({
fallback:'style-loader', // 回滾
use:[
{loader:'css-loader'},
{loader:'postcss-loader'} //利用postcss-loader自動(dòng)添加css前綴
],
publicPath:'../' //解決css背景圖的路徑問(wèn)題
})
},
{
test:/\.less$/,
use:ExtractTextPlugin.extract({ //分離less編譯后的css文件
fallback:'style-loader',
use:['css-loader','less-loader']
})
},
{
test:/\.(sass|scss)$/,
use:['style-loader','css-loader','sass-loader']
},
{
test:/\.(png|jpg|gif)$/,
use:[{
loader:'url-loader',
options:{ // 這里的options選項(xiàng)參數(shù)可以定義多大的圖片轉(zhuǎn)換為base64
limit:50000, // 表示小于50kb的圖片轉(zhuǎn)為base64,大于50kb的是路徑
outputPath:'images' //定義輸出的圖片文件夾
}
}]
}
]
},
自動(dòng)消除冗余的css代碼
使用Purifycss
1.下載
cnpm i purifycss-webpack purify-css -D
2.引入插件
const PurifyCssWebpack = require('purifycss-webpack');
3.需要引入一個(gè)額外模塊,glob掃描路徑
cnpm i glob -D
4.引入glob
const glob = require('glob');
5.在plugins里面配置
plugins:[
// Uglify是壓縮js,現(xiàn)在已經(jīng)不需要了,只需要在script里面寫成
// "build": "webpack --mode production", 就自動(dòng)壓縮額
//new Uglify(),
new Webpack.HotModuleReplacementPlugin(),
new HtmlWebpackPlugin({
title:'Hello World',
template: './src/index.html' //模板地址
}),
new ExtractTextPlugin('css/index.css'), //都提到dist目錄下的css目錄中,文件名是index.css里面
new PurifyCssWebpack({ //消除冗余代碼
// 首先保證找路徑不是異步的,所以這里用同步的方法
// path.join()也是path里面的方法,主要用來(lái)合并路徑的
// 'src/*.html' 表示掃描每個(gè)html的css
paths:glob.sync(path.join(__dirname,'src/*.html'))
})
]
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)前端分頁(yè)控件
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)前端分頁(yè)控件的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖運(yùn)動(dòng)效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖運(yùn)動(dòng)效果,結(jié)合完整實(shí)例形式分析了javascript基于定時(shí)器動(dòng)態(tài)修改頁(yè)面元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2016-12-12
JS對(duì)象與json字符串相互轉(zhuǎn)換實(shí)現(xiàn)方法示例
這篇文章主要介紹了JS對(duì)象與json字符串相互轉(zhuǎn)換實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了js對(duì)象與json字符串相互轉(zhuǎn)換的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-06-06
JS使用window.requestAnimationFrame()實(shí)現(xiàn)逐幀動(dòng)畫
這篇文章介紹了JS使用window.requestAnimationFrame()實(shí)現(xiàn)逐幀動(dòng)畫的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
JavaScript函數(shù)式編程實(shí)現(xiàn)介紹
函數(shù)式編程是一種編程范式,將整個(gè)程序都由函數(shù)調(diào)用以及函數(shù)組合構(gòu)成。 可以看成一條流水線,數(shù)據(jù)可以不斷地從一個(gè)函數(shù)的輸出流入另一個(gè)函數(shù)的輸入,最后輸出結(jié)果2022-09-09
js純數(shù)字逐一停止顯示效果的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇js純數(shù)字逐一停止顯示效果的實(shí)現(xiàn)代碼。小編覺得非常不錯(cuò)?,F(xiàn)在分享給大家。給大家一個(gè)參考2016-03-03
nestjs返回給前端數(shù)據(jù)格式的封裝實(shí)現(xiàn)
這篇文章主要介紹了nestjs返回給前端數(shù)據(jù)格式的封裝實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

