Webpack 4.X 從入門(mén)到精通 - entry與output(一)

回顧歷史

Web應(yīng)用日益復(fù)雜嗜憔,前端開(kāi)發(fā)也發(fā)生了翻天覆地的變化變得盤(pán)根錯(cuò)節(jié)杜跷,到今天已經(jīng)非常復(fù)雜和龐大了!用html歪架、css股冗、javascript老老實(shí)實(shí)的寫(xiě)個(gè)頁(yè)面的時(shí)代早已過(guò)去。而現(xiàn)在要完成工作需要借助很多額外的東西和蚪,比如工程化止状、自動(dòng)化等等烹棉。這樣才顯得有逼格,才像一個(gè)真正的程序猿怯疤。如果說(shuō)還停留在切個(gè)圖浆洗,下載個(gè)js效果懟上去的階段,顯然你會(huì)脫節(jié)的集峦。由此也帶動(dòng)了很多前端工具的發(fā)展伏社,以GulpGrunt塔淤、webpack等為代表的構(gòu)建工具猶如雨后春筍般的生長(zhǎng)摘昌,而webpack更為流行,使用更為廣泛高蜂,可以說(shuō)它現(xiàn)在已經(jīng)是前端開(kāi)發(fā)的的標(biāo)配了聪黎。所以這次我會(huì)用一個(gè)系列的文章詳細(xì)去介紹webpack,由淺入深解析webpack妨马,再通過(guò)實(shí)戰(zhàn)例子配合挺举,掌握以后足以解決你工作中的問(wèn)題。同時(shí)這套系列文章是針對(duì)最新的4.X的版本烘跺。

Webpack是什么

webpack是一款工具湘纵?什么工具?有人管他叫打包工具滤淳,這樣太low了梧喷。可以看看webpack官網(wǎng)脖咐,頁(yè)面底部的一個(gè)個(gè)小頭像代表的是給webpack贊助過(guò)的人铺敌,鼠標(biāo)放上去還可以看到他贊助了多少錢(qián)。就憑這么多人的贊助屁擅,也不能叫這么low逼的名偿凭,聽(tīng)得好像是個(gè)壓縮軟件。得起個(gè)高大上的名派歌,叫構(gòu)建工具(當(dāng)然打包的功能是它的一大特色)

前端里的什么工程化呀自動(dòng)化呀弯囊,這些東西有個(gè)特點(diǎn),就是源代碼無(wú)法在瀏覽器里直接運(yùn)行胶果,必需通過(guò)編譯才行匾嘱。那構(gòu)建工具其實(shí)就能做這些事情。如:

  • 代碼編譯早抠,把ES6轉(zhuǎn)成ES5
  • 模塊合并霎烙,把多個(gè)文件合并成一個(gè)文件,減少http請(qǐng)求
  • 代碼壓縮優(yōu)化,抽取公共代碼悬垃,減少代碼量

這些都是構(gòu)建工具要做的事情游昼,但是這些東西都是用代碼去實(shí)現(xiàn),讓他們通過(guò)代碼自動(dòng)完成這些事情盗忱,解放我們的生產(chǎn)力酱床。webpack最大的一個(gè)特色就是打包,官網(wǎng)的那張大圖所體現(xiàn)的就是打包的功能趟佃,并能解決模塊間相互依賴的問(wèn)題,它能把亂成一鍋粥的文件打包成清晰的文件昧捷,快刀斬亂麻闲昭!其次webapck是以模塊為基石,對(duì)于模塊化的支持體現(xiàn)的淋漓盡致靡挥,在webpack中所有的內(nèi)容都是模塊序矩,一個(gè)圖片、一個(gè)css文件跋破、一個(gè)js文件都是一個(gè)模塊簸淀。

安裝

  1. npm init -y
  2. npm install --save-dev webpack
  3. npm install --save-dev webpack-cli

注意:
1、安裝前確認(rèn)一件事件毒返,nodejs的版本在5.0以上
2租幕、npm init -y為生成package.json文件
3、兩條命令可以簡(jiǎn)寫(xiě)為:npm i webpack webpack-cli -D
4拧簸、建議安裝到項(xiàng)目中而并非全局環(huán)境下劲绪。安裝到全局環(huán)境下可能導(dǎo)致有的插件無(wú)法使用以及避免不同的項(xiàng)目依賴的版本不同而出現(xiàn)問(wèn)題
5、4.x的版本把cli分離出來(lái)了盆赤,所以必需安裝webpack-cli
6贾富、驗(yàn)證是否安裝成功:webpack -v

