webpack4和5的區別

一、性能方面

1、webpack5有更好的性能表現。在壓縮方面,webpack5支持多線程壓縮,壓縮速度更快,而webpack4會存在產生瓶頸的情況。

2、模塊傳遞中做了優化。webpack4中,辦法是儘可能的壓縮代碼,優化優化,webpack5則使用了更好的模塊樹傳遞的方式,將每個模塊構建前的 meta 信息進行了緩存,嘗試減少不必要的構建。

3、webpack5默認使用 webassembly ,webpack4 則默認使用 jsonp。webassembly 比 jsonp 更快,而且據說還會消耗更少的內存。


// webpack4
module.exports = {
  // ...
  optimization: {
    minimize: true,
    minimizer: [
      // terser-webpack-plugin
    ]
  }
};

// webpack5
module.exports = {
  // ...
  optimization: {
    minimize: true,
    minimizer: [
      new WebpackMinimizerPlugin({
        minimizerOptions: {
          // terser options
        },
      }),
    ],
  },
};

二、持久緩存方面

1、webpack5默認開啟持久緩存,可以大大減少構建時間。而webpack4需要配置緩存機制,能夠減少構建時間,但並不會減短。

2、webpack5使用持久化緩存,能存儲中間狀態變化。webpack5構建完成後會保存所有模塊及其依賴關係、loader/插件等的中間狀態。如果下次構建時,緩存中有相同的模塊,則可跳過運行相應的加載器 / 插件等,直接使用緩存,這麼做大量分享文件不需要重新構建,提高了構建緩存命中率。


// webpack4
module.exports = {
  // ...
  cache: true,
};

// webpack5
module.exports = {
  // ...
  cache: {
    type: 'memory'
  },
};

三、Tree-Shaking方面

1、webpack5改善了 Tree Shaking 的性能。webpack5重構了 Tree Shaking 的算法,以此更快的找出哪些代碼在構建時未使用,從而更有效地減少構建輸出。

2、webpack5默認支持 pure 模塊標記,這是一個新 feature 可以用戶在自己的代碼中進行註解,確定模塊的 sideeffect,從而更好的告訴 webpack 如何進行 Tree Shaking。


// webpack4
import { animate } from './animation.js';
export function layout() {
  animate(); // Tree Shaking 可以發現這裡沒有使用
}

// webpack5
import { animate } from './animation.js';
export function layout() {
  animate({ // 你想用有效代碼
    speed: 1000, // 它會重複並被 Tree Shaking 消除
    height: 500, // 在 Tree Shaking 之前不會發生任何改變
    maxWidth: 200 // 除非使用 pure:false 標記地址已知的 side-effect
  });
}

四、asset模塊查找方式

1、webpack5通過資源解析時候有更多的可能性發現資源,所以 webpack 5 導入資源的方式發生了一點變化,默認情況下它現在會從當前目錄和父級目錄中的 ‘./node_modules’ 解析文件。這樣做可以為你的開發帶來一些便利,不過也可能會影響某些遺留代碼庫,你需要小心對待。

2、webpack5使用了新型 asset 模塊類型來更好地管理文件模塊。在webpack5中,asset資源(如圖片、視頻、字體)對應了一個新的輸出模塊類型:asset module type。這個新的類型直接放回一個 file URL,而不是通過 JavaScript 解析這個模塊。這樣可以直接從 HTML / CSS 中加載文件,是在新應用程序中不錯的替代方案。


// webpack4
module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif|svg)$/i,
        use: [
          {
            loader: 'file-loader',
          },
        ],
      },
    ],
  },
};

// webpack5
module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif|svg)$/i,
        type: 'asset/resource',
      },
    ],
  },
};

五、細節功能升級方面

1、webpack5新增了一個ids: ‘deterministic’的選項,它允許每次打包時生成可預測的短號,但在不同的編譯中仍可以實現長期緩存。使用此選項還支持通過名稱提供的模塊的可讀性優化。

2、webpack5增加了一些新的鉤子,其中最重要的是PersistentCache插件。該插件可以將緩存持久化到磁盤上,並在每次重新構建時減少Webpack重新生成信息和AST的成本。

3、webpack5廢棄了一些功能,例如:Node v8支持,廢棄了require.include,廢棄了動態import()中的介入。


// webpack4
new HtmlWebpackPlugin({
  parser: 'html-parser'
});

// webpack5
new HtmlWebpackPlugin({
  parser: {
    parse: htmlParser.parse
  }
});

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/271978.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 00:07
下一篇 2024-12-17 00:07

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字符命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟件開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • Python與C語言的區別和聯繫

    Python與C語言是兩種常用的編程語言,雖然兩者都可以用於編寫軟件程序,但是它們之間有很多不同之處。本文將從多個方面對Python與C語言的區別和聯繫進行詳細的闡述。 一、語法特…

    編程 2025-04-28
  • Python中深拷貝和淺拷貝的區別

    本文將從以下幾個方面對Python中深拷貝和淺拷貝的區別做詳細的闡述,包括:拷貝的含義、變量和對象的區別、淺拷貝的示例、深拷貝的示例、可變對象和不可變對象的區別、嵌套的數據結構以及…

    編程 2025-04-28

發表回復

登錄後才能評論