日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
借助webpack對項目進(jìn)行分析優(yōu)化

進(jìn)入公司之后,接手的便是前人留下來的一個大項目。慶幸的是整個項目擁有完善的產(chǎn)品功能文檔,但是由于項目過于龐大,老舊。包含了打包過慢,冗余文件過多等諸多問題。想要快速的解決這些問題,想要完全把功能重構(gòu)一遍的話,成本太高了。一個一個文件來過,時間成本也比較大。因此在此篇文章中,我們介紹一下我是如何配合webpack一步步進(jìn)行分析,將項目進(jìn)行優(yōu)化的。

創(chuàng)新互聯(lián)2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元輝縣做網(wǎng)站,已為上家服務(wù),為輝縣各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792

同時我針對思路封裝了一個webpack-unused-files,用于查找項目中的冗余文件,歡迎試用并star。

問題

首先,我們先大致看下我們都有什么問題,然后一步步進(jìn)行解決

  • 項目頻繁進(jìn)行修改,冗余文件過多
  • 部分第三方依賴濫用,想去除但是不知道在哪個文件中?;驔]用,但是遺留在package.json里,
  • 項目龐大,打包的結(jié)果過大,時間過長

刪除冗余文件

由于項目的頻繁改動,有很多文件已經(jīng)不被使用并且沒有被刪除。由于項目的不斷擴(kuò)大,只會影響我們定位功能和問題的速度,因此對冗余文件進(jìn)行清理,是很重要的。但是我們單憑肉眼很難識別哪個文件是否被依賴的,因此還要通過webpack來解決。

1.獲取項目依賴的所有文件

我們來看一下webpack的輸出文件格式:

 
 
 
 
  1.   ... 
  2.   chunks: [{ 
  3.     name: 'chunk-name', 
  4.     modules: [ 
  5.       // 每個chunk中所有的依賴文件 
  6.     ] 
  7.   }] 
  8.   ... 
  9. }

所以說,根據(jù)這個stats.json,我們可以拿到在整個項目中拿到的所有項目文件:

 
 
 
 
  1. /** 
  2.  * 查詢依賴的模塊 
  3.  */ 
  4. function findSrcModules () { 
  5.   return new Promise((resolve, reject) => { 
  6.     fs.readFile(statPath, (err, data) => { 
  7.       if (err) return 
  8.       const json = JSON.parse(data) 
  9.       const assetsList = json.chunks 
  10.       let ret = [] 
  11.       // 拿到所有chunk的所有依賴文件 
  12.       assetsList.forEach(chunk => { 
  13.         const modules = chunk.modules.map(item => item.name) 
  14.         ret = ret.concat(modules) 
  15.       }) 
  16.       // 去除node_modules中的文件 
  17.       ret = ret.filter(item => item.indexOf('node_modules') < 0) 
  18.       resolve(ret) 
  19.     }) 
  20.   }) 
  21. }

通過這一步,我們可以拿到項目中,所有打包依賴的文件。

2.獲取項目中所有的文件

通過glob,我們可以獲取所有的文件:

 
 
 
 
  1. function getAllFilesInSrc () { 
  2.   const pattern = './src/**' 
  3.   return new Promise((resolve, reject) => { 
  4.     glob(pattern, { 
  5.       nodir: true 
  6.     }, (err, files) => { 
  7.       const ret = files.map(item => { 
  8.         return item.replace('./src', '.') 
  9.       }) 
  10.       resolve(ret) 
  11.     }) 
  12.   }) 
  13. }

3.將兩個文件數(shù)組進(jìn)行對比,然后進(jìn)行刪除等操作:

將兩個數(shù)組進(jìn)行對比,沒有出現(xiàn)在依賴中的文件,就是冗余文件。我們可以一鍵刪除

 
 
 
 
  1. findSrcModules().then(ret => { 
  2.   getAllFilesInSrc().then(allFiles => { 
  3.     const unUsed = allFiles.filter(item => { 
  4.       return ret.indexOf(item) < 0 
  5.     }) 
  6.     const join = p => path.join('./src', p) 
  7.     unUsed.forEach(file => { 
  8.       shelljs.rm(join(file)) 
  9.     }) 
  10.   }) 
  11. })

分析第三方依賴

根據(jù)上述冗余文件的思路,我們同樣可以對第三方依賴進(jìn)行處理,大致思路如下

  • 獲取所有包含node_modules的依賴
  • 將文件名進(jìn)行截取、去重。獲取到所有的依賴
  • 與package.json進(jìn)行對比,拿到?jīng)]有使用的依賴
  • 將對比結(jié)果進(jìn)行分析,將不想使用的依賴保存下來
  • 再次查找stat.json,查找該依賴的reson字段,獲取再哪里引用了該依賴,進(jìn)行輸出
  • 將依賴進(jìn)行手動替換、刪除等操作

