第十章 使用webpack(進(jìn)階篇)

webpack已經(jīng)更新到了版本4率碾,關(guān)于版本的問題谴供,相信很多小伙伴們?cè)趯W(xué)習(xí)的時(shí)候碰到好多坑框喳,本篇文章是基于webpack2的教程進(jìn)行學(xué)習(xí)的唇兑,但是盡可能的使用webpack4的語(yǔ)法學(xué)習(xí),于是不免出現(xiàn)紕漏纺涤,或者出現(xiàn)混雜译暂,如有問題,請(qǐng)及時(shí)解決撩炊。


10.1前端工程化與webpack

通常外永,前端自動(dòng)化(半自動(dòng)化)工程主要解決以下問題:

  • javaScript CSS代碼的合并與壓縮
  • CSS預(yù)處理:Less、Sass拧咳、Stylus的編譯
  • 生成雪碧圖(CSS Sprite)
  • ES6轉(zhuǎn)ES5
  • 模塊化
    ……
    如果熟悉Gulp伯顶,我們知道經(jīng)過(guò)Gulp合并壓縮后的代碼仍然是你寫的代碼,只是局部變量名被替換骆膝,一些語(yǔ)法做了轉(zhuǎn)換而已祭衩,整體內(nèi)容并沒有發(fā)生變化。而我們要學(xué)習(xí)的webpack阅签,打包后的代碼已經(jīng)不只是你寫的代碼了掐暮,其中夾雜了很多webpack自身的模塊處理代碼。因此愉择,webpack最難的是理解“編譯”這個(gè)概念劫乱。
    在webpack的世界里织中,一張圖片锥涕、一個(gè)css甚至一個(gè)字體衷戈,都成為模塊(Module),彼此存在依賴關(guān)系层坠,webpack就是來(lái)處理模塊間的依賴關(guān)系的殖妇,并把它們進(jìn)行打包。
    webpack的主要適用場(chǎng)景是單頁(yè)面富應(yīng)用(SPA)破花。SPA通常是由一個(gè)html文件和一堆按需加載的.js組成谦趣,它的html結(jié)構(gòu)可能會(huì)非常簡(jiǎn)單。
    在進(jìn)行webpack的學(xué)習(xí)之前座每,我們先來(lái)學(xué)習(xí)兩個(gè)ES6中的語(yǔ)法:export和import前鹅。
    export和import是用來(lái)導(dǎo)入和導(dǎo)出模塊的,一個(gè)模塊就是一個(gè)js文件峭梳,他擁有獨(dú)立的作用域舰绘,里面定義的變量外部是無(wú)法訪問的,因此需要使用export導(dǎo)出葱椭。
    模板導(dǎo)出后捂寿,在需要使用模塊的文件使用import導(dǎo)入。
    export與import海洋其他的用法孵运,這里不做詳細(xì)介紹秦陋。

10.2 webpack基礎(chǔ)配置

10.2.1 安裝webpack、webpack-cli與webpack-dev-server

在安裝webpack前治笨,先確保已經(jīng)安裝了最新版的Node.js和NPM驳概,并且了解NPM的一些基本用法。

  1. 首先旷赖,創(chuàng)建一個(gè)目錄顺又,比如demo,使用NPM初始化配置杠愧。
  npm init 
  1. 執(zhí)行后待榔,會(huì)有一系列選項(xiàng),可按回車鍵快速確認(rèn) 流济,完成后會(huì)在demo目錄生成一個(gè)package.json的文件锐锣。之后在本地局部安裝webpack:
npm install webpack --save-dev
  1. --save-dev會(huì)作為開發(fā)依賴來(lái)安裝webpack。安裝成功后绳瘟,在package.json中會(huì)多一項(xiàng)配置:
"dependencies": {
"webpack": "^4.17.2"

}

4.接著需要安裝webpack-dev-server雕憔,它可以在開發(fā)環(huán)境中提供很多服務(wù),比如啟動(dòng)一個(gè)服務(wù)器糖声、熱更新斤彼、接口代理等分瘦,配置起來(lái)也很簡(jiǎn)單。同樣琉苇,在本地局部安裝:

npm install webpack webpack-dev-server --save-dev

安裝完成后嘲玫,最終的package.json文件內(nèi)容為:

{
  "name": "webpack-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
  "webpack": "^4.17.2",
  "webpack-dev-server": "^3.1.7"
  }
}
10.2.2就是一個(gè)js文件而已

接下來(lái)需要了解webpack的一些核心概念。
歸根到底并扇,webpack就是一個(gè).js文件去团,你的架構(gòu)好或差都體現(xiàn)在這個(gè)配置上,隨著需求的不斷出現(xiàn)穷蛹,工程配置也是逐漸完善土陪。
1.首先,我們?cè)谀夸汥EMO下創(chuàng)建一個(gè)js文件:webpack.config.js肴熏,并初始化它的內(nèi)容:

var config= {
  //這里的module.exports相當(dāng)于export default config.由于目前還沒安裝支持ES6的編譯插件鬼雀,因此不能直接使用ES6的語(yǔ)法。
};
module.exports=config;

2.然后在package.json的scripts里增加一個(gè)快速啟動(dòng)webpack-dev-server服務(wù)的腳本:

{
 //……
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev":"webpack-dev-server --open --config webpack.config.js"
},
 //……

