webpack入門(一)

1.Concepts(概念)

???At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph which maps every module your project needs and generates one or more bundles.

???這段話摘自與官方文檔蔚舀,一言以蔽之就是介紹了什么是webpack。大概意思是說webpack是一個(gè)對js應(yīng)用程序的打包機(jī)滤奈。在用webpack來處理應(yīng)用程序的時(shí)候唯鸭,他的內(nèi)部會(huì)根據(jù)項(xiàng)目的每個(gè)模塊之間的映射構(gòu)建一個(gè)依賴圖并生成一個(gè)或者多個(gè)模塊河狐。官方文檔的首頁也給出了對應(yīng)的依賴圖,圖文并茂,從概念上首先知道我們接下來要學(xué)的東西著淆,如下圖:
what-is-webpack.png

圖中可以看到項(xiàng)目中各個(gè)模塊文件之間的依賴關(guān)系(這種依賴關(guān)系就是模塊間的互相引用),通過webpack的處理拴疤,就會(huì)生成一個(gè)或者多個(gè)小的模塊文件永部,如圖中生成了兩個(gè)js模塊和一個(gè)圖片模塊文件和一個(gè)css模塊。

???從文檔給出的目錄大綱可以看出呐矾,webpack的核心有幾個(gè)大的概念如圖:
QQ截圖20180521140350.png

因此學(xué)習(xí)的時(shí)候應(yīng)該從Entry,Output,Loaders,Plugins,Mode,Browser Compatibility這幾個(gè)方面重點(diǎn)學(xué)苔埋。這也是webpack的核心內(nèi)容。首先從字面意思理解這幾個(gè)概念:
  • Entry:

An entry point indicates which module webpack should use to begin building out its internal dependency graph, webpack will figure out which other modules and libraries that entry point depends on (directly and indirectly).
By default its value is ./src/index.js, but you can specify a different (or multiple entry points) by configuring the entry property in the webpack configuration
這段話也摘自官方蜒犯,大概意思是說webpack在構(gòu)建依賴生成包模塊是有章可循的组橄,最終生成的是一個(gè)個(gè)小模塊,有輸出就一定有輸入罚随,然后根據(jù)這個(gè)入口文件來直接或間接的打包相關(guān)依賴玉工。因此entry是用來配置入口文件的。有一個(gè)默認(rèn)值為'./src/index.js',但是可以根據(jù)webpack的配置屬性來修改這個(gè)默認(rèn)值淘菩,也可以配置多個(gè)入口文件遵班。

  • Output:

The output property tells webpack where to emit the bundles it creates and how to name these files,大概意思就是告訴webpack,將依賴圖最終生成的模塊如何命名潮改,并且要放在什么地方(在那個(gè)目錄下狭郑?)

  • Loaders:

Out of the box, webpack only understands JavaScript files. Loaders allow webpack to process other types of files and converting them into valid modules that can be consumed by your application and added to the dependency graph.大概意思就是webpack本身只能處理js文件,但是webpack內(nèi)部生成的依賴關(guān)系可不只有js文件汇在,還有其他的文件如css,image,scss,less等等文件翰萨,但是通過對應(yīng)的loaders就可以讓webpack來處理對應(yīng)的文件類型,這樣有了loaders糕殉,無論什么樣的文件缨历,只要有對應(yīng)的loader以蕴,webpack都是能處理的。一言以蔽之辛孵,loaders能夠轉(zhuǎn)換文件類型丛肮。

  • Plugins:

While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks, from bundle optimization, assets management or inject environment variables.摘自官方文檔,大概意思是雖然loaders能夠轉(zhuǎn)換某一特定的文件類型魄缚,但是插件能夠提供的功能比loaders更多宝与,如捆綁優(yōu)化,資產(chǎn)管理冶匹,注入環(huán)境變量(注入環(huán)境變量可以幫助用戶在執(zhí)行項(xiàng)目構(gòu)建時(shí)使用自定義的變量值動(dòng)態(tài)替換自定義的變量习劫。),雖然不是很理解什么捆綁優(yōu)化嚼隘,資產(chǎn)管理诽里,但字面意思來理解就是插件可以在構(gòu)建項(xiàng)目的時(shí)候做一些優(yōu)化操作,比如代碼的壓縮飞蛹,自動(dòng)添加前綴等等谤狡,。

  • Mode:

By setting the mode parameter to either development, production or none, you can enable webpack's built-in optimizations that correspond to each environment. The default value is production.大概意思是通過將mode參數(shù)設(shè)置為development卧檐,production或none墓懂,您可以啟用webpack內(nèi)置的與每個(gè)環(huán)境相對應(yīng)的優(yōu)化。 默認(rèn)值是生產(chǎn)霉囚。具體一點(diǎn)就是可以做一些與環(huán)境相關(guān)的優(yōu)化操作捕仔。所謂的環(huán)境指的是開發(fā)環(huán)境還是生產(chǎn)環(huán)境,比如開發(fā)環(huán)境下可能會(huì)開啟一些列的工具檢測盈罐,代碼注釋榜跌,但是在生產(chǎn)環(huán)境不需要這些。

  • ## Browser Compatibility:

webpack supports all browsers that are ES5-compliant (IE8 and below are not supported). webpack needs Promise for import() and require.ensure(). If you want to support older browsers, you will need to load a polyfill before using these expressions.
大概意思就是說webpack支持所有符合ES5標(biāo)準(zhǔn)的瀏覽器(不支持IE8及以下版本)盅粪。如果需要支持更低的瀏覽器就需要對應(yīng)的補(bǔ)丁了斜做。

2.了解了webpack的核心概念,再來看一個(gè)最基礎(chǔ)的例子

Webpack is used to compile JavaScript modules. Once installed, you can interface with webpack either from its CLI or API.
意思是Webpack用于編譯JavaScript模塊湾揽。 安裝完成后,您可以通過其CLI或API與webpack進(jìn)行連接笼吟。因此使用webpack的第一步是安裝库物,具體步驟如下:

step1:

First let's create a directory, initialize npm, install webpack locally, and install the webpack-cli (the tool used to run webpack on the command line):意思為首先需要?jiǎng)?chuàng)建一個(gè)文件夾目錄,用npm進(jìn)行初始化贷帮,本地安裝webpack 和webpack-cli命令如下:

  • mkdir webpack-demo && cd webpack-demo
  • npm init -y
  • npm install webpack webpack-cli --save-dev
    執(zhí)行完畢后就會(huì)生成這樣一個(gè)目錄:


    26.png
step2:

在項(xiàng)目更目錄下創(chuàng)建如下的文件和文件夾:
27.png

并在對應(yīng)的文件中添加一些內(nèi)容:
index.js:
下載安裝 npm install --save lodash

import _ from 'lodash';
function component() {
 var element = document.createElement('div');

 // Lodash, currently included via a script, is required for this line to work
 // 引用了_變量戚揭,因此必須保證lodash腳本在index.js之前引入
 element.innerHTML = _.join(['Hello', 'webpack'], ' ');

 return element;
}

document.body.appendChild(component());

index.html:

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <script src="https://unpkg.com/lodash@4.16.6"></script>
</head>
<body>
  <script src="./dist/main.js"></script>
</body>
</html>
step3:

We also need to adjust our package.json file in order to make sure we mark our package as private, as well as removing the main entry. This is to prevent an accidental publish of your code意思是修改package.json文件,以確保我們將包標(biāo)記為私有文件撵枢,并刪除主條目民晒。 這是為了防止意外發(fā)布您的代碼精居。
package.json:

{
 "name": "webpack-demo",
 "version": "1.0.0",
 "description": "",
"main": "index.js", // 這一行刪除
"private": true, // 新添加這一行
 "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1"
 },
 "keywords": [],
 "author": "",
 "license": "ISC",
 "devDependencies": {
  "webpack": "^4.8.3",
  "webpack-cli": "^2.1.3"
 }
}
step4:

在根目錄運(yùn)行npx webpack,運(yùn)行完畢后在瀏覽器打開index.html,不出意外的話就會(huì)看大在瀏覽器上輸出了Hello webpack潜必。
很神奇靴姿,index.html中引入到dist/main.js并不是我們自己編寫的,卻能引入磁滚,這是因?yàn)槲覀冊谶\(yùn)行webpack的時(shí)候沒有指定輸入和輸出佛吓,webpack就用的自己默認(rèn)的輸入和輸出。默認(rèn)輸入是./src/index.js垂攘, 默認(rèn)輸出是./dist/main.js.完成編譯后會(huì)在對應(yīng)的輸出目錄生成/dist/main.js文件维雇。
做到這一步貌似也用到了webpack,但好像上面提及到的webpack的核心內(nèi)容一個(gè)也沒有見到晒他,唯一認(rèn)識到的也只是webpack默認(rèn)的輸入和輸出吱型。具體的內(nèi)容從下章節(jié)開始。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陨仅,一起剝皮案震驚了整個(gè)濱河市津滞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂名,老刑警劉巖据沈,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饺蔑,居然都是意外死亡锌介,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門猾警,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孔祸,“玉大人,你說我怎么就攤上這事发皿〈藁郏” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵穴墅,是天一觀的道長惶室。 經(jīng)常有香客問我,道長玄货,這世上最難降的妖魔是什么皇钞? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮松捉,結(jié)果婚禮上夹界,老公的妹妹穿的比我還像新娘。我一直安慰自己隘世,他們只是感情好可柿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布鸠踪。 她就那樣靜靜地躺著,像睡著了一般复斥。 火紅的嫁衣襯著肌膚如雪营密。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天永票,我揣著相機(jī)與錄音卵贱,去河邊找鬼。 笑死侣集,一個(gè)胖子當(dāng)著我的面吹牛键俱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播世分,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼编振,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了臭埋?” 一聲冷哼從身側(cè)響起踪央,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓢阴,沒想到半個(gè)月后畅蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荣恐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年液斜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠穆。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡少漆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硼被,到底是詐尸還是另有隱情示损,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布嚷硫,位于F島的核電站检访,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仔掸。R本人自食惡果不足惜脆贵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘉汰。 院中可真熱鬧,春花似錦状勤、人聲如沸鞋怀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽密似。三九已至焙矛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間残腌,已是汗流浹背村斟。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抛猫,地道東北人蟆盹。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像闺金,于是被迫代替她去往敵國和親逾滥。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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