【W(wǎng)EBPACK v4.29.6 隨緣翻譯】3. 開始使用

開始使用

Webpack 用于編譯Javascript模塊烟很。一旦安裝,你可以通過wepack的CLI 或者 API 與其進(jìn)行“互動(dòng)”蜓耻。如果你是新手的話茫舶, 請看完核心概念,或者這篇理解去了解你為什么你要使用它而不是其他工具刹淌。

基礎(chǔ)安裝

首先創(chuàng)建一個(gè)文件夾饶氏,并且初始化NPM 讥耗,并且局部安裝WEBPACK (有關(guān)局部安裝,請查看 文章2),疹启,再然后安裝webpack-cli(這個(gè)工具用于命令行運(yùn)行WEBPACK):

mkdir webpack-demo && cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev
 在這篇指南中我們始終使用 diff 代碼向你展示文件夾古程,文件以及代碼的變化。

現(xiàn)在我們要?jiǎng)?chuàng)建一下文件夾結(jié)構(gòu)喊崖,文件以及文件的內(nèi)容

project
  webpack-demo
  |- package.json
+ |- index.html
+ |- /src
+   |- index.js
src/index.js
function component() {
  let element = document.createElement('div');

  // Lodash, currently included via a script, is required for this line to work
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');

  return element;
}

document.body.appendChild(component());
index.html
<!doctype html>
<html>
  <head>
    <title>Getting Started</title>
    <script src="https://unpkg.com/lodash@4.16.6"></script>
  </head>
  <body>
    <script src="./src/index.js"></script>
  </body>
</html>

我們依然需要判斷我們的package.json 以確保我們將包標(biāo)記為 "私有的(private)"挣磨, 最好將main entry 移除。 這樣可以避免你的代碼被意外發(fā)布(到 npm.js 之類的贷祈,我想)

如果你想學(xué)習(xí)更多package.json 的工作原理, 我們推薦你閱讀 [npm documentation] (https://docs.npmjs.com/files/package.json)

package.json
 {
    "name": "webpack-demo",
    "version": "1.0.0",
    "description": "",
+   "private": true,
-   "main": "index.js",
    "scripts": {
      "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
      "webpack": "^4.20.2",
      "webpack-cli": "^3.1.2"
    },
    "dependencies": {}
  }

在上面示例中喝峦,必須要有依賴項(xiàng)存在于 <scrip> 標(biāo)簽中(位于index.html)势誊, 我們的 index.js 文件依賴于 lodash 才能運(yùn)行。 然而因?yàn)樗鼪]有顯式地聲明對lodash地需求谣蠢;它只是確保全局變量 _ 的存在(index.js)粟耻。

使用這個(gè)方式管理Javascript項(xiàng)目會(huì)引發(fā)一下問題。

  1. 對于哪段腳本需要哪段外部庫眉踱,顯示不夠直觀挤忙。
  2. 如果一個(gè)依賴丟失,或者以錯(cuò)誤的順序引入谈喳,程序不能正常運(yùn)行册烈。
    3.如果一個(gè)依賴被包含,但是并沒有被使用婿禽,瀏覽器會(huì)強(qiáng)制下載不需要的代碼赏僧。

webpack 可以有效解決以上問題。

創(chuàng)建一個(gè) bundle

首先我們需要稍稍調(diào)整目錄結(jié)構(gòu)扭倾, 將 source code(/src) 從 distribution code(/dist)中分離出來淀零。 "source" code 是我們即將要編輯的代碼, 而 "distribution" code 是我們最小化并且優(yōu)化后的輸出代碼膛壹,用以被瀏覽器加載驾中。

project
  webpack-demo
  |- package.json
+ |- /dist
+   |- index.html
- |- index.html
  |- /src
    |- index.js

如果要對index.js 綁定 lodash 依賴項(xiàng), 我們需要局部安裝這個(gè)庫模聋。

npm install --save lodash
  當(dāng)安裝一個(gè)用于構(gòu)建你產(chǎn)品的包的時(shí)候肩民,你需要使用 "npm install --save"。如果你安裝用于開發(fā)意圖的包链方,(例如 linter, testing libraries, ..) 此改,則可以使用 "npm install --save-dev". 更多資訊請查閱 (npm document)[https://docs.npmjs.com/cli/install](國內(nèi)可能無法訪問)

現(xiàn)在可以將 lodash 引入我們的腳本:

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

-   // Lodash, currently included via a script, is required for this line to work
    element.innerHTML = _.join(['Hello', 'webpack'], ' ');

    return element;
  }

  document.body.appendChild(component());

