webpack學(xué)習(xí)之路

webpack學(xué)習(xí)之路

當(dāng)自己在學(xué)習(xí)webpack的時(shí)候智什,在網(wǎng)上發(fā)現(xiàn)中文的很詳細(xì)的教程很少,于是便想將自己學(xué)習(xí)webpack的筆記記錄整理下來(lái)篓足,便有了這篇文章未状,希望對(duì)大家有所幫助,如果有錯(cuò)誤蜕径,歡迎大家指出两踏。

在我們開(kāi)始之前

  • webpack有多種加載器(Loader,后面會(huì)介紹),可以處理各種需要被處理的靜態(tài)文件

  • webpack支持CommonJs AMD CMD規(guī)范

  • 在使用webpack的項(xiàng)目中,默認(rèn)配置文件為webpack.config.js, 模塊文件兜喻,和Node寫法一樣梦染,對(duì)外暴露接口,主要屬性有:

    • plugins插件項(xiàng)
    • entry入口文件配置項(xiàng)
    • output對(duì)應(yīng)輸出項(xiàng)配置
    • module.loaders 最關(guān)鍵的配置,告知webpack不同的文件需要什么加載器進(jìn)行處理
  • 模塊系統(tǒng)的幾種類型

    • <script>標(biāo)簽類型

      • 缺點(diǎn)
        • 全局作用域下造成變量的沖
        • 文件加載順序很重要
        • 模塊與模塊之間的依賴要解決
        • 在大型項(xiàng)目中難以維護(hù)和管理
    • CommonJs

      • 優(yōu)點(diǎn)

        • 服務(wù)端模塊能夠重復(fù)利用
        • 有優(yōu)秀的包管理工具npm
        • 簡(jiǎn)單朴皆,上手容易
      • 缺點(diǎn)

        • 不適合瀏覽器端的使用
        • 不能做到并行加載模塊
    • AMD

      • 優(yōu)點(diǎn)

        • 適合瀏覽器的異步加載機(jī)制
        • 并行加載模塊
      • 缺點(diǎn)

        • 代碼難以經(jīng)營(yíng)和維護(hù)
    • ES6

      • 優(yōu)點(diǎn)

        • 未來(lái)的ES規(guī)范
      • 缺點(diǎn)

        • 瀏覽器對(duì)ES6的支持還需要一段時(shí)間
        • 能夠依賴的現(xiàn)有的模塊少

' 轉(zhuǎn)換 ' 的思想

模塊要能夠在客戶端中去執(zhí)行帕识,則必須將它們從 server => browser

  • 極端的想法:

    • 一個(gè)請(qǐng)求一個(gè)模塊 只有需要的模塊會(huì)被轉(zhuǎn)換,但是耗費(fèi)資源遂铡,時(shí)間長(zhǎng)
    • 所有請(qǐng)求都在一個(gè)模塊 不需要的模塊也會(huì)被轉(zhuǎn)換 時(shí)間短肮疗,耗費(fèi)資源少
  • 分塊轉(zhuǎn)換的想法:

    • 將眾多的模塊切成許多片,在初始化時(shí)的請(qǐng)求不會(huì)包括完整的代碼扒接,并且在初始化時(shí)不需要的模塊切片會(huì)在后續(xù)加載過(guò)程中按需加載伪货。并且將模塊化的切片方式是可以有開(kāi)發(fā)人員自己定義的。

wepback它的目標(biāo)是是什么钾怔?

webpack它能將依賴的模塊轉(zhuǎn)化成可以代表這些包的靜態(tài)文件

它的目標(biāo)有

  • 將依賴的模塊分片化碱呼,并且按需加載
  • 解決大型項(xiàng)目初始化加載慢的問(wèn)題
  • 每一個(gè)靜態(tài)文件都可以看成一個(gè)模塊
  • 可以整合第三方庫(kù)
  • 能夠在大型項(xiàng)目中運(yùn)用
  • 可以自定義切割模塊的方式

webpack較之其他類似工具有什么不同?

  • 有同步和異步兩種不同的加載方式
  • Loader,加載器可以將其他資源整合到JS文件中蒂教,通過(guò)這種方式巍举,可以講所有的源文件形成一個(gè)模塊
  • 優(yōu)秀的語(yǔ)法分析能力,支持 CommonJs AMD 規(guī)范
  • 有豐富的開(kāi)源插件庫(kù)凝垛,可以根據(jù)自己的需求自定義webpack的配置

webpack為什么要將所有資源放在一個(gè)文件里面懊悯?

