Webpack5構建性能優化:構建耗時從150s到60s再到10s

来源:https://www.cnblogs.com/Jcloud/archive/2023/05/11/17390152.html
-Advertisement-
Play Games

作者:京東科技 牛志偉 近期對Webpack5構建性能進行了優化,構建耗時從150s到60s再到10s,下麵詳細講解下優化過程。 優化前現狀 1.歷史項目基於Vue3 + Webpack5技術棧,其中webpack配置項由開發者自己維護(沒有使用@vue/cli-service),並且做了環境分離。 ...


作者:京東科技 牛志偉

近期對Webpack5構建性能進行了優化,構建耗時從150s到60s再到10s,下麵詳細講解下優化過程。

優化前現狀

1.歷史項目基於Vue3 + Webpack5技術棧,其中webpack配置項由開發者自己維護(沒有使用@vue/cli-service),並且做了環境分離。

2.項目體量大約5000個modules左右,每次本地構建build時耗時約150s左右。

優化細節

環境分離

之前已經設計了環境分離,但是一些優化細節沒有處理好:

•基礎配置文件:webpack.base.js,主要配置了基礎的loader和plugin等

•本地開發配置文件:webpack.dev.js,主要配置了devServer和樣式、圖片資源loader等,並merge基礎配置

•生產環境配置文件:webpack.prod.js,主要配置了樣式、圖片資源loader以及資源壓縮和樣式抽離等,並merge基礎配置

優化點:

•熱載入相關配置,從base移到dev配置中,生產環境中不需要熱更新

new webpack.HotModuleReplacementPlugin()

•dev配置中devtool類型選擇,inline-source-map修改為eval-cheap-module-source-map,map文件使用內聯方式構建速度更快。

devtool: 'eval-cheap-module-source-map'

•filename調整:js/[name].[fullhash].js去掉hash,本地開發環境啟用熱更新,不需要hash(生產環境需要hash刷新緩存)

output: {
    filename: 'js/[name].js',
    path: path.resolve(__dirname, '../dist'),
    publicPath: '/',
}

持久化緩存

base配置中開啟持久化緩存(Webpack5新特性),首次構建耗時增加15%左右,但是二次構建耗時減少90%左右

cache: {
    type: 'filesystem'
}

Loader相關優化

•儘量減少loader,比如使用Asset modules(Webpack5新特性)替換url-loader、file-loader、raw-loader

// 字體和小於8kb的圖片
{
    test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
    type: 'asset',
    parser: {
        dataUrlCondition: {
            maxSize: 8 * 1024,
        },
    }
}
// 圖片資源
{
    test: /\.(png|svg|jpg|gif|cur)$/,
    type: 'asset/resource',
    exclude: [path.resolve(__dirname, '../../../assets/svg')],
}

•thread-loader耗時任務開啟多線程

{
    test: /\.vue$/,
    use: ['thread-loader', 'vue-loader'],
},
{
    test: /\.(t|j)s$/,
    exclude: /node_modules/,
    use: ['thread-loader', 'babel-loader'],
},
{
    test: /\.(sa|sc|c)ss$/,
    use: ['thread-loader', 'style-loader', 'css-loader', 'sass-loader'
},

•esbuild-loader替換babel-loader(由於改動較大,沒有嘗試)

Plugin相關優化

•使用speed-measure-webpack-plugin分析各個plugin、loader編譯時間

•儘量減少plugin,比如HotModuleReplacementPlugin只在dev開啟

•升級老舊plugin,比如terser-webpack-plugin版本從2升級到5,構建性能直接提升50%左右,具體原因有瞭解的同學可以打在評論區。

優化後效果

•不啟用緩存情況下耗時從150s減少到60s以內

•優化後speed-measure-webpack-plugin編譯速度分析

•啟用持久化緩存情況下,二次構建減少到10s以內

Webpack5總結

以下是從基礎、進階、優化、插件使用以及打包原理幾個方面做的Webpack5總結,有遺漏之處歡迎評論留言討論


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 京喜APP早期開發主要是快速原生化迭代替代原有H5,提高用戶體驗,在這期間也積累了不少性能問題。之後我們開始進行一些性能優化相關的工作,本文主要是介紹京喜圖片庫相關優化策略以及關於圖片相關的一些關聯知識。 ...
  • 廣告是App開發者最常用的流量變現方法之一,當App擁有一定數量用戶時,開發者就需要考慮如何進行流量變現,幫助App實現商業可持續增長。 鯨鴻動能流量變現服務是廣告服務依托華為終端強大的平臺與數據能力為開發者提供的App流量變現服務,開發者通過該服務可以在自己的App中獲取並向用戶展示精美的、高價值 ...
  • 源碼 https://github.com/webabcd/flutter_demo 作者 webabcd 一統天下 flutter - 插件: flutter 使用 web 原生控制項,並做數據通信 示例如下: lib\plugin\plugin2.dart /* * 插件 * 本例用於演示 flu ...
  • 一、本文想給你聊的東西包含一下幾個方面:(僅限於es6之前的語法哈,因為es6裡面class這關鍵字用上了。。) 1.原型是啥?原型鏈是啥? 2.繼承的通用概念。 3.Javascript實現繼承的方式有哪些? 二、原型是啥?原型鏈是啥? 1.原型是函數本身的prototype屬性。 首先js和ja ...
  • 背景: 本來項目開發系統防掛機功能,在其餘游覽器中均可以使用。但是呢在蘋果的safair游覽器中會出現幾率失效,最後經過排查發現是蘋果的墓碑機制導致。即:此標簽頁活躍,其他標簽頁假死。然後就導致防掛機失效了。 原理: 假如當前游覽器中有3個標簽頁分別是A,B,C,每個標簽頁都有倒計時。正常情況下,每 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Vue3+TS(uniapp)手擼一個聊天頁面 前言 最近在自己的小程式中做了一個智能客服,API使用的是雲廠商的API,然後聊天頁面...嗯,找了一下關於UniApp(vite/ts)版本的好像不多,有一個官方的但其中的其他代碼太多了, ...
  • 本系列內容為JS全解析,為千鋒教育資深前端老師獨家創作 致力於為大家講解清晰JavaScript相關知識點,含有豐富的代碼案例及講解。如果感覺對大家有幫助的話,可以【點個關註】持續追更~ this指向(掌握) this 是一個關鍵字,是一個使用在作用域內的關鍵字 作用域分為全局作用域和局部作用域(私 ...
  • 1、深拷貝 1.1、概念 對象的深拷貝是指其屬性與其拷貝的源對象的屬性不共用相同的引用(指向相同的底層值)的副本。 因此,當你更改源或副本時,可以確保不會導致其他對象也發生更改;也就是說,你不會無意中對源或副本造成意料之外的更改。 在深拷貝中,源和副本是完全獨立的。深拷貝與其源對象不共用引用,所以對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...