webpack

一彪标、什么是webpack仿便?

  • webpack是一個現(xiàn)代JavaScript應(yīng)用程序的靜態(tài)模塊打包器谦去,在webpack里一切文件皆模塊憎蛤,通過loader轉(zhuǎn)換文件外傅,通過plugin注入鉤子,最后輸出由多個文件組合成的文件俩檬,webpack專注構(gòu)建模塊化項目萎胰。
  • webpack可以看做是模塊打包機:他做的事情是,分析項目棚辽,找到JavaScript模塊以及其他的一些瀏覽器不能直接運行的拓展語言(scss技竟, TypeScript等),并將其打包為合適的格式以供瀏覽器使用屈藐。


    webpack.png

二榔组、四個核心概念

  1. entry:一個可執(zhí)行文件或庫的入口文件熙尉。
  2. chunk:多個文件組成的一個代碼塊。例如把一個可執(zhí)行文件和他所有依賴的模塊組合為一個chunk搓扯,這體現(xiàn)了webpack的打包機制检痰。
  3. loader:文件轉(zhuǎn)換器。例如把es6轉(zhuǎn)換為es5锨推,scss轉(zhuǎn)換為css铅歼。
  4. plugin:插件,用于擴展webpack的功能换可,在webpack構(gòu)建生命周期的節(jié)點上加入擴展hook為webpack加入功能椎椰。

三、webpack構(gòu)建流程

  1. 解析webpack配置參數(shù)沾鳄,合并從shell傳入和webpack.config.js文件里配置的參數(shù)慨飘,生產(chǎn)最后的配置結(jié)果。
  2. 注冊所有配置的插件洞渔,好讓插件監(jiān)聽webpack構(gòu)建生命周期的事件節(jié)點套媚,以做出對應(yīng)的反應(yīng)。
  3. 從配置的entry入口文件開始解析文件構(gòu)建AST語法樹堤瘤,找出每個文件所依賴的文件,遞歸下去浆熔。
  4. 在解析文件遞歸的過程中根據(jù)局文件類型和loader配置找出合適的loader用來對文件進行轉(zhuǎn)換。
  5. 遞歸完后得到每個文件的最終結(jié)果慎皱,根據(jù)entry配置生成代碼塊chunk。
  6. 輸出所有chunk到文件系統(tǒng)叶骨。

四茫多、webpack和grunt、gulp的不同

1. 概念區(qū)別:

(1)gulp/grunt是一種能夠優(yōu)化前端的開發(fā)流程的工具天揖。
(2)webpack是一種模塊化的解決方案。

2. 工作方式的區(qū)別:

(1)Grunt和Gulp的工作方式是:在一個配置文件中今膊,指明對某些文件進行類似編譯、組合伞剑、壓縮等任務(wù)的具體步驟斑唬。工具之后可以自動替你完成這些任務(wù)。
(2)Webpack的工作方式:把你的項目當(dāng)做一個整體,通過給定的主文件(如:index.js)恕刘,webpack將從這個文件開始找到你的項目的所有依賴文件,使用loader處理他們雪营,最后打包為一個(或多個)瀏覽器可識別的JavaScript文件。

3. 基于類型的區(qū)別

(1)grunt和gulp是基于任務(wù)和流(task洋访、stream)的。類似jQury姻政,找到一個(或一類)文件岂嗓,對其做一系列鏈式操作汁展,更新流上的數(shù)據(jù)厌殉,整條鏈式操作構(gòu)成了一個任務(wù),多個任務(wù)就構(gòu)成了整個web的構(gòu)建流程公罕。
(2)webpack是基于入口的。webpack會自動地遞歸解析入口所需要加載的所有資源文件楼眷,然后用不同的loader來處理不同的文件,用plugin來擴展webpack功能罐柳。

五、幾種常見的loader

  1. file-loader:把文件數(shù)出到一個文件夾中齿梁,在代碼中通過相對URL去引用輸出的文件。
  2. url-loader:和file-loader類似勺择,但是能在文件很小的情況下以base64的方式把文件內(nèi)容注入到代碼中去蔗崎。
  3. source-map-loader:加載額外的source map文件扰藕,以方便斷點調(diào)試缓苛。
  4. image-loader:加載并且壓縮圖片文件。
  5. babel-loader:把es6轉(zhuǎn)換成es5笔刹。
  6. css-loader:加載CSS,支持模塊化舌菜、壓縮亦镶、文件導(dǎo)入等特性日月。
  7. style-loader:把CSS代碼注入到JavaScript中缤骨,通過DOM操作去加載CSS。
  8. eslint-loader:通過ESLint檢查JavaScript代碼绊起。

