在webpack
中任何一個(gè)東西都稱為模塊,js
就不用說(shuō)了。一個(gè)css
文件,一張圖片、一個(gè)less
文件都是一個(gè)模塊,都能用導(dǎo)入模塊的語(yǔ)法(commonjs
的require
,ES6
的import
)導(dǎo)入進(jìn)來(lái)。webpack
自身只能讀懂js
類型的文件,其它的都不認(rèn)識(shí)。但是webpack
卻能編譯打包其它類型的文件,像ES6
、JSX
、less
、typeScript
等,甚至css
、images
也是Ok的,而想要編譯打包這些文件就需要借助loader
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的滄縣網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
loader
就像是一個(gè)翻譯員,瀏覽器不是不認(rèn)識(shí)這些東西么?那好交給loader
來(lái)辦,它能把這些東西都翻譯成瀏覽器認(rèn)識(shí)的語(yǔ)言。loader
描述了webpack
如何處理非js
模塊,而這些模塊想要打包loader
必不可少,所以它在webpack
里顯得異常重要。loader
跟插件一樣都是模塊,想要用它需要先安裝它,使用的時(shí)候把它放在module.rules
參數(shù)里,rules
翻譯過(guò)來(lái)的意思就是規(guī)則,所以也可以認(rèn)為loader
就是一個(gè)用來(lái)處理不同文件的規(guī)則
這節(jié)課需要用到圖片跟樣式,所以我要按傳統(tǒng)的目錄結(jié)構(gòu)來(lái)創(chuàng)建目錄,目錄如下
結(jié)構(gòu)目錄
style-loader //把處理完的css放到style標(biāo)簽里
css-loader //處理css
npm i style-loader css-loader -D
index.css
文件內(nèi)容如下:#box{
width: 800px;
height: 500px;
border: 5px solid #999;
color: #00f;
background: green;
}
index.js
文件內(nèi)容如下:import '../css/index.css'; //兩個(gè)點(diǎn)是找上級(jí)目錄
通過(guò)前面的課程大家要明白,webpack
的入口文件是index.js
,如果要處理其它類型的文件,就需要在入口文件里把其它類型的文件導(dǎo)入進(jìn)來(lái),而在webpack
中所有文件都是模塊,所以可以使用require
或者import
導(dǎo)入其它文件
package.json
文件內(nèi)容如下:{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "webpack.config.js",
"scripts": {
"build": "webpack --mode production",
"dev": "webpack-dev-server --mode development"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^1.0.0",
"html-webpack-plugin": "^3.2.0",
"style-loader": "^0.21.0",
"webpack": "^4.16.3",
"webpack-cli": "^3.1.0",
"webpack-dev-server": "^3.1.5"
}
}
webpack.package.json
文件內(nèi)容如下:const path=require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');
module.exports={
entry:{
index:'./src/js/index.js',
},
output:{
path:path.resolve(__dirname,'dist'),
filename:'[name].bundle.js'
},
plugins:[
new HtmlWebpackPlugin({
title:'陳學(xué)輝',
template:'./src/template.html',
filename:'index.html',
})
],
devServer:{
host:'localhost',
port:1573,
open:true,
},
module:{
rules:[
{
test:/\.css$/, //以點(diǎn)開(kāi)始css結(jié)尾的文件
use:['style-loader','css-loader'] //順序不能搞錯(cuò)
}
]
},
}
執(zhí)行命令npm run dev
后就可以看到效果
說(shuō)明
rules
里的數(shù)據(jù)類型為對(duì)象,每一個(gè)loader
都是一個(gè)對(duì)象test
表示loader
要處理什么類型的文件,這里用了一個(gè)正則去匹配文件類型use
表示要使用哪個(gè)loader
,它的值是個(gè)數(shù)組,loader
的使用順序是從后往前- 這個(gè)
loader
的意思為,在入口文件里找到.css
類型的文件,先拿css-loader
去處理成瀏覽器認(rèn)識(shí)的css
,再拿style-loader
把處理后的css
放在頁(yè)面的style
標(biāo)簽里
css-loader
其它配置:https://www.webpackjs.com/loaders/css-loader/style-loader
其它配置:https://www.webpackjs.com/loaders/style-loader/
執(zhí)行命令npm run build
后,在dist
目錄里只有兩個(gè)文件,一個(gè)index.bundle.js
一個(gè)index.html
文件,并沒(méi)有css
文件,同時(shí)打開(kāi)index.html
源碼后也沒(méi)有發(fā)現(xiàn)有css
的內(nèi)容。這是因?yàn)?code>style-loader的作用,它把css
一同打包到了js
文件里,js
文件在能過(guò)DOM
動(dòng)態(tài)創(chuàng)建style
標(biāo)簽并添加到頁(yè)面里。所以css
的內(nèi)容已經(jīng)放到了index.bundle.js
里。
這種形式只有當(dāng)文件內(nèi)容不多的時(shí)候可以使用,如果CSS
的內(nèi)容以及JS
的內(nèi)容非常的多,把兩塊都打包到一個(gè)文件里就會(huì)增加文件的體積,用戶打開(kāi)頁(yè)面的時(shí)候下載速度會(huì)受影響,同減肥影響用戶體驗(yàn)。這就需要把CSS
文件單獨(dú)拎出來(lái),那需要一個(gè)插件來(lái)配合loader
才能完成
webpack
版本需要4.3以上,低版本請(qǐng)使用extract-text-webpack-plugin
使用步驟:
1、安裝
npm i mini-css-extract-plugin -D
2、在webpack.config.js
里引入模塊
const MiniCssExtractPlugin=require("mini-css-extract-plugin");
3、寫(xiě)入plugins
plugins:[
new HtmlWebpackPlugin({
title:'陳學(xué)輝',
template:'./src/template.html',
filename:'index.html',
}),
new MiniCssExtractPlugin({
filename:'css/index.css' //文件目錄會(huì)放入output.path里
}),
]
4、寫(xiě)入loader
module:{
rules:[
{
test:/\.css$/,
use:[MiniCssExtractPlugin.loader,"css-loader"] //代替style-loader
}
]
}
執(zhí)行命令npm run build
后可以看到dist
目錄里已經(jīng)多了一個(gè)css
文件夾,這個(gè)文件夾里放了一個(gè)index.css
文件。打開(kāi)index.html
源碼看到css
文件已經(jīng)通過(guò)link
標(biāo)簽引入,這些功能都是mini-css-extract-plugin
所做的
mini-css-extract-plugin
其它配置:https://github.com/webpack-contrib/mini-css-extract-plugin
file-loader //解析地址
url-loader //把圖片地址解析成base64
npm i file-loader url-loader -D
index.css
文件內(nèi)容如下:#box{
width: 800px;
height: 500px;
border: 5px solid #999;
color: #00f;
/*background: green;*/
background: url(../images/img_01.jpg); //背景改成了圖片
}
index.js
文件內(nèi)容如下:import '../css/index.css'; //兩個(gè)點(diǎn)是找上級(jí)目錄
webpack.package.json
文件內(nèi)容如下:const path=require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');
module.exports={
entry:{
index:'./src/js/index.js',
},
output:{
path:path.resolve(__dirname,'dist'),
filename:'[name].bundle.js'
},
plugins:[
new HtmlWebpackPlugin({
title:'陳學(xué)輝',
template:'./src/template.html',
filename:'index.html',
})
],
devServer:{
host:'localhost',
port:1573,
open:true,
},
module:{
rules:[
{
test:/\.css$/, //以點(diǎn)開(kāi)始css結(jié)尾的文件
use:[
//這是一個(gè)loader,如果loader需要給參數(shù),就寫(xiě)成對(duì)象的形式
{
loader:MiniCssExtractPlugin.loader, //loader是哪個(gè)
options:{ //所有的配置參數(shù)都要放在這個(gè)對(duì)象里面
publicPath:'../' //這個(gè)表示在css文件里但凡用到地址的地方在其前面加個(gè)目錄'../',這個(gè)是為了能找到圖片
}
},
'css-loader' //這個(gè)loader沒(méi)有其它選項(xiàng)就直接寫(xiě)
]
},
{
test:/\.(jpg|png|gif)$/, //找到三種格式中的任意一種
use:['file-loader']
}
]
},
}
執(zhí)行命令npm run dev
后就可以看到效果
說(shuō)明
loader
既可以寫(xiě)成字符串的形式,也可以寫(xiě)成對(duì)象的形式。如果這個(gè)loader
需要給一些配置,那就需要寫(xiě)成對(duì)象的形式,所有的配置放到options
里- 這里一定要注意第一個(gè)
loader
的use
屬性,它里面放的是一個(gè)個(gè)loader
,每個(gè)loader
的值既可以是對(duì)象形式,又可以是字符串形式
file-loader
其它配置:https://www.webpackjs.com/loaders/file-loader/
index.js
文件內(nèi)容如下:
import '../css/index.css';
import img1 from '../images/img_01.jpg';
import img2 from '../images/img_02.jpg';
const loadImg=img=>{
const newImg=new Image();
newImg.onload=()=>document.body.appendChild(newImg);
newImg.src=img;
};
loadImg(img1);
loadImg(img2);
webpack.package.json
文件內(nèi)容如下:const path=require('path');
const HtmlWebpackPlugin=require('html-webpack-plugin');
const MiniCssExtractPlugin=require("mini-css-extract-plugin");
module.exports={
entry:{
index:'./src/js/index.js',
},
output:{
path:path.resolve(__dirname,'dist'),
filename:'[name].bundle.js'
},
plugins:[
new HtmlWebpackPlugin({
title:'陳學(xué)輝',
template:'./src/template.html',
filename:'index.html',
}),
new MiniCssExtractPlugin({
filename:'css/index.css'
}),
],
devServer:{
host:'localhost',
port:1573,
open:true,
},
module:{
rules:[
{
test:/\.css$/,
use:[
{
loader:MiniCssExtractPlugin.loader,
options:{
publicPath:'../'
}
},
"css-loader"
]
},
{
test:/\.(jpg|png|gif)$/,
//use:['file-loader']
use:[
{
loader:'url-loader', //把圖片轉(zhuǎn)成base64
options:{
limit:50*1024, //小于50k就會(huì)轉(zhuǎn)成base64
outputPath: 'images'
}
}
]
//use:'url-loader?limit=50000&outputPath=images' //loader的另一種寫(xiě)法,與get請(qǐng)求方式相同
}
]
},
}
執(zhí)行命令npm run dev
后就可以看到效果
說(shuō)明
url-loader
的作用是把圖片轉(zhuǎn)成base64
,它同樣可以給配置參數(shù)limit
的作用是小于這個(gè)值就會(huì)轉(zhuǎn)base64
- 只用了
url-loader
,并沒(méi)有用file-loader
,說(shuō)明url-loader
里已經(jīng)包含了file-loader
的功能loader
還可以寫(xiě)成地址的形式,與get
的請(qǐng)求方式相同
url-loader
其它配置:https://www.webpackjs.com/loaders/url-loader/
資料下載:https://pan.baidu.com/s/1tgNtUZHe3oTmVMi96tHTXQ
下一篇:Webpack 4.X 從入門(mén)到精通 - loader(五)