TIPS:由于我們這里安裝的是webpack4蛙吏,所有這里需要安裝webpack-cli源哩,才可以繼續(xù)下一步,但是這里學(xué)習(xí)的是webpack2出刷,所以我們不作為一個(gè)步驟璧疗,安裝webpack4的小伙伴,繼續(xù)在命令行中執(zhí)行:npm install webpack-cli
3.當(dāng)運(yùn)行npm run dev命令時(shí)馁龟,就會(huì)執(zhí)行webpack-dev-server --open --config webpack.config.js命令崩侠。其中,--config是指向webpack-dev-server讀取的配置文件路徑.
--open會(huì)在執(zhí)行命令時(shí)自動(dòng)在瀏覽器打開頁(yè)面坷檩,默認(rèn)地址是127.0.0.1:8080,不過(guò)IP和端口都是可以配置的却音,比如:

{
 //……
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --host 192.168.199.102 --port 8888
             --open --config webpack.config.js"
},
 //……    

webpack配置中組主要的也是必選的兩項(xiàng)是入口(Entry)和出口(Output)。入口的作用是告訴webpack從哪里開始尋找依賴矢炼,并且編譯系瓢,出口則是用來(lái)配置編譯后的文件存儲(chǔ)位置和文件名。
在demo目錄下新建一個(gè)空的main.js作為入口的文件句灌,然后再webpack.config.js中進(jìn)行入口和輸出的配置(webpack4的配置):

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后骗绕,不出意外的話終端里顯示如下就表示成功了


success.jpg

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


bundle.jpg

在index.html文件里引入bundle.js文件后格带,用瀏覽器打開index.html(或者執(zhí)行完webpack后撤缴,執(zhí)行npm run dev刹枉,然后打開IP地址),可以看到頁(yè)面里有內(nèi)容了屈呕。這就代表我們已經(jīng)使用webpack打包了一個(gè)文件微宝,它的基本用法已經(jīng)跑了。
<body>
<div id="box"></div>
<script src="dist/bundle.js"></script>
</body>

這里一定要注意引用的bundle.js一定要在div下面引用凉袱,如果在<head>中引用逾一,會(huì)報(bào)錯(cuò)诸狭!

10.2.3語(yǔ)法及步驟
語(yǔ)法

一.entry入口文件
只打包一個(gè)文件(單入口),寫個(gè)字符串
把多個(gè)文件打包成一個(gè)文件辆憔,寫個(gè)數(shù)組
把多個(gè)文件分別打包成多個(gè)文件钉稍,寫成對(duì)象
webpack把打包后的文件叫Chunck
二.output出口文件
1.filename 輸出文件的名稱
①涤躲、輸出一個(gè)文件,寫個(gè)字符串
②贡未、輸出多個(gè)文件种樱,文件名前面加個(gè)標(biāo)識(shí)符(id/name/hash)
2.path輸出文件的路徑
①、路徑必需為絕對(duì)路徑
②俊卤、__dirnamenodejs里的一個(gè)模塊嫩挤,表示當(dāng)前文件的絕對(duì)路徑
③、path為nodejs的系統(tǒng)模塊消恍,直接引入后調(diào)用path.resolve(__dirname,'輸出文件的路徑');

步驟

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

1.先打開根目錄下的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

10.2.4 Plugin

下面就以這個(gè)html-webpack-plugin插件為例约啊,給大家演示插件的用法。這個(gè)插件的作用是用來(lái)自動(dòng)生成html頁(yè)面佣赖,既可以生成單個(gè)頁(yè)面又可以生成多個(gè)頁(yè)面恰矩,并且在生成前你可以給它一堆的配置,它會(huì)按照你想要的生成方式去生成頁(yè)面憎蛤。
第一步:安裝

 npm i html-webpack-plugin -D

第二步:在webpack.config.js里引入模塊

const HtmlWebpackPlugin=require('html-webpack-plugin');

第三步:在plugins里new一個(gè)

plugins:[
new HtmlWebpackPlugin()

]
此時(shí)webpack.config.js的內(nèi)容如下:

const path=require('path'); //nodejs的語(yǔ)法外傅,引入路徑模塊,為了輸出的時(shí)候找絕對(duì)路徑
const HtmlWebpackPlugin=require('html-webpack-plugin');

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

第四步:在終端里執(zhí)行命令webpack萎胰,如果不出意外的話是下面這樣:


index.jpg

未完待續(xù),明天我們接著來(lái)webpack豆胸!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奥洼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晚胡,更是在濱河造成了極大的恐慌灵奖,老刑警劉巖嚼沿,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瓷患,居然都是意外死亡骡尽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門擅编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攀细,“玉大人,你說(shuō)我怎么就攤上這事爱态√诽埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵锦担,是天一觀的道長(zhǎng)俭识。 經(jīng)常有香客問我,道長(zhǎng)洞渔,這世上最難降的妖魔是什么套媚? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮磁椒,結(jié)果婚禮上堤瘤,老公的妹妹穿的比我還像新娘。我一直安慰自己浆熔,他們只是感情好本辐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蘸拔,像睡著了一般师郑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上调窍,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天宝冕,我揣著相機(jī)與錄音,去河邊找鬼邓萨。 笑死地梨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缔恳。 我是一名探鬼主播宝剖,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歉甚!你這毒婦竟也來(lái)了万细?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纸泄,失蹤者是張志新(化名)和其女友劉穎赖钞,沒想到半個(gè)月后腰素,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雪营,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年弓千,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献起。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洋访,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谴餐,到底是詐尸還是另有隱情姻政,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布总寒,位于F島的核電站扶歪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏摄闸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一妹萨、第九天 我趴在偏房一處隱蔽的房頂上張望年枕。 院中可真熱鬧,春花似錦乎完、人聲如沸熏兄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摩桶。三九已至,卻和暖如春帽揪,著一層夾襖步出監(jiān)牢的瞬間硝清,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工转晰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芦拿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓查邢,卻偏偏與公主長(zhǎng)得像蔗崎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扰藕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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