六精拟、webpack的優(yōu)缺點

優(yōu)點

  • 專注處理模塊化的項目,能做到開箱即用虱歪,一步到位蜂绎。
  • 可通過plugin擴展笋鄙,完整好用又不是靈活。
  • 使用場景不局限于web開發(fā)局装。
  • 社區(qū)龐大活躍,經(jīng)常引入緊跟時代發(fā)展的新特性铐尚,能為大多數(shù)場景找到已有的開源擴展。
  • 良好的開發(fā)體驗玫膀。

缺點

  • webpack的缺點是只能用于采用模塊化開發(fā)的項目爹脾。

七、什么是模塊的熱更新灵妨?

  • 模塊熱更新是webpack的一個功能,他可以使得代碼修改過后不用刷新瀏覽器就可以更新泌霍,是高級版的自動刷新瀏覽器。
  • DevServer中通過hot屬性可以控制模塊的熱替換蟹地。
    1、通過配置文件
const webpack = require('webpack');
const path = require('path');
let env = process.env.NODE_ENV == "development" ? "development" : "production";
const config = {
  mode: env,
 devServer: {
     hot:true
 }
}
  plugins: [
     new webpack.HotModuleReplacementPlugin(), //熱加載插件
  ],
module.exports = config;

2怪与、通過命令行

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "NODE_ENV=development  webpack-dev-server --config  webpack.develop.config.js --hot",
  },

八、懶加載(按需加載路由)

  • webpack中提供了require.ensure()來實現(xiàn)按需加載遍愿。以前引入路由是通過import這樣的方式引入耘斩,改為const定義的方式進行引入。
不進行頁面按需加載的引入方式:
import home from '../../common/home.vue'
進行頁面按需加載的引入方式:
const home = r =>require.ensure([ ],() =>(require('../../common/home.vue')))

九煌往、通過webpack處理長緩存

  • 瀏覽器在用戶訪問頁面的時候,為了加快加載速度刽脖,會對用戶訪問的靜態(tài)資源進行存儲,但每一次代碼升級或是更新却邓,都需要瀏覽器去下載新的代碼院水,最方便和簡單的更新方式就是引入新的文件名稱腊徙。在webpack中可以在output中輸出的文件指定chunkhash檬某,并且分離經(jīng)常更新的代碼和框架代碼。通過NameModulesPlugin或是HashedModuleldsPlugin使再次打包文件名不變民傻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场斑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漏隐,更是在濱河造成了極大的恐慌,老刑警劉巖青责,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吴菠,居然都是意外死亡浩村,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門酿矢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怎燥,“玉大人瘫筐,你說我怎么就攤上這事铐姚。” “怎么了之众?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵依许,是天一觀的道長。 經(jīng)常有香客問我峭跳,道長,這世上最難降的妖魔是什么蛀醉? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任拯刁,我火速辦了婚禮古胆,結(jié)果婚禮上筛璧,老公的妹妹穿的比我還像新娘。我一直安慰自己棺牧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布颊乘。 她就那樣靜靜地躺著,像睡著了一般乏悄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上开呐,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天规求,我揣著相機與錄音,去河邊找鬼阻肿。 笑死,一個胖子當(dāng)著我的面吹牛丛塌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哨坪,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乍楚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徒溪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鲤桥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茶凳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體播揪,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年箱沦,在試婚紗的時候發(fā)現(xiàn)自己被綠了雇庙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谓形。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖聘萨,靈堂內(nèi)的尸體忽然破棺而出童太,到底是詐尸還是另有隱情米辐,我是刑警寧澤康愤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布舶吗,位于F島的核電站,受9級特大地震影響检激,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叔收,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一傲隶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跺株,春花似錦、人聲如沸乒省。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唇礁,卻和暖如春惨篱,著一層夾襖步出監(jiān)牢的瞬間垒迂,已是汗流浹背妒蛇。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工楷拳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吏奸,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓她混,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坤按。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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