WebPack學(xué)習(xí)

Webpack 是當(dāng)下最熱門(mén)的前端資源模塊化管理和打包工具充活。它可以將許多松散的模塊按照依賴和規(guī)則打包成符合生產(chǎn)環(huán)境部署的前端資源。還可以將按需加載的模塊進(jìn)行代碼分隔蜡娶,等到實(shí)際需要的時(shí)候再異步加載混卵。通過(guò) loader
的轉(zhuǎn)換,任何形式的資源都可以視作模塊窖张,比如 CommonJs 模塊幕随、 AMD 模塊、 ES6 模塊宿接、CSS赘淮、圖片辕录、 JSON、Coffeescript梢卸、 LESS 等走诞。

安裝

首先要安裝 Node.js, Node.js 自帶了軟件包管理器 npm蛤高,Webpack 需要 Node.js v0.6 以上支持蚣旱,建議使用最新版 Node.js。

用 npm 安裝 Webpack:

$ npm install webpack -g
此時(shí) Webpack 已經(jīng)安裝到了全局環(huán)境下戴陡,可以通過(guò)命令行 webpack -h 試試塞绿。

通常我們會(huì)將 Webpack 安裝到項(xiàng)目的依賴中,這樣就可以使用項(xiàng)目本地版本的 Webpack恤批。

進(jìn)入項(xiàng)目目錄

確定已經(jīng)有 package.json异吻,沒(méi)有就通過(guò) npm init 創(chuàng)建

安裝 webpack 依賴

$ npm install webpack --save-dev
Webpack 目前有兩個(gè)主版本,一個(gè)是在 master 主干的穩(wěn)定版开皿,一個(gè)是在 webpack-2 分支的測(cè)試版涧黄,測(cè)試版擁有一些實(shí)驗(yàn)性功能并且和穩(wěn)定版不兼容,在正式項(xiàng)目中應(yīng)該使用穩(wěn)定版赋荆。

查看 webpack 版本信息

$ npm info webpack

安裝指定版本的 webpack

$ npm install webpack@1.12.x --save-dev
如果需要使用 Webpack 開(kāi)發(fā)工具笋妥,要單獨(dú)安裝:

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

使用

首先創(chuàng)建一個(gè)靜態(tài)頁(yè)面 index.html 和一個(gè) JS 入口文件 entry.js:


<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="bundle.js"></script>
</body>
</html>
// entry.js
document.write('It works.')
然后編譯 entry.js 并打包到 bundle.js:

$ webpack entry.js bundle.js
打包過(guò)程會(huì)顯示日志:

Hash: e964f90ec65eb2c29bb9
Version: webpack 1.12.2
Time: 54ms
Asset Size Chunks Chunk Names
bundle.js 1.42 kB 0 [emitted] main
[0] ./entry.js 27 bytes {0} [built]
用瀏覽器打開(kāi) index.html 將會(huì)看到 It works. 。

接下來(lái)添加一個(gè)模塊 module.js 并修改入口 entry.js:

// module.js
module.exports = 'It works from module.js.'
// entry.js
document.write('It works.')
document.write(require('./module.js')) // 添加模塊
重新打包 webpack entry.js bundle.js 后刷新頁(yè)面看到變化 It works.It works from module.js.

Hash: 279c7601d5d08396e751
Version: webpack 1.12.2
Time: 63ms
Asset Size Chunks Chunk Names
bundle.js 1.57 kB 0 [emitted] main
[0] ./entry.js 66 bytes {0} [built]
[1] ./module.js 43 bytes {0} [built]
Webpack 會(huì)分析入口文件窄潭,解析包含依賴關(guān)系的各個(gè)文件春宣。這些文件(模塊)都打包到 bundle.js 。Webpack 會(huì)給每個(gè)模塊分配一個(gè)唯一的 id 并通過(guò)這個(gè) id 索引和訪問(wèn)模塊嫉你。在頁(yè)面啟動(dòng)時(shí)月帝,會(huì)先執(zhí)行 entry.js 中的代碼,其它模塊會(huì)在運(yùn)行 require 的時(shí)候再執(zhí)行幽污。

Loader

Webpack 本身只能處理 JavaScript 模塊嚷辅,如果要處理其他類(lèi)型的文件,就需要使用 loader 進(jìn)行轉(zhuǎn)換距误。

Loader 可以理解為是模塊和資源的轉(zhuǎn)換器簸搞,它本身是一個(gè)函數(shù),接受源文件作為參數(shù)准潭,返回轉(zhuǎn)換的結(jié)果趁俊。這樣,我們就可以通過(guò) require 來(lái)加載任何類(lèi)型的模塊或文件刑然,比如 CoffeeScript寺擂、 JSX、 LESS 或圖片。

先來(lái)看看 loader 有哪些特性怔软?