可以說,拿到了所有依賴及依賴關(guān)系,我們可以很靈活的對其進(jìn)行處理,拿到我們想要的結(jié)果。

該功能后續(xù)也會更新到webpack-unused-files中去。

優(yōu)化打包大小

讓人震驚的是,整個項目由于種種原因,打包后的大小有近20M的大??!雖然并不是TO C項目,并且針對頁面進(jìn)行了代碼拆分和懶加載,但是作為一個“合格的前端”,這種現(xiàn)象是一定要修改的(沒錯?。T撊绾蜗率帜??一個個的翻代碼,看看我們都引用了什么大依賴,看哪些項目過大未免太復(fù)雜了。我們看看webpack給我嗎提供了什么方案:

1.展示打包結(jié)果

我們知道,在webpack打包結(jié)束后,會自動在控制臺顯示打包結(jié)果。同時,他也提供了輸出依賴及大小的功能,我們執(zhí)行以下參數(shù), 便可將所有的依賴進(jìn)行展示,并且看到他們的大小了。

 
 
 
 
  1. webpack --display-modules --sort-modules-by size

結(jié)果類似這樣:

我們可以很快的定位到排名前幾的js文件或者第三方依賴,決定該如何對其進(jìn)行處置。

2.可視化分析依賴

webpack提供了一個功能,將打包的所有依賴文件以及關(guān)系,以json格式進(jìn)行輸出:

 
 
 
 
  1. webpack --profile --json > stats.json

這是我們整篇文章的一個基礎(chǔ),很多人基于此封裝了不少可視化分析的工具,可以直觀的看到各個

文件、chunk之間的依賴關(guān)系以及大小等,快速定位到大文件、大模塊

webpack analyse

webpack chart

3.優(yōu)化方案

通過以上兩種方法,我們可以很好的對內(nèi)容文件和依賴進(jìn)行定位和分析,針對打包大小的優(yōu)化方案網(wǎng)上已經(jīng)有很多了,在此不再進(jìn)行贅述,提供幾個思路及參考:

  • CommonsChunkPlugin提取公共代碼
  • dll-plugin進(jìn)行大文件單獨(dú)打包,緩存
  • 刪除無用的依賴(后面會提到
  • 選擇性的棄用一些依賴
  • 代碼壓縮
  • babel-polyfill
  • Scope Hoisting

優(yōu)化打包時間

針對打包時間的優(yōu)化的文章其實(shí)也很多了,我們在此僅提供一些思路。我們主要提一點(diǎn),通過構(gòu)建會發(fā)現(xiàn),項目中引用了大量的svg圖標(biāo)以及國旗圖標(biāo),每次在靜態(tài)資源處理中,打包時間就會變的特別慢。

我們在項目中使用的svg-sprite-loader,自動將各個svg圖標(biāo)進(jìn)行svg-spirte。但是我們知道,這些圖標(biāo)一旦引用,我們很少進(jìn)行修改。尤其是像國旗圖標(biāo)這種,但是每次構(gòu)建我們都需要進(jìn)行重復(fù)打包。因此,我們可以提前把這些圖標(biāo)進(jìn)行svg-sprite。推薦一個網(wǎng)站,將各種svg圖標(biāo)提前進(jìn)行sprite并自動進(jìn)行引用:

iconmoon

日常打包時間優(yōu)化點(diǎn)

  • externals 避免打包大的第三方依賴
  • dll-plugin 預(yù)打包第三方依賴
  • happypack 多進(jìn)程處理,緩存
  • 緩存與增量構(gòu)建
    • babel-loader?cacheDirectory
    • webpack cache:true
  • 減少構(gòu)建搜索或編譯路徑 alias resolve
  • 具象打包的范圍 include exclude

總結(jié)

通過對webpack輸出依賴關(guān)系的json的分析,我們可以直觀的拿到以下數(shù)據(jù):

  • 所有依賴文件及其大小
  • 每個依賴文件是被哪些文件引用的
  • 項目依賴的第三方依賴

通過這些數(shù)據(jù),我們可以很方便的對現(xiàn)有項目進(jìn)行優(yōu)化。

生命不息,倒騰不止。讓我們對所有的惡心代碼說再見!


分享名稱:借助webpack對項目進(jìn)行分析優(yōu)化
文章地址:http://m.5511xx.com/article/djhsgoc.html