webpack入門必知必會(huì)

前言

這是我第一篇介紹webpack的文章,先從一個(gè)入門教程開始吧荸哟,后續(xù)會(huì)有更多相關(guān)webpack的文章推出。

首先什么是webpack?如果說它是一個(gè)打包工具那真的是有點(diǎn)大材小用了滥朱。我個(gè)人認(rèn)為webpack是一個(gè)集前端自動(dòng)化、模塊化力试、組件化于一體的可拓展系統(tǒng)徙邻,你可以根據(jù)自己的需要來進(jìn)行一系列的配置和安裝,最終實(shí)現(xiàn)你需要的功能并進(jìn)行打包輸出畸裳。

本文作為一篇入門教程缰犁,這里先從webpack最簡單的3招開始介紹,即拆分怖糊、打包帅容、壓縮。

webpack入門
webpack入門

步驟

1.傳統(tǒng)項(xiàng)目中的問題

在不依賴任何自動(dòng)化伍伤、模塊化工具的項(xiàng)目中并徘,通常我們的代碼是這樣的:

index.html

<html>
  <head>
    <title>傳統(tǒng)項(xiàng)目</title>
    <script src="https://code.jquery.com/jquery-2.2.4.js"></script>
  </head>
  <body>
    <script src="app/index.js"></script>
  </body>
</html>

app/index.js

function main() {
    $('body').html('hello world!');
}

main();

以上示例中,腳本之間存在著隱式依賴關(guān)系扰魂。

index.js取決于被包括在頁面運(yùn)行之前的jQuery麦乞,它只是假設(shè)有一個(gè)全局變量$的存在。

這樣管理JavaScript項(xiàng)目有一些問題:

如果依賴項(xiàng)丟失劝评,或者包含在錯(cuò)誤的順序中姐直,應(yīng)用程序?qū)⒉粫?huì)運(yùn)行。
如果包含依賴項(xiàng)但沒有使用蒋畜,那么瀏覽器必須下載很多不必要的代碼简肴。

所以為了解決以上問題,我們需要使用webpack來實(shí)現(xiàn)一些改變百侧。

2.準(zhǔn)備

首先我們得在項(xiàng)目中安裝webpack砰识,我們打開命令行工具運(yùn)行:

mkdir demo && cd demo // 新建demo文件夾并打開
npm init // 初始化npm,生成package.json配置文件
npm install --save-dev webpack@beta // 安裝webpack2.0版本佣渴,mac系統(tǒng)可能需要添加sudo命令

以上使用的npm命令需要安裝node.js辫狼,可以點(diǎn)擊這里安裝即可:node.js

為了改進(jìn)上方傳統(tǒng)項(xiàng)目中的不足,我們這里還需要安裝jQuery:

npm install --save jquery // 安裝jQuery

3.改變

改變后的index.js

var $ = require('jquery');

function main() {
    $('body').html('hello world!');
}

main();

這里我們可以直接在index.js里引用jQuery辛润,index.js明確要求jQuery的存在膨处,這樣就不存在隱式依賴的問題(沒有全局污染)。

改變后的index.html

<html>
  <head>
    <title>webpack項(xiàng)目</title>
  </head>
  <body>
      <script src="dist/bundle.js"></script>
  </body>
</html>

這里我們的index.html文件只引入了最終打包后的bundle.js。現(xiàn)在運(yùn)行webpack命令將index.js輸出為bundle.js真椿。

運(yùn)行命令:webpack app/index.js dist/bundle.js

webpack app/index.js dist/bundle.js
Hash: 3bb91a6dedfc2a2a1c08
Version: webpack 2.2.0-rc.4
Time: 397ms
    Asset    Size  Chunks                    Chunk Names
bundle.js  270 kB       0  [emitted]  [big]  main
   [0] ./~/jquery/dist/jquery.js 267 kB {0} [built]
   [1] ./app/index.js 83 bytes {0} [built]

最終我們?cè)跒g覽器中打開index.html頁面可以看到輸出的“hello world!”鹃答。

hello world
hello world

4.拆分

現(xiàn)在如果我們index.js中的"hello world!"字符串需要放到另外一個(gè)hello.js中,然后在index.js中引入使用的話突硝,這就涉及到webpack模塊拆分的功能测摔。

app/index.js

var $ = require('jquery');
var str = require('./hello.js');

function main() {
    $('body').html(str);
}

main();

app/hello.js

var str = 'hello world!';

module.exports = str;

我們?cè)趆ello.js中通過module.exports導(dǎo)出str變量,然后在index.js通過require導(dǎo)入同樣可以實(shí)現(xiàn)瀏覽器中輸入“hello world!”的效果解恰,當(dāng)然我們需要重新運(yùn)行下webpack命令:webpack app/index.js dist/bundle.js

5.打包

其實(shí)在上面我們已經(jīng)使用了打包命令:

webpack app/index.js dist/bundle.js

其中的app/index.js即為打包的入口文件锋八,而dist/bundle.js為輸出文件。

但是我們會(huì)發(fā)現(xiàn)這樣的命令不利于我們復(fù)雜項(xiàng)目配置的使用护盈,對(duì)于更復(fù)雜的配置挟纱,我們可以利用配置文件webpack.config.js來統(tǒng)一管理。

我們可以在demo文件夾下新建webpack.config.js配置文件:

var path = require('path');

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

上方配置中的entry就是我們的入口文件腐宋,可以有多個(gè)入口文件紊服,而output即為webpack打包的輸入對(duì)象,filename為輸出文件名胸竞,path為輸出路徑围苫。

如此我們運(yùn)行命令行:

webpack --config webpack.config.js

同樣可以生成打包目錄dist及打包文件bundle.js。

當(dāng)然你也可以直接運(yùn)行簡化的命令:

webpack

webapck會(huì)自動(dòng)去尋找當(dāng)前目錄下的webpack.config.js文件撤师。

6.壓縮

上一步我們利用webpack命令將多個(gè)多件打包到了一個(gè)bundle.js的文件中剂府,但是并未進(jìn)行壓縮,你可以打開bundle.js進(jìn)行查看剃盾。

而如果我們需要對(duì)打包后的代碼進(jìn)一步壓縮處理腺占,我們可以運(yùn)行命令:

webpack -p

這時(shí)我們可以來進(jìn)行下打包和壓縮的文件大小對(duì)比

打包命令:webpack

webpack
Hash: ab4a1091f0880100eab0
Version: webpack 2.2.0-rc.4
Time: 387ms
    Asset    Size  Chunks                    Chunk Names
bundle.js  270 kB       0  [emitted]  [big]  main
   [0] ./app/hello.js 50 bytes {0} [built]
   [1] ./~/jquery/dist/jquery.js 267 kB {0} [built]
   [2] ./app/index.js 114 bytes {0} [built]

輸出的bundle.js整個(gè)文件大小為270 kB。

壓縮命令:webpack -p

webpack -p
Hash: ab4a1091f0880100eab0
Version: webpack 2.2.0-rc.4
Time: 1967ms
    Asset     Size  Chunks             Chunk Names
bundle.js  88.3 kB       0  [emitted]  main
   [0] ./app/hello.js 50 bytes {0} [built]
   [1] ./~/jquery/dist/jquery.js 267 kB {0} [built]
   [2] ./app/index.js 114 bytes {0} [built]

輸出的bundle.js整個(gè)文件大小為88.3 kB痒谴。

很明顯衰伯,文件被壓縮了。

7.進(jìn)一步壓縮優(yōu)化

上方我們通過webpack的壓縮命令將文件打包并壓縮了积蔚,但是對(duì)于webpack -p壓縮后的文件來說其實(shí)還有壓縮的余地意鲸。如果你使用的是webpack1.0,那么你可以在配置文件中添加plugins配置項(xiàng)尽爆,并且加入如下插件:

var webpack = require('webpack');

module.exports = {
    ...
    plugins:[
        // 去除代碼塊內(nèi)的告警語句
        new webpack.optimize.UglifyJsPlugin({
          compress: {
            warnings: false
          }
        }),
        // 優(yōu)先考慮使用最多的模塊怎顾,并為它們分配最小的ID
        new webpack.optimize.OccurenceOrderPlugin()
    ]
    ...
}

而本示例中使用的是webpack2.0版本,在2.0中UglifyJsPlugin的compress選項(xiàng)默認(rèn)為false漱贱,并且OccurrenceOrderPlugin默認(rèn)啟用槐雾,所以無需進(jìn)行配置。

結(jié)語

本文主要介紹了webpack入門的一些簡單命令和基本配置信息幅狮,從代碼拆分募强、打包株灸、壓縮的角度和傳統(tǒng)的前端項(xiàng)目進(jìn)行對(duì)比,希望以此加深大家對(duì)webpack基礎(chǔ)知識(shí)的印象擎值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慌烧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸠儿,更是在濱河造成了極大的恐慌屹蚊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捆交,死亡現(xiàn)場離奇詭異,居然都是意外死亡腐巢,警方通過查閱死者的電腦和手機(jī)品追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冯丙,“玉大人肉瓦,你說我怎么就攤上這事∥赶В” “怎么了泞莉?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長船殉。 經(jīng)常有香客問我鲫趁,道長,這世上最難降的妖魔是什么利虫? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任挨厚,我火速辦了婚禮,結(jié)果婚禮上糠惫,老公的妹妹穿的比我還像新娘疫剃。我一直安慰自己,他們只是感情好硼讽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布巢价。 她就那樣靜靜地躺著,像睡著了一般固阁。 火紅的嫁衣襯著肌膚如雪壤躲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天备燃,我揣著相機(jī)與錄音柒爵,去河邊找鬼。 笑死赚爵,一個(gè)胖子當(dāng)著我的面吹牛棉胀,可吹牛的內(nèi)容都是我干的法瑟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼唁奢,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼霎挟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起麻掸,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤酥夭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脊奋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熬北,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年诚隙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讶隐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡久又,死狀恐怖巫延,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情地消,我是刑警寧澤炉峰,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站脉执,受9級(jí)特大地震影響疼阔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜半夷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一竿开、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玻熙,春花似錦否彩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枚尼,卻和暖如春贴浙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背署恍。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工崎溃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盯质。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓袁串,卻偏偏與公主長得像概而,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囱修,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • GitChat技術(shù)雜談 前言 本文較長赎瑰,為了節(jié)省你的閱讀時(shí)間,在文前列寫作思路如下: 什么是 webpack破镰,它要...
    蕭玄辭閱讀 12,697評(píng)論 7 110
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,187評(píng)論 40 247
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺餐曼,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,171評(píng)論 7 35
  • 原文首發(fā)于:Webpack 3,從入門到放棄 Update (2017.8.27) : 關(guān)于 output.pub...
    昵稱都被用完了衰閱讀 1,901評(píng)論 4 19
  • Hi 你好~ 酸澀~ 是不是只有長大了孕似,才能體味到生活中的不如意~我并不想強(qiáng)迫自己承認(rèn)現(xiàn)在的我很好~因?yàn)榻裉焓撬釢?..
    M30閱讀 229評(píng)論 0 0