webpack學習筆記

webpack第一次出現在我的視線,是在一次面試中,當時面試官問我是否了解AMD、CMD、Gulp、webpack ,我當時就懵了,因為在此之前沒聽說過這些,以前做的只是單純的網頁制作,相對比較簡單,當時因為急找工作,也沒怎么關注,最近項目需要用到webpack,所以就仔細查了看了官方文檔和相關資料,并記錄下來以便日后可以查閱。
中文地址 外文地址

什么是webpack?

Webpack 是一個前端資源加載/打包工具。它將根據模塊的依賴關系進行靜態分析,然后將這些模塊按照指定的規則生成對應的靜態資源。
什么是靜態分析?百度百科解釋:指在不運行代碼的方式下,通過詞法分析、語法分析、控制流、數據流分析等技術對程序代碼進行掃描,驗證代碼是否滿足規范性、安全性、可靠性、可維護性等指標的一種代碼分析技術。
什么是靜態資源?參考這篇文章:web資源介紹 ,即瀏覽器可以直接解析的html語言,相對應的動態資源就是需要轉化為對應的html語言才能被瀏覽器識別的資源。
因此,Webpack就是可以分析你的項目結構,找到JavaScript模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等),并將其打包為合適的格式以供瀏覽器使用。

為什么需要使用webpack?

webpack 依賴關系圖

我們從上圖可以看到,網頁項目中文件之間相互依賴才能正常工作,功能越多,網頁越豐富,依賴關系也就越復雜,也就越不利于開發和后期代碼的維護,為此前端社區涌現了很多好的實踐方法,而webpack則是目前最流行的方法,上圖就是就是利用webpack把有依賴關系的各種文件打包成一系列的靜態資源。

webpack有什么優點?

同時支持CommonJS和AMD模塊;
串聯式模塊加載器以及插件機制,讓其具有更好的靈活性和擴展性,例如提供對CoffeeScript、ES6的支持;
可以基于配置或者智能分析打包成多個文件,實現公共模塊或者按需加載;支持對CSS,圖片等資源進行打包,從而無需借助Grunt或Gulp
開發時在內存中完成打包,性能更快,完全可以支持開發過程的實時打包需求
對sourcemap有很好的支持,易于調試

有關CommonJS和AMD介紹參考這篇文章:JavaScript模塊化編程簡史
上面對webpack進行了介紹,下面讓我們對其進行實踐吧!

webpack的使用

在使用前我們需要對webpack有個整體認識,它是高度可配置的,有四個核心概念:入口(entry)、輸出(output)、loader、插件(plugins),接下來會詳細說明。

1.安裝

前提條件:確保電腦安裝了最新版本Node.js,如何驗證是否安裝了node呢?打開終端,輸入以下命令:node -v,如下圖所示:

2.正式使用

接下來我會寫個demo從零開始一步步實踐webpack,因為我們需要使用node內置的npm(包管理工具)從NPM服務器下載webpack需要的第三方包,而由于國內網絡的限制,我們可以使用淘寶鏡像進行快速下載,在這里我只介紹一種方法,打開終端輸入指令:npm install -g cnpm --registry=http://registry.npm.taobao.org

首先,在桌面創建一個空文件夾命名為webpack-demo,然后打開終端,輸入指令:

cd webpack-demo 
npm init

當執行你npm init指令時,在當前文件夾下自動生成package.json包文件,其定義了這個項目所需要的各種模塊,以及項目的配置信息(比如名稱、版本、自定義的腳本等元數據),如果你不準備在npm中發布你的模塊,這些問題的答案都不重要,回車默認即可。
接下來,在項目中安裝webpack,命令如下:
cnpm install --save-dev webpack
這時候我們項目文件中多出了一個node-modules,這個文件夾里有我們需要的各種依賴,
而在package.json文件中多出一個devDependencies字段:

--save-dev 與-dev區別:



當我們使用--save-dev時在package.json文件中多出一個devDependencies字段,使用--save時在package.json文件中多出一個dependencies字段,前者 是開發時候依賴的東西,后者是發布之后還依賴的東西。