webpack圖1-1.png

webpack圖1-2.png

配置文件

配置文件猶如webpack的大腦,webpack的工作都是通過(guò)配置文件完成的牺六。編譯哪個(gè)文件颤枪、怎么編譯、編譯成什么樣淑际、輸出為什么等等畏纲,所有的操作都是按配置文件里的內(nèi)容來(lái)完成的,所以配置文件一個(gè)重量級(jí)的嘉賓庸追,webapck想要運(yùn)行的話配置文件是必不可少的東西霍骄。

配置文件有6個(gè)核心的東西組成,就像JavaScriptECMAScript淡溯、DOM读整、BOM三部分組成一樣。

  1. entry:入口文件(你要打包咱娶,就告訴我打包哪些)
  2. output:出口文件(我打包完了米间,給你放到哪里)
  3. module:模塊(放lorder强品,編譯瀏覽器不認(rèn)識(shí)的東西)
  4. plugins:插件(輔助開(kāi)發(fā),提高開(kāi)發(fā)效率)
  5. devServer:服務(wù)器(webpack提供的本地服務(wù)器)
  6. mode:模式屈糊,分為開(kāi)發(fā)模式的榛、生產(chǎn)模式。此為4.X里新增的

注意:
1逻锐、配置文件的名字建議叫webpack.config.js夫晌,需要放在項(xiàng)目文件夾的根目錄下。當(dāng)然你可以換成其它的名字昧诱,但是運(yùn)行的時(shí)候就要增加額外的步驟了
2晓淀、webpack采用CommonJS的規(guī)范,上面的所有參數(shù)都需要放在對(duì)象里盏档,用moudle.exports導(dǎo)出

小試牛刀

在項(xiàng)目文件夾(我的為webpack-demo)的根目錄下創(chuàng)建必要的文件夾及文件凶掰,結(jié)構(gòu)如下:

  • [ ] webpack-demo
    • [ ] node_modules
    • [ ] src
      • main.js
      • show.js
    • [ ] index.html
    • [ ] package.json
    • [ ] webpack.config.js

如下圖


webpack圖1-3.png

show.js代碼如下

//聲明一個(gè)函數(shù),最終做為一個(gè)模塊被導(dǎo)出
const show=content=>{
    const box=document.getElementById("box");
    box.innerHTML=`你好蜈亩!${content}`;
}

export {show};  //ES6導(dǎo)出模塊的語(yǔ)法

main.js代碼如下

import {show} from './show';    //ES6導(dǎo)入模塊的語(yǔ)法懦窘,‘./’為main.js的根目錄src,ES6里導(dǎo)入的模塊為js話不需要加后綴名
show('kaivon');

index.html代碼如下

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="box"></div>
    </body>
</html>

package.json.js代碼如下

const path=require('path'); //nodejs的語(yǔ)法稚配,引入路徑模塊畅涂,為了輸出的時(shí)候找絕對(duì)路徑

module.exports={
    entry:'./src/main.js',  //入口文件為main.js  
    output:{    //輸出
        path:path.resolve(__dirname,'dist'),    //path.resolve為nodejs的固定語(yǔ)法,用于找到當(dāng)前文件的絕對(duì)路徑
        filename:'bundle.js'    //輸出的文件名
    },
};

在終端里執(zhí)行命令webpack后药有,不出意外的話終端里顯示如下就表示成功了

webpack圖1-4.png

同時(shí)看一下文件結(jié)構(gòu)目錄毅戈,多了一個(gè)dist文件夾,以及bundle.js文件愤惰。這兩個(gè)就是webpack打包生成的文件苇经,如下

webpack圖1-5.png

index.html文件里引入bundle.js文件后,用瀏覽器打開(kāi)index.html宦言,可以看到頁(yè)面里有內(nèi)容了扇单。這就代表我們已經(jīng)使用webpack打包了一個(gè)文件,它的基本用法已經(jīng)跑了奠旺。

<body>
    <div id="box"></div>
    <script src="dist/bundle.js"></script>
</body>

語(yǔ)法及步驟