Loader 可以通過(guò)管道方式鏈?zhǔn)秸{(diào)用垦细,每個(gè) loader 可以把資源轉(zhuǎn)換成任意格式并傳遞給下一個(gè) loader ,但是最后一個(gè) loader 必須返回 JavaScript挡逼。
Loader 可以同步或異步執(zhí)行蝠检。
Loader 運(yùn)行在 node.js 環(huán)境中,所以可以做任何可能的事情挚瘟。
Loader 可以接受參數(shù),以此來(lái)傳遞配置項(xiàng)給 loader饲梭。
Loader 可以通過(guò)文件擴(kuò)展名(或正則表達(dá)式)綁定給不同類(lèi)型的文件乘盖。
Loader 可以通過(guò) npm 發(fā)布和安裝。
除了通過(guò) package.json 的 main 指定憔涉,通常的模塊也可以導(dǎo)出一個(gè) loader 來(lái)使用订框。
Loader 可以訪問(wèn)配置。
插件可以讓 loader 擁有更多特性兜叨。
Loader 可以分發(fā)出附加的任意文件穿扳。
Loader 本身也是運(yùn)行在 node.js 環(huán)境中的 JavaScript 模塊,它通常會(huì)返回一個(gè)函數(shù)国旷。大多數(shù)情況下矛物,我們通過(guò) npm 來(lái)管理 loader,但是你也可以在項(xiàng)目中自己寫(xiě) loader 模塊跪但。

按照慣例履羞,而非必須,loader 一般以 xxx-loader 的方式命名屡久,xxx 代表了這個(gè) loader 要做的轉(zhuǎn)換功能忆首,比如 json-loader。

在引用 loader 的時(shí)候可以使用全名 json-loader被环,或者使用短名 json糙及。這個(gè)命名規(guī)則和搜索優(yōu)先級(jí)順序在 webpack 的 resolveLoader.moduleTemplates api 中定義。

Default: ["-webpack-loader", "-web-loader", "-loader", ""]
Loader 可以在 require() 引用模塊的時(shí)候添加筛欢,也可以在 webpack 全局配置中進(jìn)行綁定浸锨,還可以通過(guò)命令行的方式使用。

接上一節(jié)的例子悴能,我們要在頁(yè)面中引入一個(gè) CSS 文件 style.css揣钦,首頁(yè)將 style.css 也看成是一個(gè)模塊,然后用 css-loader 來(lái)讀取它漠酿,再用 style-loader 把它插入到頁(yè)面中冯凹。

/* style.css */
body { background: yellow; }
修改 entry.js:

require("!style-loader!css-loader!./style.css") // 載入 style.css
document.write('It works.')
document.write(require('./module.js'))
安裝 loader:

npm install css-loader style-loader
重新編譯打包,刷新頁(yè)面,就可以看到黃色的頁(yè)面背景了宇姚。

如果每次 require CSS 文件的時(shí)候都要寫(xiě) loader 前綴匈庭,是一件很繁瑣的事情。我們可以根據(jù)模塊類(lèi)型(擴(kuò)展名)來(lái)自動(dòng)綁定需要的 loader浑劳。

將 entry.js 中的 require("!style!css!./style.css") 修改為 require("./style.css") 阱持,然后執(zhí)行:

$ webpack entry.js bundle.js --module-bind 'css=style-loader!css-loader'

有些環(huán)境下可能需要使用雙引號(hào)

$ webpack entry.js bundle.js --module-bind "css=style-loader!css-loader"
顯然,這兩種使用 loader 的方式魔熏,效果是一樣的衷咽。

配置文件

Webpack 在執(zhí)行的時(shí)候,除了在命令行傳入?yún)?shù)蒜绽,還可以通過(guò)指定的配置文件來(lái)執(zhí)行镶骗。默認(rèn)情況下,會(huì)搜索當(dāng)前目錄的 webpack.config.js 文件躲雅,這個(gè)文件是一個(gè) node.js 模塊鼎姊,返回一個(gè) json 格式的配置信息對(duì)象,或者通過(guò) --config 選項(xiàng)來(lái)指定配置文件相赁。

繼續(xù)我們的案例相寇,在根目錄創(chuàng)建 package.json 來(lái)添加 webpack 需要的依賴:

{
"name": "webpack-example",
"version": "1.0.0",
"description": "A simple webpack example.",
"main": "bundle.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"keywords": [
"webpack"
],
"author": "zhaoda",
"license": "MIT",
"devDependencies": {
"css-loader": "^0.21.0",
"style-loader": "^0.13.0",
"webpack": "^1.12.2"
}
}

如果沒(méi)有寫(xiě)入權(quán)限,請(qǐng)嘗試如下代碼更改權(quán)限

chflags -R nouchg .
sudo chmod 775 package.json
別忘了運(yùn)行 npm install钮科。

然后創(chuàng)建一個(gè)配置文件 webpack.config.js:

var webpack = require('webpack')

module.exports = {
entry: './entry.js',
output: {
path: __dirname,
filename: 'bundle.js'
},
module: {
loaders: [
{test: /.css$/, loader: 'style-loader!css-loader'}
]
}
}
同時(shí)簡(jiǎn)化 entry.js 中的 style.css 加載方式:

