成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

借助webpack對(duì)項(xiàng)目進(jìn)行分析優(yōu)化

開發(fā) 前端
進(jìn)入公司之后,接手的便是前人留下來的一個(gè)大項(xiàng)目。慶幸的是整個(gè)項(xiàng)目擁有完善的產(chǎn)品功能文檔,但是由于項(xiàng)目過于龐大,老舊。包含了打包過慢,冗余文件過多等諸多問題。因此在此篇文章中,我們介紹一下我是如何配合webpack一步步進(jìn)行分析,將項(xiàng)目進(jìn)行優(yōu)化的。

[[226536]]

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

同時(shí)我針對(duì)思路封裝了一個(gè)webpack-unused-files,用于查找項(xiàng)目中的冗余文件,歡迎試用并star。

問題

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

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

刪除冗余文件

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

1.獲取項(xiàng)目依賴的所有文件

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

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

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

  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.   })  

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

2.獲取項(xiàng)目中所有的文件

通過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.   })  

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

將兩個(gè)數(shù)組進(jìn)行對(duì)比,沒有出現(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.  
  8.     unUsed.forEach(file => {  
  9.       shelljs.rm(join(file))  
  10.     })  
  11.   })  
  12. }) 

分析第三方依賴

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

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

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

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

優(yōu)化打包大小

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

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

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

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

結(jié)果類似這樣: 

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

2.可視化分析依賴

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

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

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

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

webpack analyse 

webpack chart 

3.優(yōu)化方案

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

優(yōu)化打包時(shí)間

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

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

iconmoon

日常打包時(shí)間優(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é)

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

  • 所有依賴文件及其大小
  • 每個(gè)依賴文件是被哪些文件引用的
  • 項(xiàng)目依賴的第三方依賴

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

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

原文鏈接:http://callmedadaxin.github.io/2018/04/13/analyse-project-with-webpack/

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2020-09-19 21:26:56

webpack

2021-05-09 22:48:40

SQL數(shù)據(jù)庫變量

2023-01-30 08:30:09

Tomcat性能優(yōu)化

2009-01-06 09:23:00

VLAN網(wǎng)絡(luò)管理

2023-07-13 11:24:14

SQL優(yōu)化賦值

2022-03-10 09:00:42

webpack配置項(xiàng)檢驗(yàn)庫函數(shù)

2023-02-26 01:00:12

索引優(yōu)化慢查詢

2017-07-28 11:31:59

iOS結(jié)構(gòu)優(yōu)化項(xiàng)目

2019-03-15 15:00:49

Webpack構(gòu)建速度前端

2010-05-17 17:09:29

Mysql LIMIT

2010-02-23 13:33:49

Python測試套件

2011-04-14 09:05:07

ExcelMySQL數(shù)據(jù)

2010-01-28 14:04:35

C++鏈表

2010-05-20 14:42:02

MySQL數(shù)據(jù)

2023-05-05 19:16:22

Python數(shù)據(jù)清洗

2021-09-06 06:45:06

Webpack優(yōu)化MindMaster

2017-07-11 15:50:11

前端webpack2優(yōu)化

2009-12-04 09:32:00

Web Setup P

2010-04-19 17:09:30

Oracle sql

2016-09-13 19:51:01

移動(dòng)應(yīng)用圖片流量優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91亚洲国产成人久久精品网站 | 国产一级特黄aaa大片评分 | 精品久久久久久久久久久 | 蜜臀av日日欢夜夜爽一区 | 中文在线一区二区 | 在线观看黄免费 | 99re视频| 日韩欧美精品 | 亚洲天堂一区 | 涩涩鲁亚洲精品一区二区 | 综合色导航 | 国产黄色大片网站 | 成人免费激情视频 | 91视频大全 | 黑人巨大精品欧美一区二区一视频 | 成人免费观看男女羞羞视频 | 亚洲精品国产综合区久久久久久久 | 九九九色| 国产欧美精品一区二区三区 | 国产内谢| 欧美日韩专区 | 天天拍天天色 | 亚洲中午字幕 | 午夜av免费| 性一交一乱一透一a级 | 精品国产一区二区三区日日嗨 | 成人在线免费观看 | 成人国产精品久久 | 国产一级视频在线观看 | 久久精品黄色 | 91免费视频观看 | 国产高清视频在线观看 | 欧美高清hd | 日日噜噜噜夜夜爽爽狠狠视频97 | 欧美成年视频 | 九色在线观看 | 欧美一区二区三区视频在线观看 | 91资源在线 | 成人二区| 高清黄色| 91精品国产91久久久久久吃药 |