webpack學(xué)習(xí)總結(jié)

Webpack學(xué)習(xí)總結(jié)

此文只是自己學(xué)習(xí)webpack的一些總結(jié),方便自己查閱,閱讀不變,非常抱歉!!

下載安裝:

Win10

打開命令行工具創(chuàng)建文件夾:mkdir webpack-test(文件名不能叫webpack,不然會(huì)報(bào)錯(cuò)無法下載webpack)

進(jìn)入文件夾:cd webpack-test

初始化init:npm init;(生成一個(gè)package.json文件)

下載安裝webpack:npm install webpack --save-dev;(依賴注入)

嘗試使用:

在webpack-test目錄下新建一個(gè)hello.js文件,隨便輸入一些代碼,如:


在命令行中輸入webpack hello.js hello.boudle.js:


看到如上結(jié)果說明已經(jīng)打包成功,文件目錄下會(huì)生成一個(gè)hello.boudle.js文件:

Hash:Hash值;

Version:webpack版本號(hào);

Time:打包所花費(fèi)的時(shí)間;

Asset:生成的文件;

Size:文件大小;

Chunks:打包的分塊;

Chunk Names:打包的塊名稱;

下一步,新建一個(gè)world.js文件,然后在hello.js中對(duì)其引用,webpack支持ES6、Commonjs、AMD模塊語法:


輸入webpack hello.js hello.boudle.js:


在hello.boudle.js中,/* 0 */,/* 1 */為模塊編號(hào),webpack將打包前文件的引用替換為webpack內(nèi)置的require:


新建一個(gè)style.css文件,在hello.js中對(duì)其引用,然后再次運(yùn)行打包命令:


發(fā)現(xiàn)css文件打包失敗,提示你需要一個(gè)loader來處理這個(gè)(css)文件類型;

使用npm install css-loader style-loader --save-dev 安裝處理css文件的loader,然后運(yùn)行

webpack hello.js hello.boudle.js:


它還是說你需要一個(gè)loader來處理這個(gè)類型的文件,因?yàn)殡m然你安裝了loader,但是在文件中沒有去制定要使用這個(gè)loader來處理這種類型的文件:


css-loader!就是說這個(gè)文件需要經(jīng)過css-loader的處理,然后再次運(yùn)行打包:


這樣就完成了css文件的打包;

新建一個(gè)hello.html文件,引入打包后的文件:


修改hello.js,執(zhí)行hello函數(shù):


執(zhí)行打包,瀏覽器中打開html文件:


在css文件中加上背景色,然后重新打包運(yùn)行:


你會(huì)發(fā)現(xiàn)并沒有生成紅色背景,這時(shí)你需要使用style-loader對(duì)引入的css文件進(jìn)行處理:


然后打包運(yùn)行,就可以了:


你會(huì)發(fā)現(xiàn)瀏覽器中head標(biāo)簽中多了一個(gè)style標(biāo)簽,這是因?yàn)閏ss-loader是用來處理css文件,style-loader是將css-loader處理后的文件新建一個(gè)style標(biāo)簽插入到html里面;

css-loader也可以在命令行中指定,命令行輸入webpack --help可以看到webpack的一些參數(shù),刪除require時(shí)指定的loader ,打包時(shí)將命令改為:webpack hello.js hello.boudle.js --module-bind “css=style-loader!css-loader”,發(fā)現(xiàn)也可以成功,并沒有報(bào)錯(cuò),注意windows下只能使用雙引號(hào),不然會(huì)報(bào)錯(cuò),webpack是從右往左解析,所以要先使用css-loader處理然后再交給style-loader;


加上--watch參數(shù)可以使每次文件改變的時(shí)候自動(dòng)執(zhí)行打包;

--progress可以看到打包過程;

--display-modules可以看到打包模塊,會(huì)列出每個(gè)文件通過哪個(gè)loader處理;

--display-reasons為告訴你為什么要打包這個(gè)模塊;

配置webpack

新建一個(gè)webpack-test2文件,init初始化,npm install webpack --save-dev依賴安裝webpack,新建一個(gè)src文件,新建一個(gè)dist文件,根目錄下創(chuàng)建一個(gè)html文件,引入boudle.js(打包后的文件名):