現(xiàn)在,因?yàn)槲覀儗⒁獦?gòu)建代碼侄柔, 所以必須要更改 index.html 文件共啃。 首先移除 lodash <script>占调, 因?yàn)槲覀円呀?jīng)引入它了, 并且更改其他<script> 標(biāo)簽以加載我們的生成后的包移剪, 而不是原始的 /src 文件:

  <!doctype html>
  <html>
   <head>
     <title>Getting Started</title>
-    <script src="https://unpkg.com/lodash@4.16.6"></script>
   </head>
   <body>
-    <script src="./src/index.js"></script>
+    <script src="main.js"></script>
   </body>
  </html>

在以上步驟究珊,index.js 顯式地包含了 lodash 到當(dāng)前文件,并且綁定為 _ (沒有全局污染)纵苛。 webpack可以使用以上的陳述剿涮,即一個(gè)模塊需要哪些依賴項(xiàng),去構(gòu)建一個(gè)依賴項(xiàng)圖譜攻人。 然后使用圖譜去生成取试,腳本可以被正常順序被執(zhí)行的、優(yōu)化后的包怀吻。

根據(jù)以上所述瞬浓, 運(yùn)行 npx webpack, 它會(huì)將 src/index.js 視為 入口點(diǎn)蓬坡, 并且會(huì)生成 dist/main.js 作為輸出點(diǎn)猿棉。 npx 命令(在node8.2/npm5.2.0 以及更高版本的包中被攜帶),會(huì)運(yùn)行webpack 二進(jìn)制包(./node_modules/.bin/webpack) :

npx webpack

...
Built at: 13/06/2018 11:52:07
  Asset      Size  Chunks             Chunk Names
main.js  70.4 KiB       0  [emitted]  main
...

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/

你的控制臺(tái)輸出可能會(huì)有一些不符屑咳, 但是如果構(gòu)建是成功的那么你則不必理會(huì)萨赁。同時(shí),不需要關(guān)系那些 warning兆龙, 我們稍后會(huì)處理掉它杖爽。

開打 index.html ,如果一切順利紫皇,你應(yīng)該能看到以下文字:'Hello webpack'

Modules

import 和 export 語句已經(jīng)被 es2015標(biāo)準(zhǔn)化掂林。 雖然他們還不能被大多數(shù)瀏覽器支持, 但是webpack 已經(jīng)支持了坝橡。
前面的場景泻帮,webpack 已經(jīng) "transpiles" (translate + compile) 了代碼所以他們可以被更老的瀏覽器支持。 如果你觀察 dist/main.js计寇, 你可能看到webpack 是如何做到這一點(diǎn)的锣杂,這真是天才了! 除了 import 和 export 番宁,wepack 支持很多其他的模塊引入方法元莫, 詳情請查閱 (Module API) [https://webpack.js.org/api/module-methods]

注意webpack 實(shí)際上并沒有更改代碼 除了 import 和 export 語句。 如果你是使用 ES2015特性的話蝶押,確保使用一個(gè)轉(zhuǎn)譯器(transpiler)踱蠢,例如 babel 或者 Buble,詳情請查閱 webpack的 loader system

使用配置文件

在版本4的時(shí)候, webpack 已經(jīng)不需要任何配置文件茎截,但是大多數(shù)項(xiàng)目依然會(huì)需要更復(fù)雜的生成步驟苇侵,這也是為什么webpack還在支持配置文件的原因。這比手動(dòng)的在控制臺(tái)上敲很多命令高效多了企锌,所以現(xiàn)在來創(chuàng)建一個(gè)吧:

project
  webpack-demo
  |- package.json
+ |- webpack.config.js
  |- /dist
    |- index.html
  |- /src
    |- index.js
webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist')
  }
};

現(xiàn)在讓我們使用新創(chuàng)建的配置文件來再次構(gòu)建應(yīng)用程序:

npx webpack --config webpack.config.js

...
  Asset      Size  Chunks             Chunk Names
main.js  70.4 KiB       0  [emitted]  main
...

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/
 如果webpack.config.js 出現(xiàn)榆浓,webpack命令會(huì)直接使用它。我們使用 --config 選項(xiàng)只是告訴你撕攒,你可以傳入一個(gè)任何名稱的配置文件而已陡鹃。這一點(diǎn)會(huì)非常有用,當(dāng)配置文件變得復(fù)雜的時(shí)候抖坪,我們需要將他切割為很多塊萍鲸。