require('./style.css')
最后運(yùn)行 webpack唤衫,可以看到 webpack 通過(guò)配置文件執(zhí)行的結(jié)果和上一章節(jié)通過(guò)命令行 webpack entry.js bundle.js --module-bind 'css=style-loader!css-loader' 執(zhí)行的結(jié)果是一樣的。
開(kāi)發(fā)環(huán)境

當(dāng)項(xiàng)目逐漸變大跺嗽,webpack 的編譯時(shí)間會(huì)變長(zhǎng)战授,可以通過(guò)參數(shù)讓編譯的輸出內(nèi)容帶有進(jìn)度和顏色。

$ webpack --progress --colors
如果不想每次修改模塊后都重新編譯桨嫁,那么可以啟動(dòng)監(jiān)聽(tīng)模式植兰。開(kāi)啟監(jiān)聽(tīng)模式后,沒(méi)有變化的模塊會(huì)在編譯后緩存到內(nèi)存中璃吧,而不會(huì)每次都被重新編譯楣导,所以監(jiān)聽(tīng)模式的整體速度是很快的。

$ webpack --progress --colors --watch
當(dāng)然畜挨,使用 webpack-dev-server 開(kāi)發(fā)服務(wù)是一個(gè)更好的選擇筒繁。它將在 localhost:8080 啟動(dòng)一個(gè) express 靜態(tài)資源 web 服務(wù)器,并且會(huì)以監(jiān)聽(tīng)模式自動(dòng)運(yùn)行 webpack巴元,在瀏覽器打開(kāi) http://localhost:8080/http://localhost:8080/webpack-dev-server/ 可以瀏覽項(xiàng)目中的頁(yè)面和編譯后的資源輸出毡咏,并且通過(guò)一個(gè) socket.io 服務(wù)實(shí)時(shí)監(jiān)聽(tīng)它們的變化并自動(dòng)刷新頁(yè)面。

安裝

$ npm install webpack-dev-server -g

運(yùn)行

$ webpack-dev-server --progress --colors

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逮刨,一起剝皮案震驚了整個(gè)濱河市呕缭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖恢总,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迎罗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡片仿,警方通過(guò)查閱死者的電腦和手機(jī)纹安,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)砂豌,“玉大人厢岂,你說(shuō)我怎么就攤上這事⊙艟啵” “怎么了咪笑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娄涩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)映跟,這世上最難降的妖魔是什么蓄拣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮努隙,結(jié)果婚禮上球恤,老公的妹妹穿的比我還像新娘。我一直安慰自己荸镊,他們只是感情好咽斧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著躬存,像睡著了一般张惹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岭洲,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天宛逗,我揣著相機(jī)與錄音,去河邊找鬼盾剩。 笑死雷激,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的告私。 我是一名探鬼主播屎暇,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驻粟!你這毒婦竟也來(lái)了根悼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎番挺,沒(méi)想到半個(gè)月后唠帝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玄柏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年襟衰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粪摘。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瀑晒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徘意,到底是詐尸還是另有隱情苔悦,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布椎咧,位于F島的核電站玖详,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏勤讽。R本人自食惡果不足惜蟋座,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脚牍。 院中可真熱鬧向臀,春花似錦、人聲如沸诸狭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驯遇。三九已至芹彬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叉庐,已是汗流浹背雀监。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眨唬,地道東北人会前。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匾竿,于是被迫代替她去往敵國(guó)和親瓦宜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • Webpack學(xué)習(xí)總結(jié) 此文只是自己學(xué)習(xí)webpack的一些總結(jié)岭妖,方便自己查閱临庇,閱讀不變反璃,非常抱歉!假夺! 下載安裝:...
    Lxs_597閱讀 948評(píng)論 0 0
  • 無(wú)意中看到zhangwnag大佬分享的webpack教程感覺(jué)受益匪淺淮蜈,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,164評(píng)論 7 35
  • Webpack 是一個(gè)前端資源加載/打包工具已卷。它將根據(jù)模塊的依賴關(guān)系進(jìn)行靜態(tài)分析梧田,然后將這些模塊按照指定的規(guī)則生成...
    EarthChen閱讀 395評(píng)論 0 1
  • 個(gè)女人,有幸福的家庭侧蘸,有自己想要做的事情裁眯,然后可以為之拼搏,我覺(jué)得這樣就是完整的 幼兒時(shí)期到步入社會(huì)后讳癌,這是一個(gè)過(guò)...
    我叫呂瑞閱讀 854評(píng)論 0 1
  • 放縱娛樂(lè)像猴子训堆,只有怪獸出現(xiàn)時(shí)供璧。他們才會(huì)被嚇到樹(shù)上,而這個(gè)怪獸就是截止日期计寇。 規(guī)定一天有效的八小時(shí)學(xué)習(xí)時(shí)...
    忽爾今至閱讀 68評(píng)論 0 0