我們知道,對(duì)于瀏覽器來(lái)說(shuō)梦皮,加載的資源越少炭分,響應(yīng)的速度也就越快,所以有時(shí)候我們?yōu)榱藘?yōu)化瀏覽器的性能剑肯,會(huì)盡可能的將資源合并到一個(gè)主文件app.js里面捧毛。但是這導(dǎo)致的很大的缺點(diǎn):

  • 當(dāng)你的項(xiàng)目十分龐大的時(shí)候,不同的頁(yè)面不能做到按需加載,而是將所有的資源一并加載呀忧,耗費(fèi)時(shí)間長(zhǎng)师痕,性能降低。
  • 會(huì)導(dǎo)致依賴庫(kù)之間關(guān)系的混亂而账,特別是大型項(xiàng)目時(shí)胰坟,會(huì)變得難以維護(hù)和跟蹤。比如:哪些文件是需要A模塊加載完后才能執(zhí)行的泞辐?哪些頁(yè)面會(huì)受到多個(gè)樣式表同時(shí)影響的笔横? 等許多問(wèn)題。

webpack可以很好的解決以上缺點(diǎn),因?yàn)樗且粋€(gè)十分聰明的模塊打包系統(tǒng)咐吼,當(dāng)你正確配置后吹缔,它會(huì)比你想象中的更強(qiáng)大,更優(yōu)秀锯茄。

開(kāi)啟wbpack之旅


安裝webpack

  • 我們可以直接使用npm進(jìn)行全局安裝

    npm install webpack -g

  • 在常規(guī)項(xiàng)目中把webpack依賴加入到package.json

    npm init npm install webpack --save

更詳盡的安裝方法個(gè)可以參考webpack安裝

webpak命令行常見(jiàn)使用的操作

啟動(dòng)

webpack

如果你想當(dāng)改變一個(gè)文件而讓webpack實(shí)時(shí)編譯

webpack --watch

如果你想把默認(rèn)的配置文件webpack.config.js改成自定義文件

webpack --config customconfig.js

webpack的用法


首先先貼上一個(gè)比較完整的webpack.config.js的代碼厢塘,再詳細(xì)介紹:

// webpack.config.js
var path = require('path')
var webpack = require('webpack')

module.exports = {
  entry: ['./src/index'],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      compressor: {
        warnings: false,
      },
    }),
    new webpack.optimize.OccurenceOrderPlugin()
  ],
  module: {
    loaders: [{
      test: /\.css$/,
      loaders: ['style', 'css']
    }]
  }
}

就像我在前面提到的,webpack.config.js的寫法和在Node里的寫法相同肌幽,我們主要看的就是文件中的module.exports里面的內(nèi)容

  • entry 是指入口文件的配置項(xiàng)俗冻,它是一個(gè)數(shù)組的原因是webpack允許多個(gè)入口點(diǎn)。

  • output是指輸出文件的配置項(xiàng)

    • path - 表示輸出文件的路徑
    • filename - 表示輸出文件的文件名
  • plugins 顧名思義牍颈,使用插件可以給webpack添加更多的功能迄薄,使webpack更加的靈活和強(qiáng)大,webpack有兩種類型的插件:

    • webpack內(nèi)置的插件

        // 首先要先安裝webpack模塊
        var webpack = require("webpack");
        
        module.exports = {
            new webpack.optimize.UglifyJsPlugin({
              compressor: {
                warnings: false,
              },
            })
        };
      
    • webpack外置插件

      比如:

        //npm install component-webpack-plugin 先要在安裝該模版
        var ComponentPlugin = require("component-webpack-plugin");
        module.exports = {
            plugins: [
                new ComponentPlugin()
            ]
        }
      

    更多的插件以及插件的用法,大家可以到webpack的插件上查看煮岁。

  • module 配置處理文件的選項(xiàng)

    • loaders 一個(gè)含有wepback中能處理不同文件的加載器的數(shù)組

      • test 用來(lái)匹配相對(duì)應(yīng)文件的正則表達(dá)式
      • loaders 告訴webpack要利用哪種加載器來(lái)處理test所匹配的文件
    • loaders 的安裝方法

        $ npm install xxx-loader --save-dev
      

講到這里讥蔽,我相信大家都會(huì)對(duì)wepback有了更深的認(rèn)識(shí),但是卻十分的松散画机,不能把它們串起來(lái)冶伞,那接下來(lái)我就用幾個(gè)小的demo來(lái)讓大家梳理梳理起來(lái)

舉個(gè)例子

首先請(qǐng)大家建立一個(gè)和我一樣文件結(jié)構(gòu)的文件夾,在這里我也說(shuō)明下這個(gè)demo大概要做的事情步氏,就是將css文件都打包放到一個(gè)js文件响禽,并且對(duì)圖片解壓,并且要對(duì)這個(gè)js文件進(jìn)行自動(dòng)壓縮荚醒。

DemoOne
|- dist
|- src
    |- index.js
    |- index.html
    |- style.css
    |- demo.png(隨便找一張圖片就可以)
|- package.json
|- webpack.config.js

首先看index.html代碼

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>demo1</title>
    </head>
    <body>
        <div>Hello,world</div>
        [站外圖片上傳中……(1)]
        <script src="../dist/bundlle.js"></script>
    </body>
    </html>

再看style.css

body{
    background:red;
}

這個(gè)時(shí)候我們還沒(méi)有寫webpack.config.js,打開(kāi)index.html,會(huì)看到

demo1.png

打開(kāi)控制臺(tái)后芋类,你會(huì)發(fā)現(xiàn)