語(yǔ)法

  1. entry 入口文件
  • 只打包一個(gè)文件(單入口)蜘澜,寫(xiě)個(gè)字符串
  • 把多個(gè)文件打包成一個(gè)文件,寫(xiě)個(gè)數(shù)組
  • 把多個(gè)文件分別打包成多個(gè)文件响疚,寫(xiě)成對(duì)象
  • webpack把打包后的文件叫Chunck
  1. output 出口文件
  • filename 輸出文件的名稱
    1鄙信、輸出一個(gè)文件,寫(xiě)個(gè)字符串
    2忿晕、輸出多個(gè)文件装诡,文件名前面加個(gè)標(biāo)識(shí)符(id/name/hash)
  • path 輸出文件的路徑
    1、路徑必需為絕對(duì)路徑
    2、__dirnamenodejs里的一個(gè)模塊鸦采,表示當(dāng)前文件的絕對(duì)路徑
    3宾巍、pathnodejs的系統(tǒng)模塊,直接引入后調(diào)用path.resolve(__dirname,'輸出文件的路徑');

步驟

當(dāng)我們?cè)诮K端里輸入webpack命令的時(shí)候webpack會(huì)按以下的步驟開(kāi)始工作

  1. 先打開(kāi)根目錄下的webpack.config.js
  2. entry(入口)屬性的值
  3. 進(jìn)入到main.js里渔伯,看到它又依賴show.js顶霞,再找到show.js
  4. main.jsshow.js合并成一個(gè)js文件
  5. webpack.config.js里找到output(出口)屬性
  6. 解析output里的pathfilename屬性的值
  7. 把第4步合并成的js文件放到dist文件夾里,并起個(gè)名字叫bundle.js

趁熱打鐵

下面演示多入口锣吼,在src目錄里新建兩個(gè)js文件选浑,1.js2.js,代碼如下:
1.js

console.log('這是第一個(gè)入口文件吐限!');

2.js

console.log('這是第二個(gè)入口文件鲜侥!');

修改webpack.config.js文件

const path=require('path');

//兩個(gè)entry分別一一對(duì)應(yīng)兩個(gè)filename
module.exports={
    //entry:['./src/1.js','./src/2.js'],
    entry:{
        one:'./src/1.js',
        two:'./src/2.js'
    },
    output:{
        //filename:'bundle.js',
        filename:'[name].bundle.js' //可以以name/id/hash放在中括號(hào)里區(qū)分文件名
        path:path.resolve(__dirname,'dist'),
    }
}

分別注釋對(duì)應(yīng)的entryfilename,在終端里執(zhí)行命令:webpack后诸典,查看dist文件夾及運(yùn)行index.html后查看效果
1、當(dāng)entry為數(shù)組的時(shí)候崎苗,webpack會(huì)把數(shù)組里所有文件打包成一個(gè)js文件
2狐粱、當(dāng)entry為對(duì)象的時(shí)候,webpack會(huì)把對(duì)象里的文件分別打包成多個(gè)文件

文章里所說(shuō)到的只是entry與output的常用配置胆数,它的配置不止這些肌蜻,可以參考以下鏈接
entry的所有配置https://webpack.js.org/concepts/entry-points/
output的所有配置https://webpack.js.org/concepts/output/

資料下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市必尼,隨后出現(xiàn)的幾起案子蒋搜,更是在濱河造成了極大的恐慌,老刑警劉巖判莉,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆挽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡券盅,警方通過(guò)查閱死者的電腦和手機(jī)帮哈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锰镀,“玉大人娘侍,你說(shuō)我怎么就攤上這事∮韭” “怎么了憾筏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)花鹅。 經(jīng)常有香客問(wèn)我氧腰,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任容贝,我火速辦了婚禮自脯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斤富。我一直安慰自己膏潮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布满力。 她就那樣靜靜地躺著焕参,像睡著了一般。 火紅的嫁衣襯著肌膚如雪油额。 梳的紋絲不亂的頭發(fā)上叠纷,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音潦嘶,去河邊找鬼涩嚣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掂僵,可吹牛的內(nèi)容都是我干的航厚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锰蓬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼幔睬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芹扭,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麻顶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后舱卡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辅肾,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年灼狰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宛瞄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡交胚,死狀恐怖份汗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝴簇,我是刑警寧澤杯活,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站熬词,受9級(jí)特大地震影響旁钧,放射性物質(zhì)發(fā)生泄漏吸重。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一歪今、第九天 我趴在偏房一處隱蔽的房頂上張望嚎幸。 院中可真熱鬧,春花似錦寄猩、人聲如沸嫉晶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)替废。三九已至,卻和暖如春泊柬,著一層夾襖步出監(jiān)牢的瞬間椎镣,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工兽赁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留状答,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓刀崖,卻偏偏與公主長(zhǎng)得像剪况,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒲跨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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