淺談webpack優化

来源:https://www.cnblogs.com/colima/archive/2018/04/06/8726874.html
-Advertisement-
Play Games

webpack優化方案 1. 優化開發體驗 1-1. 加快構建速度 ① 縮小文件搜索範圍 由於 Loader 對文件的轉換操作很耗時,需要讓儘可能少的文件被 Loader 處理,用include和exclude去縮小; resolve.modules用於配置 Webpack 去哪些目錄下尋找第三方模 ...


webpack優化方案

1. 優化開發體驗

    1-1. 加快構建速度

     ① 縮小文件搜索範圍

  • 由於 Loader 對文件的轉換操作很耗時,需要讓儘可能少的文件被 Loader 處理,用include和exclude去縮小;
  • resolve.modules用於配置 Webpack 去哪些目錄下尋找第三方模塊:[path.resolve(__dirname, 'node_modules')](根目錄下);
  • resolve.mainFields用於配置第三方模塊使用哪個入口文件:['mian'];
  • resolve.alias配置項通過別名來把原導入路徑映射成一個新的導入路徑:[path.resolve(__dirname, './node_modules/react/dist/react.min.js')];
  • resolve.extensions用於配置在嘗試過程中用到的尾碼列表:['js', 'json'];
  • module.noParse配置項可以讓 Webpack 忽略對部分沒採用模塊化的文件的遞歸解析處理:[/react\.min\.js$/]; 

     ② HappyPack

  • HappyPack 的核心原理就是把loader轉換任務分解到多個進程去並行處理,從而減少了總的構建時間;

     ③ ParallelUglifyPlugin 

  • 壓縮js代碼需要先把代碼解析成用 Object 抽象表示的 AST 語法樹,再去應用各種規則分析和處理 AST;
  • ParallelUglifyPlugin會開啟多個子進程,把對多個文件的壓縮工作分配給多個子進程去完成,每個子進程其實還是通過 UglifyJS 去壓縮代碼,但是變成了並行執行;       

    1-2. 提升開發效率

     ① 自動刷新(webpack 模塊負責監聽文件,webpack-dev-server 模塊則負責刷新瀏覽器)

  • 文件監聽(--watch或watch: true),原理是定時的去獲取這個文件的最後編輯時間,每次都存下最新的最後編輯時間,如果發現當前獲取的和最後一次保存的最後編輯時間不一致,就認為該文件發生了變化;
  • 優化文件監聽:watchOptions: {ignored: /node_modules/};
  • 自動刷新原理是往要開發的網頁中註入代理客戶端代碼,通過代理客戶端向DevServer 發起的 WebSocket 連接去刷新整個頁面;
  • devServer.inline是用來控制是否往 Chunk 中註入代理客戶端的,預設會註入;在你關閉了 inline 後,DevServer 會自動地提示你通過新網址 http://localhost:8080/webpack-dev-server/ 去訪問;

     ② 模塊熱替換

  • 模塊熱替換的原理和自動刷新原理類似,都需要往要開發的網頁中註入一個代理客戶端用於連接 DevServer 和網頁, 不同在於模塊熱替換獨特的模塊替換機制;

2. 優化輸出質量

    2-1. 減少載入時間

     ① 區分環境

  • process.env.NODE_ENV

     ② 壓縮代碼

     ③ CDN加速

  • 針對 HTML 文件:不開啟緩存,把 HTML 放到自己的伺服器上,而不是 CDN 服務上,同時關閉自己伺服器上的緩存。自己的伺服器只提供 HTML 文件和數據介面;
  • 針對靜態的 JavaScript、CSS、圖片等文件:開啟 CDN 和緩存,上傳到 CDN 服務上去,同時給每個文件名帶上由文件內容算出的 Hash 值;

     ④ tree shaking

  • 讓 Tree Shaking 正常工作的前提是交給 Webpack 的js代碼必須是採用 ES6 模塊化語法的, 因為 ES6 模塊化語法是靜態的(導入導出語句中的路徑必須是靜態的字元串,而且不能放入其它代碼塊中),這讓 Webpack 可以簡單的分析出哪些export的被import過了

     ⑤ 提取公共代碼(CommonsChunkPlugin)

     ⑥ 按需載入

    2-2. 提升流暢度

     ① Prepack

  • 通過 Babel 把 JavaScript 源碼解析成抽象語法樹(AST),以方便更細粒度地分析源碼;
  • Prepack 實現了一個 JavaScript 解釋器,用於執行源碼。藉助這個解釋器 Prepack 才能掌握源碼具體是如何執行的,並把執行過程中的結果返回到輸出中。

     ② Scope Hoisting

 