demo1_1.png

接下來(lái),我們?cè)?code>webpack.config.js下加上如下代碼

// webpack.config.js
var path = require('path')
var webpack = require('webpack');

module.exports = {
  entry: ['./src/index'],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin({
      compressor: {
        warnings: false,
      },
    })
  ],
  module: {
    loaders: [{
      test: /\.css$/,
      loaders: ['style', 'css']
    },
    {
        test: /\.(png|jpg)$/,
        loaders: [
            'file?hash=sha512&digest=hex&name=[hash].[ext]',
            'image-webpack?bypassOnDebug&optimizationLevel=7&interlaced=false'
        ]
    }]
  }
}

當(dāng)然界阁,在開(kāi)始用webpack之前侯繁,要先安裝相對(duì)應(yīng)的模塊,解析css文件 圖片文件以及因?yàn)橐獙?duì)文件進(jìn)行壓縮泡躯,所以也要用到上文中所說(shuō)的webpack自身內(nèi)置的插件,所以也要導(dǎo)入webpack模塊

$ npm install style-loader css-loader image-webpack-loader webpack --save-dev

安裝好之后使用webpack命令后會(huì)有這樣的提示

demo1_2.png

但是這個(gè)時(shí)候你打開(kāi)瀏覽器會(huì)發(fā)現(xiàn)贮竟,頁(yè)面依舊沒(méi)有什么效果丽焊,這是肯定的!我想大家肯定知道下一步該怎么做了咕别,沒(méi)錯(cuò)技健!在入口文件里面增加內(nèi)容

require('./style.css');
require('./demo.png');

再運(yùn)行webpack,出現(xiàn)上圖類似提示后,打開(kāi)瀏覽器惰拱,你會(huì)發(fā)現(xiàn)變成了這個(gè)樣子

![demo1_4.png](http://upload-images.jianshu.io/upload_images/1783332-f65aecbb93ee0902.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![Uploading demo1_5_017947.png . . .]

并且在dist文件夾內(nèi)凫乖,多出了兩個(gè)文件,一個(gè)f1341ce5ea165e06ec3358441b52d5ea.png(隨機(jī)產(chǎn)生的名字)如果你想獲得這個(gè)名字弓颈,可以將require('./demo.png')輸出查看,以及還有bundle.js,比較圖片前后的大小删掀,

demo1_4.png

demo1_5.png

可以發(fā)現(xiàn)翔冀,文件大小發(fā)生了改變。打開(kāi)bundle.js你會(huì)發(fā)現(xiàn)該文件也被壓縮了披泪。是不是感覺(jué)很神奇纤子?!
還有一個(gè)比較好玩的插件htmlwebpackplugin可以點(diǎn)擊這里看看款票,把上面的例子改變下哦控硼。

最后

我相信看到這里你對(duì)webpack一定有了一定的認(rèn)識(shí),其實(shí)艾少,還webpack還有很多強(qiáng)大的功能卡乾,比如,webpack-dev-server可以自動(dòng)生成一個(gè)小型的NodeJs Express服務(wù)器從而實(shí)現(xiàn)webpack十分實(shí)用的功能熱替換(HMR) 和其它的工具gulp grunt等一起使用缚够。幔妨。。最后值得一提的是reactwebpack是一對(duì)絕佳cp啊谍椅,有木有N蟊ぁ!

最后雏吭,希望這篇博客對(duì)大家有所幫助(如果是锁施,請(qǐng)盡情star哦,??)杖们,歡迎提出您的寶貴建議~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悉抵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摘完,更是在濱河造成了極大的恐慌基跑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件描焰,死亡現(xiàn)場(chǎng)離奇詭異媳否,居然都是意外死亡栅螟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門篱竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)力图,“玉大人,你說(shuō)我怎么就攤上這事掺逼〕悦剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吕喘,是天一觀的道長(zhǎng)赘那。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氯质,這世上最難降的妖魔是什么募舟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮闻察,結(jié)果婚禮上拱礁,老公的妹妹穿的比我還像新娘。我一直安慰自己辕漂,他們只是感情好呢灶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钉嘹,像睡著了一般鸯乃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跋涣,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天飒责,我揣著相機(jī)與錄音,去河邊找鬼仆潮。 笑死宏蛉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的性置。 我是一名探鬼主播拾并,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹏浅!你這毒婦竟也來(lái)了嗅义?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤隐砸,失蹤者是張志新(化名)和其女友劉穎之碗,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體季希,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡褪那,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年幽纷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博敬。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡友浸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偏窝,到底是詐尸還是另有隱情收恢,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布祭往,位于F島的核電站伦意,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硼补。R本人自食惡果不足惜驮肉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望括勺。 院中可真熱鬧,春花似錦曲掰、人聲如沸疾捍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乱豆。三九已至,卻和暖如春吊趾,著一層夾襖步出監(jiān)牢的瞬間宛裕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工论泛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揩尸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓屁奏,卻偏偏與公主長(zhǎng)得像岩榆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坟瓢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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