src目錄下創(chuàng)建一個(gè)script文件夾一個(gè)style文件夾用于放置js,css文件,根目錄下創(chuàng)建一個(gè)webpack.config.js(官網(wǎng)上有對(duì)config的詳細(xì)說明)文件:


entry:打包入口,從哪個(gè)文件開始,假設(shè)為上述文件;

output:打包后的文件;

filename:打包后的文件名(加上路徑);

output中還有一個(gè)path和一個(gè)publicPath屬性:

path代表路徑,publicPath為要替換的路徑,如上線網(wǎng)址:


webpack會(huì)將path替換為publicPath:


script文件夾中新建一個(gè)main.js,寫一個(gè)空函數(shù),然后命令行輸入webpack打包:


這樣就打包成功了;

如果將webpack.config.js文件名修改webpack.dev.config.js(或其他),可使用命令webpack --config webpack.dev.config.js;

也可以在package.json文件中的scripts下進(jìn)行配置:


然后命令行使用npm run webpack:


entry

entry接受字符串(單個(gè)文件),數(shù)組和對(duì)象三種方式;

在script目錄下新建一個(gè)a.js,寫一個(gè)a的空函數(shù),然后修改config.js中的entry:


運(yùn)行npm run webpack:


打包成功;

將entry改為對(duì)象方式:


運(yùn)行npm run webpack:


提示多個(gè)資源打包成了相同的文件名,然后前面的被覆蓋,這個(gè)時(shí)候要使用output中的占位符,[name]指entry對(duì)象中的key,[hash]打包的Hash值,[chunkhash]每一個(gè)chunk的hash值;

修改config文件:


改為chunkhash,運(yùn)行:


和上面不同的是兩個(gè)文件hash值不同,chunkhash可以認(rèn)為是版本號(hào),只有當(dāng)文件有改變的時(shí)候hash值才會(huì)改變,下面改變a.js文件,再運(yùn)行打包:


可以發(fā)現(xiàn)a.js打包后的文件hash值變化了;

index.html中引入的文件是boudle.js,但是我們打包后的文件名可能是不確定的,所以我們需要引入webpack的插件:html-webpack-plugin,首先還是依賴注入:npm install html-webpack-plugin --save-dev,然后引入html-webpack-plugin,在module-exports中配置plugins:


之后運(yùn)行npm run webpack:


可以看到已經(jīng)生成了一個(gè)html文件,并且引用了生成的文件路徑:


也可以對(duì)plugin進(jìn)行配置,參數(shù)為一個(gè)對(duì)象:


filename:生成后的文件名;

template:模板;

Inject:需要將標(biāo)簽放在html哪個(gè)位置,如head、body;

title:html中的title內(nèi)容;

minify:壓縮文件(removeComments刪除注釋,collapseWhitespace刪除空格);


可以在html中通過ejs模板引擎在htmlWebpackPlugin對(duì)象中獲取config.js中的配置:

Html中:


config.js中:


生成的html文件:


htmlWebpackPlugin有一個(gè)files和一個(gè)options屬性,可以在ejs模板中將其遍歷出來查看所有屬性;

多頁面打包

plugins參數(shù)為一個(gè)數(shù)組,所以可以接收多個(gè)參數(shù),如果需要生成多個(gè)html,只需要重新調(diào)用new htmlWebpackPlugin();

新建一個(gè)b.js c.js,在entry中配置如下


在plugins中:


chunks為要引入的打包后的文件路徑,參數(shù)為一個(gè)數(shù)組,excludeChunks參數(shù)接收一個(gè)數(shù)組,意思為排除數(shù)組中的文件之外其他全部引入;然后npm run webpack:


然后可以看到不同的文件通過設(shè)置chunks達(dá)到了引用不同文件的效果;

通過指定chunks的方式引用的文件都是通過src引入,如果希望將一些初始化的腳本通過inline的方式插入到頁面,從而減少http請(qǐng)求數(shù),可以通過plugin的compilation.assets實(shí)現(xiàn)將script腳本通過inline的方式插入到html:


這樣main.js就插入到了html中,而a、b、c.js分別通過src引用到文件中,這里要注意,將inject參數(shù)改為false,并且main作為通用模板,所有文件中chunks里面都必須包含main,不然會(huì)報(bào)錯(cuò);

Loader的使用

修改目錄文件:


Src根目錄下有一個(gè)app.js:


src下一個(gè)conponents文件夾,下面一個(gè)layer文件夾,里面一個(gè)layer.html,一個(gè)layer.less,一個(gè)layer.js,配置一次如下:


修改config.js:


Loader的使用有三種方式,第一種是require(‘css-loader!./a.js’),通過require的方式直接在引入文件時(shí)指定loader,第二種是使用cli,就是在npm中 “style=style-loader!css-loader”,前面也有提到過,現(xiàn)在主要在config.js配置文件中使用loader;

在配置文件的配置中新增一個(gè)module項(xiàng),此項(xiàng)表示使用’babel’的loader來處理已.js結(jié)尾的文件,babel是將es6語法解析為瀏覽器可以讀取的js語法(如果報(bào)錯(cuò),請(qǐng)參考后面的配置方式):


首先要在命令行中安裝babel,npm install babel-loader babel-core babel-preset-env webpack --save-dev,配置:


注釋掉html引用,不然會(huì)報(bào)錯(cuò),因?yàn)闆]有指定處理html文件的loader:


然后運(yùn)行npm run webpack,就可以看到打包成功了;

注意你的node和npm版本必須要高于某個(gè)版本,具體哪個(gè)版本不知道,安裝最新的就可以了,更新node可以在官網(wǎng)下載最新版本,然后安裝路徑和之前的路徑保持一致就可以了,node中帶有npm,所有安裝最新的node后,npm也會(huì)是最新版本;


可以看到打包成功了,打開頁面也會(huì)有console的layer函數(shù);

雖然打包的文件很少,但是打包花費(fèi)的時(shí)間還是很長,因?yàn)樗鼤?huì)把node_modules文件一起處理,可以在rules中指定include(包含范圍)和exclude(排除)使打包速度加快,再運(yùn)行一次打包,可以看到時(shí)間從之前的4s多變成了0.6s:


這里exclude要用正則,不然不能正確匹配,include要加上__dirname,這里只處理src下面的文件;


exclude可以的參數(shù)可以是字符串也可以是一個(gè)數(shù)組接收多個(gè)參數(shù),參數(shù)可以是正則、字符串或者是一個(gè)函數(shù),這個(gè)路徑必須是絕對(duì)路徑,這個(gè)時(shí)候需要引用node中的path:


可以達(dá)到一樣的效果;

經(jīng)過嘗試,include使用之前的方式會(huì)快很多,所以這里include還是使用之前的方式匹配;

CSS的處理

安裝css-loader和style-loader:npm install css-loader style-loader --save-dev

根目錄下新建一個(gè)css文件夾用于放置css文件,新建一個(gè)common.css文件,用于公共部分css;


在app.js中引用common.css;


配置css-loader:


注意這里要指定2個(gè)loader,一個(gè)style-loader和一個(gè)css-loader,并且style-loader在前,不然會(huì)報(bào)錯(cuò),無法正常解析;

在一些css屬性需要瀏覽器兼容的時(shí)候,可以借助postcss-loader自動(dòng)為這些需要兼容的屬性加上前綴,比如我們?cè)赾ss文件中加上一個(gè)flex屬性,安裝postcss-loader并配置:

npm install postcss-loader --save-dev

npm install autoprefixer --save-dev(這個(gè)是postcss的插件,用于添加前綴);


browsers為要兼容的瀏覽器版本,’last 5 versions’為最近的5個(gè)版本;

如果一個(gè)文件是通過@import的方式引入,這種方式就不會(huì)生成前綴,新建一個(gè)flex.css,并設(shè)置一個(gè)flex屬性,然后從common.css 中@import flex.css:


可以看到這是并沒有被正確的添加前綴:

新建一個(gè)postcss.config.js:


webpack.config.js配置如下:


這是通過@import引入的文件也會(huì)被正確的添加上前綴了;

less-loader

首先還是安裝less-loader:npm install less-loader --save-dev

如果沒有安裝less,還要安裝less:npm install less --save-dev