webpack構建流程

  1. 初始化(啟動構建,讀取併合並配置參數,載入plugin,實例化compiler)
  2. 編譯(entry出發,針對每個module引用loader解析,依次找到module依賴,然後遞歸)
  3. 輸出(對編譯後的module組合成chunk,轉換成文件,輸出)
  4. 文件變化,轉到step2;

    


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

-Advertisement-
Play Games
更多相關文章
  • 定義: 保證一個對象(類)僅有一個實例,並提供一個訪問它的全局訪問點; 實現原理: 利用閉包來保持對一個局部變數的引用,這個變數保存著首次創建的唯一的實例; 主要用於: 全局緩存、登錄浮窗等只需要唯一一個實例的時候; Part1、命名空間的管理員開發中經常會遇到不同的人定義的變數使用的單詞可能會重覆 ...
  • display的所有屬性 下麵就display的重要屬性進行講解,並配合一些相關的例子 基本屬性 display: none none 是 CSS 1 就提出來的屬性,將元素設置為none的時候既不會占據空間,也無法顯示,相當於該元素不存在。 該屬性可以用來改善重排與重繪,同時我也經常用它來做模態窗 ...
  • 使用遞歸函數必須要符合兩個條件: 1、 在每一次調用自己時,必須是(在某種意義上)更接近於解; 這句話怎麼理解? 大家家裡都有樓梯吧?比如從一樓走到二樓,那麼我們的起點是一樓,目的地是二樓,當你往上每走一個臺階是不是越接近二樓,也就是越接近目的地。 因此這句話可以這樣理解:函數每一次調用自己時... ...
  • 在 JavaScript 中 this 常常指向方法調用的對象,但有些時候並不是這樣的,本文將詳細解讀在不同的情況下 this 的指向。 一、指向 window: 在全局中使用 this,它將會指向全局對象,因為瀏覽器中運行的 JavaScript 的全局對象預設為 window, 所以,此時 ... ...
  • 背景 項目 :移動端H5電商項目 痛點 :慢!!! 初始方案 :最基本的圖片懶載入,靜態資源放到cdn,predns等等已經都做了。但是還是慢,慢在哪? 顯而易見的原因 :由於前後端分離,所有的數據都由介面下發,之後根據模板渲染頁面。也就是說,我們需要先載入js,等到js載入完畢之後,請求介面,介面 ...
  • 只要調用函數進行執行,都必須加括弧。 函數是一個對象,函數名是指向這個對象的指針。 函數名後面加上括弧就表示立即調用執行這個函數裡面的代碼。 使用不帶圓括弧的函數是訪問函數的指針,而非調用函數。 函數名後面加括弧,就直接執行函數返回值。 函數名後面不加括弧,表示函數名賦值給click等的事件,觸發c ...
  • 最近做小程式開發,出於練手,也是工作需要,就做了個微信小程式的類似於酒店預訂的日曆插件。先上圖; 這個插件分為上下兩部分,上邊是tab欄,會根據當前的日期自動定位到當前,並展示以後7天的日期,下邊為內容展示,隨tab欄變化而變化。思路:首先用`new Data()`時間對象初始化時間,獲取當前的日期 ...
  • 原文地址: "A cartoon guide to Flux by Lin Clark" Flux在目前web開發中最受歡迎也較不被人理解,本文會以簡單易懂的方式解釋它。 出現問題 首先,我要聲明Flux所解決的基本問題。Flux是一種幫助你處理數據的模式。Flux和React都由Facebook開 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...