成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

Me_Kun / 3537人閱讀

摘要:由于項(xiàng)目的不斷擴(kuò)大,只會(huì)影響我們定位功能和問題的速度,因此對(duì)冗余文件進(jìn)行清理,是很重要的。我們?cè)陧?xiàng)目中使用的,自動(dòng)將各個(gè)圖標(biāo)進(jìn)行。

進(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í)間過長(zhǎng)

刪除冗余文件

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

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

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

{
  ...
  chunks: [{
    name: "chunk-name",
    modules: [
      // 每個(gè)chunk中所有的依賴文件
    ]
  }]
  ...
}

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

/**
 * 查詢依賴的模塊
 */
function findSrcModules () {
  return new Promise((resolve, reject) => {
    fs.readFile(statPath, (err, data) => {
      if (err) return
      const json = JSON.parse(data)
      const assetsList = json.chunks
      let ret = []
      // 拿到所有chunk的所有依賴文件
      assetsList.forEach(chunk => {
        const modules = chunk.modules.map(item => item.name)
        ret = ret.concat(modules)
      })
      // 去除node_modules中的文件
      ret = ret.filter(item => item.indexOf("node_modules") < 0)
      resolve(ret)
    })
  })
}

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

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

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

function getAllFilesInSrc () {
  const pattern = "./src/**"

  return new Promise((resolve, reject) => {
    glob(pattern, {
      nodir: true
    }, (err, files) => {
      const ret = files.map(item => {
        return item.replace("./src", ".")
      })
      resolve(ret)
    })
  })
}
3.將兩個(gè)文件數(shù)組進(jìn)行對(duì)比,然后進(jìn)行刪除等操作:

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

findSrcModules().then(ret => {
  getAllFilesInSrc().then(allFiles => {
    const unUsed = allFiles.filter(item => {
      return ret.indexOf(item) < 0
    })
    const join = p => path.join("./src", p)

    unUsed.forEach(file => {
      shelljs.rm(join(file))
    })
  })
})
分析第三方依賴

根據(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ì)頁(yè)面進(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)行展示,并且看到他們的大小了。

webpack --display-modules --sort-modules-by size

結(jié)果類似這樣:

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

2.可視化分析依賴

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

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è)思路及參考:

CommonsChunkPlugin提取公共代碼

dll-plugin進(jìn)行大文件多帶帶打包,緩存

刪除無(wú)用的依賴(后面會(huì)提到

選擇性的棄用一些依賴

代碼壓縮

babel-polyfill

Scope Hoisting

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

針對(duì)打包時(shí)間的優(yōu)化的文章其實(shí)也很多了,我們?cè)诖藘H提供一些思路。我們主要提一點(diǎn),通過構(gòu)建會(huì)發(fā)現(xiàn),項(xiàng)目中引用了大量的svg圖標(biāo)以及國(guó)旗圖標(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)行修改。尤其是像國(guó)旗圖標(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ì)所有的惡心代碼說再見!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94203.html

相關(guān)文章

  • 用十分之一的構(gòu)建時(shí)間做一場(chǎng)頁(yè)面靜態(tài)資源依賴分析

    摘要:不直接使用的原因很簡(jiǎn)單首先構(gòu)建一次實(shí)在太慢了,特別是有幾十個(gè)頁(yè)面存在的情況下,另一個(gè)原因是我只是想拿到資源依賴,我根本不想對(duì)整個(gè)前端進(jìn)行一次構(gòu)建,也不想生成任何。這就達(dá)到了本文題目中目的,用十分之一的構(gòu)建時(shí)間做一場(chǎng)頁(yè)面靜態(tài)資源依賴分析。原文鏈接 作者:梯田 前言: 所謂【靜態(tài)資源依賴分析】,指的是可以通過分析頁(yè)面資源后,可以以 json 數(shù)據(jù)或者圖表的方式拿到頁(yè)面資源間的依賴關(guān)系。 比如 c...

    B0B0 評(píng)論0 收藏0
  • 基于webpack4的VUE多頁(yè)腳手架

    摘要:另外備注一部分參數(shù)的說明折疊有助于文檔樹中文本節(jié)點(diǎn)的空白區(qū)域?qū)M(jìn)行壓縮默認(rèn)默認(rèn)按照不同文件的依賴關(guān)系來排序。敲黑板講重點(diǎn)的當(dāng)然目前這部分的文檔在官網(wǎng)還不是很全,所以這里我們參考了印記中文的說明文檔,指優(yōu)化模塊。 鏈接 寫在前面 為什么要自己手寫一個(gè)腳手架? 如何去思考遇到的問題? 正文 鏈接 原文鏈接 github whale-vue ——寫在前面 1、為什么要自己手寫...

    張金寶 評(píng)論0 收藏0
  • 從零到一,新建webpack工程

    摘要:指定啟用例如上述代碼,就使用和處理了除了以外的。設(shè)置當(dāng)前的為,同樣這個(gè)配置也可以寫在中。設(shè)置目錄刪除注釋去除空格去除屬性引號(hào)復(fù)制靜態(tài)目錄將所以可能被請(qǐng)求的靜態(tài)文件,分別放在目錄下。結(jié)語(yǔ)本次從零到一,新建了一個(gè)腳手架。 react-sample-javascript 為了實(shí)現(xiàn)一個(gè)可定制化高的react工程,我們往往會(huì)自己搭建一個(gè)react工程。所以本文會(huì)從零開始搭建一個(gè)react腳手架工...

    Code4App 評(píng)論0 收藏0
  • webpack優(yōu)化

    摘要:使用要給項(xiàng)目構(gòu)建接入動(dòng)態(tài)鏈接庫(kù)的思想,需要完成以下事情把網(wǎng)頁(yè)依賴的基礎(chǔ)模塊抽離出來,打包到一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫(kù)中去。接入已經(jīng)內(nèi)置了對(duì)動(dòng)態(tài)鏈接庫(kù)的支持,需要通過個(gè)內(nèi)置的插件接入,它們分別是插件用于打包出一個(gè)個(gè)單獨(dú)的動(dòng)態(tài)鏈接庫(kù)文件。 webpack優(yōu)化 查看所有文檔頁(yè)面:全棧開發(fā),獲取更多信息。原文鏈接:webpack優(yōu)化,原文廣告模態(tài)框遮擋,閱讀體驗(yàn)不好,所以整理成本文,方便查找。 ...

    ChanceWong 評(píng)論0 收藏0
  • 基于 react, redux 最佳實(shí)踐構(gòu)建的 2048

    摘要:最佳實(shí)踐一個(gè)文件一個(gè)組件。,這是包含的是無(wú)副作用的純函數(shù)式計(jì)算狀態(tài)操作的函數(shù)。,的啟動(dòng)腳本,啟動(dòng)開發(fā)模式,項(xiàng)目打包,運(yùn)行單元測(cè)試等等。每次代碼推送到之前也會(huì)執(zhí)行所有單元測(cè)試用例,全部通過才可以繼續(xù)推送。,首次安裝依賴包之后生成的文件。 前段時(shí)間 React license 的問題鬧的沸沸揚(yáng)揚(yáng),搞得 React 社區(qū)人心惶惶,好在最終 React 團(tuán)隊(duì)聽取了社區(qū)意見把 license 換...

    Eidesen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<