配置文件提供了更多比CLI 更快捷的東西。 我們可以使用這個(gè)方法指定 loader, rules, plugins, resolve options 以及 其他增強(qiáng)方法擦俐。

NPM Scripts

從 webpack CLI 運(yùn)行本地webpack是一件不是特別有趣的事情脊阴,我們可以設(shè)置一個(gè)快捷方式。 現(xiàn)在來對比一下添加npm script 之后的 package.json吧:

  {
    "name": "webpack-demo",
    "version": "1.0.0",
    "description": "",
    "scripts": {
-      "test": "echo \"Error: no test specified\" && exit 1" 
+      "test": "echo \"Error: no test specified\" && exit 1",
+      "build": "webpack"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
      "webpack": "^4.20.2",
      "webpack-cli": "^3.1.2"
    },
    "dependencies": {
      "lodash": "^4.17.5"
    }
  }

from now on捌肴, run run build 命令可以代替我們之前使用過的 npx 命令蹬叭。注意 在 scripts中藕咏,我們使用它們的名字去引用其他局部安裝后的npm packages状知,就像我們之前對npx做的一樣。 這個(gè)方便的東西是在大多數(shù)基于npm 的項(xiàng)目中的標(biāo)準(zhǔn)孽查, 因?yàn)樗试S所有貢獻(xiàn)者使用同一集合的普通腳本(每個(gè)都要標(biāo)簽饥悴,像 --config 如果必要的話)。

運(yùn)行下面的命令盲再,看看你的腳本別名是否生效:

npm run build

...
  Asset      Size  Chunks             Chunk Names
main.js  70.4 KiB       0  [emitted]  main
...

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/.
  在npm run build 后面添加2個(gè)dashes西设,后面緊跟著你的參數(shù),可以將自定義參數(shù)傳入webpack答朋。 例如: num run build -- --colors.

結(jié)論

現(xiàn)在你已經(jīng)可以構(gòu)建基本的包了贷揽,現(xiàn)在你應(yīng)該移步到下一個(gè)篇指南[Asset Management] ,學(xué)習(xí)如果使用webpack管理資源梦碗,像是 images 以及 fonts 禽绪。目前,你的項(xiàng)目應(yīng)該看起來是這個(gè)樣子的

project
webpack-demo
|- package.json
|- webpack.config.js
|- /dist
  |- main.js
  |- index.html
|- /src
  |- index.js
|- /node_modules
 如果你在使用npm5, 你應(yīng)該會(huì)同時(shí)看到一個(gè)package-lock.json 文件在你的目錄中洪规。

如果想了解更多關(guān)于webpack的設(shè)計(jì)印屁, 你可以留意basic concepts,以及configuration頁面,亦或者斩例,API章節(jié)將深入理解非常多webpack 提供的接口雄人。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市念赶,隨后出現(xiàn)的幾起案子础钠,更是在濱河造成了極大的恐慌恰力,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珍坊,死亡現(xiàn)場離奇詭異牺勾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阵漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門驻民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人履怯,你說我怎么就攤上這事回还。” “怎么了叹洲?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵柠硕,是天一觀的道長。 經(jīng)常有香客問我运提,道長蝗柔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任民泵,我火速辦了婚禮癣丧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栈妆。我一直安慰自己胁编,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布鳞尔。 她就那樣靜靜地躺著嬉橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寥假。 梳的紋絲不亂的頭發(fā)上市框,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音糕韧,去河邊找鬼枫振。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兔沃,可吹牛的內(nèi)容都是我干的蒋得。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乒疏,長吁一口氣:“原來是場噩夢啊……” “哼额衙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤窍侧,失蹤者是張志新(化名)和其女友劉穎县踢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伟件,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硼啤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斧账。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谴返。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咧织,靈堂內(nèi)的尸體忽然破棺而出嗓袱,到底是詐尸還是另有隱情,我是刑警寧澤习绢,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布渠抹,位于F島的核電站,受9級特大地震影響闪萄,放射性物質(zhì)發(fā)生泄漏梧却。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一败去、第九天 我趴在偏房一處隱蔽的房頂上張望放航。 院中可真熱鬧,春花似錦为迈、人聲如沸三椿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伴郁,卻和暖如春耿战,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焊傅。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工剂陡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狐胎。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓鸭栖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親握巢。 傳聞我的和親對象是個(gè)殘疾皇子晕鹊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354