版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
詳解前端模塊化工具-webpackwebpack是一個(gè)modulebundler,拋開博大精深的漢字問題,我們暫且管他叫模塊管理工具’。隨著js能做的事情越來越多,瀏覽器、服務(wù)器,js似乎無處不在,這時(shí),使日漸增多的js代碼變得合理有序就顯得尤為必要,也應(yīng)運(yùn)而生了很多模塊化工具。從服務(wù)器端到瀏覽器端,從原生的沒有模塊系統(tǒng)的'〈script〉'到基于Commonjs和AMD規(guī)范的實(shí)現(xiàn)到ES6modules。為了模塊化和更好的模塊化,我們總是走在探索的路上。modutas■//ithdspe-nderiG-iaswebpa匚kmodutas■//ithdspe-nderiG-iaswebpa匚kMCOULIl!?->VtERstaticass-sis但是這些實(shí)現(xiàn)模塊化的方法或多或少都有他們的缺點(diǎn)。比如說使用'〈script〉'標(biāo)簽導(dǎo)入js模塊,順序不好把握且我們需要自己梳理可能的沖突和依賴;使用Commonjs規(guī)范來解決問題,它使我們在服務(wù)器端的模塊得到了重用,但是在瀏覽器端,網(wǎng)絡(luò)的請求都是異步的,無法并行的require多個(gè)module。ES6modules的實(shí)現(xiàn)也只是一小部分,并且想要得到所有瀏覽器的支持,相比還是需要相當(dāng)?shù)囊欢螘r(shí)間。當(dāng)然靈活的模塊管理只是webpack的眾多特性之一,它還有眾多優(yōu)秀的特性:-它同時(shí)支持commonjs和AMD規(guī)范(甚至混合的形式);-它可以打成一個(gè)完整的包,也可以分成多個(gè)部分,在運(yùn)行時(shí)異步加載(可以減少第一次加載的時(shí)間);-依賴在編譯時(shí)即處理完畢,可以減少運(yùn)行時(shí)包的大?。?Loaders可以使文件在編譯時(shí)得到預(yù)處理,這可以幫我們做很多事情,比如說模板的預(yù)編譯,圖片的base64處理;-豐富的和可擴(kuò)展的插件可以適應(yīng)多變的需求。一、webpack詳解最近在學(xué)習(xí)ES6和React相關(guān)的知識(shí),為了更加方便自己寫代碼,給自己寫了個(gè)腳手架generator-reactpack。生成的項(xiàng)目中可以看到一個(gè)基本的webpack.config.js文件:1.varwebpack=require('webpack');.module.exports={entry:['webpack/hot/only-dev-server',5../js/app.js'5.],output:{path:'./build',filename:'bundle.js'},module:{loaders:[{test:/\.js?$/,loaders:['react-hot','babel'],exclude:/node_modules/},{test:/\.js$/,exclude:/node_modules/,loader:'babel-loader'},{test:/\.css$/,loader:"style!css"},{test:/\.less/,loader:'style-loader!css-loader!less-loader'}TOC\o"1-5"\h\z]},resolve:{extensions:['','.js','.json']},\o"CurrentDocument"plugins: [newwebpack.NoErrorsPlugin()]};webpack.config.js文件通常放在項(xiàng)目的根目錄中,它本身也是一個(gè)標(biāo)準(zhǔn)的Commonjs規(guī)范的模塊。在導(dǎo)出的配置對象中有幾個(gè)關(guān)鍵的參數(shù):entryentry可以是個(gè)字符串或數(shù)組或者是對象。當(dāng)entry是個(gè)字符串的時(shí)候,用來定義入口文件:entry:'./js/main.js'當(dāng)entry是個(gè)數(shù)組的時(shí)候,里面同樣包含入口js文件,另外一個(gè)參數(shù)可以是用來配置webpack提供的一個(gè)靜態(tài)資源服務(wù)器,webpack-dev-server。webpack-dev-server會(huì)監(jiān)控項(xiàng)目中每一個(gè)文件的變化,實(shí)時(shí)的進(jìn)行構(gòu)建,并且自動(dòng)刷新頁面:entry:['webpack/hot/only-dev-server','./js/app.js']當(dāng)entry是個(gè)對象的時(shí)候,我們可以將不同的文件構(gòu)建成不同的文件,按需使用,比如在我的hello頁面中只要'〈scriptsrc二'build/Profile.js'〉〈/script>引入hello.js即可:entry:{hello:'./js/hello.js',form:'./js/form.js'}2.outputoutput參數(shù)是個(gè)對象,用于定義構(gòu)建后的文件的輸出。其中包含path和filename:output:{path:'./build',filename:'bundle.js'}當(dāng)我們在entry中定義構(gòu)建多個(gè)文件時(shí),filename可以對應(yīng)的更改為[name].js用于定義不同文件構(gòu)建后的名字。module關(guān)于模塊的加載相關(guān),我們就定義在module.loaders中。這里通過正則表達(dá)式去匹配不同后綴的文件名,然后給它們定義不同的加載器。比如說給less文件定義串聯(lián)的三個(gè)加載器(!用來定義級(jí)聯(lián)關(guān)系):1.module:{2.loaders:[3.{test:/\.js?$/,loaders:['react-hot','babel'],exclude:/node_modules/},4.{test:/\.js$/,exclude:/node_modules/,loader:'babel-loader'},5.{test:/\.css$/,loader:"style!css"},6.{test:/\.less/,loader:'style-loader!css-loader!less-loader'}7.]8.}此外,還可以添加用來定義png、jpg這樣的圖片資源在小于10k時(shí)自動(dòng)處理為base64圖片的加載器:{test:/\.(png|jpg)$/,loader:'url-loader?limit=10000'}給css和less還有圖片添加了loader之后,我們不僅可以像在node中那樣requirejs文件了,我們還可以requirecss、less甚至圖片文件:require('./bootstrap.css');require('./myapp.less');varimg=document.createElement('img');img.src=require('./glyph.png');但是需要知道的是,這樣require來的文件會(huì)內(nèi)聯(lián)到j(luò)sbundle中。如果我們需要把保留require的寫法又想把css文件單獨(dú)拿出來,可以使用下面提到的[extract-text-webpack-plugin]插件。在上面示例代碼中配置的第一個(gè)loaders我們可以看到一個(gè)叫做react-hot的加載器。我的項(xiàng)目是用來學(xué)習(xí)react寫相關(guān)代碼的,所以配置了一個(gè)react-hot加載器,通過它,可以實(shí)現(xiàn)對react組件的熱替換。我們已經(jīng)在entry參數(shù)中配置了'webpack/hot/only-dev-server',所以我們只要在啟動(dòng)webpack開發(fā)服務(wù)器時(shí)開啟--hot參數(shù),就可以使用react-hot-loader了。在package.json文件中這樣定義:1"scripts":{2"start":"webpack-dev-server--hot--progress--colors",3"build":"webpack--progress--colors"4}resolvewebpack在構(gòu)建包的時(shí)候會(huì)按目錄的進(jìn)行文件的查找,resolve屬性中的extensions數(shù)組中用于配置程序可以自行補(bǔ)全哪些文件后綴:resolve:{extensions:['','.js','.json']}然后我們想要加載一個(gè)js文件時(shí),只要require('common')就可以加載common.js文件了。pluginwebpack提供了[豐富的組件]用來滿足不同的需求,當(dāng)然我們也可以自行實(shí)現(xiàn)一個(gè)組件來滿足自己的需求。在我的項(xiàng)目里面沒有特殊的需求,于是便只是配置了NoErrorsPlugin插件,用來跳過編譯時(shí)出錯(cuò)的代碼并記錄,使編譯后運(yùn)行時(shí)的包不會(huì)發(fā)生錯(cuò)誤:plugins:[newwebpack.NoErrorsPlugin()]externals當(dāng)我們想在項(xiàng)目中require一些其他的類庫或者API,而又不想讓這些類庫的源碼被構(gòu)建到運(yùn)行時(shí)文件中,這在實(shí)際開發(fā)中很有必要。此時(shí)我們就可以通過配置externals參數(shù)來解決這個(gè)問題:1externals:{2"jquery":"jQuery"3}這樣我們就可以放心的在項(xiàng)目中使用這些API了:varjQuery=require("jquery");context當(dāng)我們在require一個(gè)模塊的時(shí)候,如果在require中包含變量,像這樣:1require("./mods/"+name+".js");那么在編譯的時(shí)候我們是不能知道具體的模塊的。但這個(gè)時(shí)候,webpack也會(huì)為我們做些分析工作:1.分析目錄:'./mods';2?提取正則表達(dá)式:'廠.*\.js$/';于是這個(gè)時(shí)候?yàn)榱烁玫嘏浜蟱enpack進(jìn)行編譯,我們可以給它指明路徑,像在cake-webpack-config中所做的那樣(我們在這里先忽略abcoption的作用):varcurrentBase=process.cwd();varcontext=abcOptions.options.context?abcOptions.options.context:path.isAbsolute(entryDir)?entryDir:path.join(currentBase,entryDir);二、 whywebpack?webpack與gulp并不矛盾,甚至一起使用會(huì)得到最大化的利益,webpack與gulp。使用webpack進(jìn)行assets編譯,使用gulp進(jìn)行打包似乎就是為了讓它們各司其職,用其所長。關(guān)于工具的定位webpack的定位是modulebundler,作為模塊化工具,它的競爭對手看起來更像是[browserify],而不是[Gulp],基于流的自動(dòng)化構(gòu)建工具。然而事實(shí)也是這樣的。功能和使用方式上的不同webpack提供了一些非常實(shí)用的功能,像在前面我們體會(huì)到的那些,比如說圖片的處理,resolve的處理,分開構(gòu)建[webpack-code-splitting]等等。許多其他工具需
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度文化產(chǎn)業(yè)股權(quán)合資合同3篇
- 二零二五年度廚房設(shè)備智能故障診斷與維修合同2篇
- 2025年度法律事務(wù)所實(shí)習(xí)生勞動(dòng)合同簽訂指南3篇
- 二零二五年度風(fēng)力發(fā)電場施工造價(jià)及運(yùn)維合同3篇
- 二零二五年度跨境電商平臺(tái)勞動(dòng)合同(客戶服務(wù)專員)2篇
- 2025年度行政合同性質(zhì)與行政糾紛解決機(jī)制研究3篇
- 二零二五年度智能除塵器配件研發(fā)生產(chǎn)合作合同3篇
- 二零二五年度樣板房裝修工程包料包工服務(wù)協(xié)議
- 2025年度食堂承包經(jīng)營與顧客滿意度提升合同3篇
- 2024版股權(quán)抵押借款協(xié)議
- 2025年中國高純生鐵行業(yè)政策、市場規(guī)模及投資前景研究報(bào)告(智研咨詢發(fā)布)
- GB/T 304.9-2008關(guān)節(jié)軸承通用技術(shù)規(guī)則
- GB/T 29353-2012養(yǎng)老機(jī)構(gòu)基本規(guī)范
- 2205雙相不銹鋼的焊接工藝
- 啤酒廠糖化車間熱量衡算
- 英文標(biāo)點(diǎn)符號(hào)用法(句號(hào)分號(hào)冒號(hào)問號(hào)感嘆號(hào))(課堂)課件
- 22部能夠療傷的身心靈療愈電影
- 領(lǐng)導(dǎo)干部有效授權(quán)的技巧與藝術(shù)課件
- DB37-T 1915-2020 安全生產(chǎn)培訓(xùn)質(zhì)量控制規(guī)范-(高清版)
- 陜西省商洛市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)
- 實(shí)習(xí)生請假條
評論
0/150
提交評論