您好,登錄后才能下訂單哦!
在webpack
中任何一個東西都稱為模塊,js
就不用說了。一個css
文件,一張圖片、一個less
文件都是一個模塊,都能用導入模塊的語法(commonjs
的require
,ES6
的import
)導入進來。webpack
自身只能讀懂js
類型的文件,其它的都不認識。但是webpack
卻能編譯打包其它類型的文件,像ES6
、JSX
、less
、typeScript
等,甚至css
、images
也是Ok的,而想要編譯打包這些文件就需要借助loader
loader
就像是一個翻譯員,瀏覽器不是不認識這些東西么?那好交給loader
來辦,它能把這些東西都翻譯成瀏覽器認識的語言。loader
描述了webpack
如何處理非js
模塊,而這些模塊想要打包loader
必不可少,所以它在webpack
里顯得異常重要。loader
跟插件一樣都是模塊,想要用它需要先安裝它,使用的時候把它放在module.rules
參數里,rules
翻譯過來的意思就是規則,所以也可以認為loader
就是一個用來處理不同文件的規則
這節課需要用到圖片跟樣式,所以我要按傳統的目錄結構來創建目錄,目錄如下
結構目錄
style-loader //把處理完的css放到style標簽里
css-loader //處理css
npm i style-loader css-loader -D
index.css
文件內容如下:#box{
width: 800px;
height: 500px;
border: 5px solid #999;
color: #00f;
background: green;
}
index.js
文件內容如下:import '../css/index.css'; //兩個點是找上級目錄
通過前面的課程大家要明白,webpack
的入口文件是index.js
,如果要處理其它類型的文件,就需要在入口文件里把其它類型的文件導入進來,而在webpack
中所有文件都是模塊,所以可以使用require
或者import
導入其它文件
package.json
文件內容如下:{
"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
文件內容如下: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:'陳學輝',
template:'./src/template.html',
filename:'index.html',
})
],
devServer:{
host:'localhost',
port:1573,
open:true,
},
module:{
rules:[
{
test:/\.css$/, //以點開始css結尾的文件
use:['style-loader','css-loader'] //順序不能搞錯
}
]
},
}
執行命令npm run dev
后就可以看到效果
說明
rules
里的數據類型為對象,每一個loader
都是一個對象test
表示loader
要處理什么類型的文件,這里用了一個正則去匹配文件類型use
表示要使用哪個loader
,它的值是個數組,loader
的使用順序是從后往前- 這個
loader
的意思為,在入口文件里找到.css
類型的文件,先拿css-loader
去處理成瀏覽器認識的css
,再拿style-loader
把處理后的css
放在頁面的style
標簽里
css-loader
其它配置:https://www.webpackjs.com/loaders/css-loader/style-loader
其它配置:https://www.webpackjs.com/loaders/style-loader/
執行命令npm run build
后,在dist
目錄里只有兩個文件,一個index.bundle.js
一個index.html
文件,并沒有css
文件,同時打開index.html
源碼后也沒有發現有css
的內容。這是因為style-loader
的作用,它把css
一同打包到了js
文件里,js
文件在能過DOM
動態創建style
標簽并添加到頁面里。所以css
的內容已經放到了index.bundle.js
里。
這種形式只有當文件內容不多的時候可以使用,如果CSS
的內容以及JS
的內容非常的多,把兩塊都打包到一個文件里就會增加文件的體積,用戶打開頁面的時候下載速度會受影響,同減肥影響用戶體驗。這就需要把CSS
文件單獨拎出來,那需要一個插件來配合loader
才能完成
webpack
版本需要4.3以上,低版本請使用extract-text-webpack-plugin
使用步驟:
1、安裝
npm i mini-css-extract-plugin -D
2、在webpack.config.js
里引入模塊
const MiniCssExtractPlugin=require("mini-css-extract-plugin");
3、寫入plugins
plugins:[
new HtmlWebpackPlugin({
title:'陳學輝',
template:'./src/template.html',
filename:'index.html',
}),
new MiniCssExtractPlugin({
filename:'css/index.css' //文件目錄會放入output.path里
}),
]
4、寫入loader
module:{
rules:[
{
test:/\.css$/,
use:[MiniCssExtractPlugin.loader,"css-loader"] //代替style-loader
}
]
}
執行命令npm run build
后可以看到dist
目錄里已經多了一個css
文件夾,這個文件夾里放了一個index.css
文件。打開index.html
源碼看到css
文件已經通過link
標簽引入,這些功能都是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
文件內容如下:#box{
width: 800px;
height: 500px;
border: 5px solid #999;
color: #00f;
/*background: green;*/
background: url(../images/img_01.jpg); //背景改成了圖片
}
index.js
文件內容如下:import '../css/index.css'; //兩個點是找上級目錄
webpack.package.json
文件內容如下: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:'陳學輝',
template:'./src/template.html',
filename:'index.html',
})
],
devServer:{
host:'localhost',
port:1573,
open:true,
},
module:{
rules:[
{
test:/\.css$/, //以點開始css結尾的文件
use:[
//這是一個loader,如果loader需要給參數,就寫成對象的形式
{
loader:MiniCssExtractPlugin.loader, //loader是哪個
options:{ //所有的配置參數都要放在這個對象里面
publicPath:'../' //這個表示在css文件里但凡用到地址的地方在其前面加個目錄'../',這個是為了能找到圖片
}
},
'css-loader' //這個loader沒有其它選項就直接寫
]
},
{
test:/\.(jpg|png|gif)$/, //找到三種格式中的任意一種
use:['file-loader']
}
]
},
}
執行命令npm run dev
后就可以看到效果
說明
loader
既可以寫成字符串的形式,也可以寫成對象的形式。如果這個loader
需要給一些配置,那就需要寫成對象的形式,所有的配置放到options
里- 這里一定要注意第一個
loader
的use
屬性,它里面放的是一個個loader
,每個loader
的值既可以是對象形式,又可以是字符串形式
file-loader
其它配置:https://www.webpackjs.com/loaders/file-loader/
index.js
文件內容如下:
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
文件內容如下: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:'陳學輝',
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', //把圖片轉成base64
options:{
limit:50*1024, //小于50k就會轉成base64
outputPath: 'images'
}
}
]
//use:'url-loader?limit=50000&outputPath=images' //loader的另一種寫法,與get請求方式相同
}
]
},
}
執行命令npm run dev
后就可以看到效果
說明
url-loader
的作用是把圖片轉成base64
,它同樣可以給配置參數limit
的作用是小于這個值就會轉base64
- 只用了
url-loader
,并沒有用file-loader
,說明url-loader
里已經包含了file-loader
的功能loader
還可以寫成地址的形式,與get
的請求方式相同
url-loader
其它配置:https://www.webpackjs.com/loaders/url-loader/
資料下載:https://pan.baidu.com/s/1tgNtUZHe3oTmVMi96tHTXQ
下一篇:Webpack 4.X 從入門到精通 - loader(五)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。