接下來我們寫個小的demo,在項目中創建兩個文件夾,一個命名為seller(賣家),一個命名為buyer(買家),在各自的文件夾中創建index.html和index.js,然后建立webpack的配置文件,文件目錄如下圖:


對項目文件進行打包,只需在終端輸入指令:
webpack

這時只需在seller和buyer中各自引入對應的js文件,打開index.html,在瀏覽器中顯示如下:

這個方式不利于開發,因為我們開發時不可避免的多次對代碼進行修改,我們可以使用給webpack配置devServer,這樣當我們對代碼進行修改的時候可以實現實時刷新,在配置前需要安裝相關依賴項,在終端輸入指令:
npm install webpack-dev-server --save-dev
我們也可以在package.json包文件對npm的腳本部分進行如下圖所示進行設置

npm的start是一個特殊的腳本名稱,它的特殊性表現在,在命令行中使用npm start就可以執行相關命令,如果對應的此腳本名稱不是start,想要在命令行中運行時,需要這樣用npm run {script name}如npm run build,當我們在終端輸入 npm start指令時,輸出結果如下:

此時我們在瀏覽器中輸入localhost:8080/seller/會正常顯示出來。

開發總是離不開調試,但是打包后的文件有時我們不容易定位到出錯了的地方對應的源代碼的位置,webpack 中為我們提供了一個開發工具(Devtool),可以使用source map進行調試,我們只需在webpack.config.js中這樣配置:


具體內容請參考:開發輔助調試工具

Loader加載器的使用

webpack 可以使用loader 來預處理文件,允許打包除 JavaScript 之外的任何靜態資源,具體內容請查看:loader列表,下面我們在demo中簡單體驗下loader用法。

首先,安裝加載器:

npm install --save-dev css-loader style-loader file-loader

接著,分別在seller和buyer文件夾下創建selller.css和buyer.css,代碼如下:
//seller.css

body{
    background: url("/bj.jpg");
}
#content{
    color: coral;
}

//buyer.css

body{
    background: gray;
}
#content{
    color: white;
}

接下來,在webpack中配置如下圖所示信息:


最后,分別在buyer 和seller文件夾下的index.js,引入對應的css文件,即require('./XXX.css')
再次打包,啟動 ,在終端一次輸入以下指令:
webpack
npm start
在瀏覽器上一次輸入:
localhost:8080/buyer/
localhost:8080/seller/
效果圖如下:
buyer_css.png

seller_css.png

最后在介紹下Plugin插件

插件目的在于解決loader無法實現的其他事無法實現的其他事

我們打開打包后生成的buyer.bundle.js和seller.bundle.js文件發現內部有許多注釋和空行,這會造成打包后的文件很大,這時我們可以使用UglifyJsPlugin插件對其進行壓縮,壓縮前有900k,壓縮后51k,使用插件很簡單只需在webpack.config.js中配置如下信息:


壓縮后文件格式如下:

以上就是我在這段時間對webpack學習記錄,以后會有webpack在react或vue項目中的使用記錄,附上github地址:https://github.com/BoryLee/webpack-demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容

  • Webpack 是一個前端資源加載/打包工具。它將根據模塊的依賴關系進行靜態分析,然后將這些模塊按照指定的規則生成...
    EarthChen閱讀 407評論 0 1
  • 什么是Webpack? 按照官方文檔的解釋,Webpack就是個模塊打包工具,將模塊及其依賴打包生成靜態資源。在W...
    Www劉閱讀 683評論 2 10
  • 這是我第二次學習webpack了,初見他時,我是一臉懵逼的,這次再見時,稍微輕松了一點,現在寫下這份學習筆記,用來...
    ruby0922閱讀 317評論 0 0
  • 如果你是新手,已經了解什么是CommonJS/AMD以及gulp等,請參照過程,一步一步來,請盡量使用復制粘貼來處...
    lxf_李曉鳳閱讀 537評論 1 2
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,218評論 7 35