layer.js中引入layer.less,config.js中配置如下:


webpack2和1配置有點(diǎn)不一樣,1.x可以直接使用

{

test:/\.less$/,

loader:’style-loader!css-loader!postcss-loader!less-loader’

}

注意兩種配置的順序都不能變,相當(dāng)于從下往上解析,先處理less,然后postcss添加前綴,然后處理css,最后style標(biāo)簽插入,順序不能變;

在使用@import時(shí),上面箭頭處可以省略css-loader中的importLoaders屬性,less-loader會(huì)自動(dòng)處理,不需要添加處理css時(shí)的importLoaders屬性;


打包成功后再瀏覽器中可以看到多了一個(gè)style標(biāo)簽,里面就是less文件解析出來的內(nèi)容;


@import less文件時(shí),不加importLoaders,也會(huì)正確的加上前綴;

sass同理,test屬性值為/\.scss$/,因?yàn)閟ass是scss文件,其他配置和less相同;

處理模板文件

安裝loader:npm install html-loader --save-dev

修改文件:

Index.html中添加一個(gè)div,id為app:


layer.js:


app.js:


layer.html:


config.js:


然后運(yùn)行npm run webpack,頁面可以正常顯示了;

使用模板引擎

ejs為例,修改layer.html為layer.ejs,修改代碼:


安裝ejs-loader:npm install ejs-loader --save-dev

config.js,這里不一定要叫ejs,也可以取見名知意的tpl代表template,因?yàn)榭梢允瞧渌0逡妫?/p>


app.js中:


在tpl中傳入需要的參數(shù),運(yùn)行打包命令,刷新頁面,可以看到頁面被正確的解析了;

圖片的處理

在src目錄下新建一個(gè)assets文件夾,放入一張圖片,在layer.less中的div下使用相對(duì)路徑設(shè)置背景圖片,安裝file-loader,配置config.js:


運(yùn)行npm run webpack:


可以看到圖片已經(jīng)被打包了;

在index.html中添加一張圖片,打包,可以看到圖片也可以被正確的解析:


然后再.ejs文件中同樣添加一張圖片,打包,刷新頁面;

可以看到圖片沒有被正確的顯示,并且控制臺(tái)報(bào)錯(cuò)沒有找到文件,可以看到css和html中的圖片路徑是經(jīng)過webpack處理替換掉了,但是模板中的圖片路徑?jīng)]有被正確的替換導(dǎo)致找不到文件;

這是可以使用傳參的方式,${}為es6的模板字符串傳參方式,可以在{}中寫簡(jiǎn)單的邏輯運(yùn)算:


重新打包,刷新頁面,可以看到圖片可以正常顯示,并且路徑也被替換;

file-loader中也有一些參數(shù)可以配置,比如:


使用以上配置,圖片會(huì)被保存在dist文件夾下新建的一個(gè)assets文件目錄下,[name]為文件名,[hash:5]表示hash值得前5位,[ext]表示文件的后綴名:


url-loader

url-loader有一個(gè)limit配置項(xiàng),表示當(dāng)你的文件或圖片大于指定大小的時(shí)候,它會(huì)交給file-loader去處理,如果文件或圖片小于這個(gè)值,它會(huì)將其轉(zhuǎn)換為base64的格式:

npm安裝url-loader,并配置,先將前面的file-loader修改,并配置limit屬性為300k,因?yàn)槲仪懊鎴D片的大小為290k多,打包并運(yùn)行:


前面為之前打包后文件大小,可以看到打包后文件明顯變大了很多,是因?yàn)槲募愋桶l(fā)生了改變,圖片也被打包到了html ejs文件中,頁面上可以看到鼠標(biāo)移入圖片路徑時(shí)會(huì)顯示一段base64編碼,但是頁面效果沒有任何變化;

圖片壓縮

安裝image-webpack-loader,配置:


運(yùn)行打包:


可以看到文件明顯變小了,我們換回file-loader:


可以看到圖片從之前的296k被壓縮到只有103k;

image-webpack-loader對(duì)每一種圖片格式都有具體的參數(shù)進(jìn)行優(yōu)化,具體可以參考官網(wǎng)。

最后附一張package.json和config.js圖:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容