Webpack 打包优化:去重与提取公共模块

Webpack 是目前前端开发中最常用的打包工具之一。在开发过程中,随着项目规模不断扩大,打包后的文件体积也会不断增大,影响页面加载速度。为了优化打包后的文件体积,我们可以采用去重和提取公共模块的方式。

去重

在 Webpack 打包过程中,可能会出现同一个模块被多次打包的情况。这会导致打包后的文件体积增大,影响页面加载速度。为了避免这种情况的发生,我们可以采用去重的方式。

使用 optimization.splitChunks 配置项

Webpack 4 中提供了 optimization.splitChunks 配置项,可以用来去重和提取公共模块。该配置项有以下几个选项:

  • chunks:表示需要提取哪些 chunk,默认为 async,表示只提取异步加载的 chunk。
  • minSize:表示提取出来的公共模块的最小体积,默认为 30000。
  • maxSize:表示提取出来的公共模块的最大体积,默认为 0,表示不限制。
  • minChunks:表示一个模块被多少个 chunk 引用时才会被提取,默认为 1。
  • maxAsyncRequests:表示异步加载的 chunk 中,最多有多少个 chunk 可以同时加载,默认为 5。
  • maxInitialRequests:表示入口 chunk 中,最多有多少个 chunk 可以同时加载,默认为 3。
  • automaticNameDelimiter:表示分离出来的 chunk 名称中的连接符,默认为 ~。
  • name:表示分离出来的 chunk 名称,默认为 true,表示自动生成名称。

下面是一个示例:

----- ---- - ----------------

-------------- - -
  ------ -
    ---- ---------------
    ------- --------- ------------
  --
  ------- -
    --------- ------------------------
    ----- ----------------------- -------
  --
  ------------- -
    ------------ -
      ------- ------
      ----- --------
    -
  -
--

上面的示例中,我们将 React 和 React-DOM 作为公共模块提取出来,并将它们打包到 vendor.[chunkhash].js 中。这样,每次打包时,vendor.[chunkhash].js 中的内容都会根据文件内容生成不同的 hash 值,避免了浏览器缓存的问题。

使用 DllPlugin 和 DllReferencePlugin

另一种去重的方式是使用 DllPlugin 和 DllReferencePlugin。这两个插件可以将第三方库打包成一个单独的文件,并在后续的打包过程中引用该文件,避免了重复打包的问题。

首先,我们需要创建一个名为 vendor.dll.js 的文件,用于打包第三方库。在该文件中,我们需要指定需要打包的库和输出文件的路径。

----- ---- - ----------------
----- ------- - -------------------

-------------- - -
  ------ -
    ------- --------- ------------
  --
  ------- -
    --------- ----------------
    ----- ----------------------- --------
    -------- ---------------
  --
  -------- -
    --- -------------------
      ----- ----------------
      ----- -------------------- ------- -----------------------
    --
  -
--

上面的示例中,我们将 React 和 React-DOM 打包到 vendor.dll.js 文件中,并生成一个名为 vendor.manifest.json 的清单文件。

接下来,在我们的应用程序中,我们需要使用 DllReferencePlugin 来引用 vendor.dll.js 和 vendor.manifest.json。

----- ---- - ----------------
----- ------- - -------------------

-------------- - -
  ------ -
    ---- --------------
  --
  ------- -
    --------- ------------------------
    ----- ----------------------- -------
  --
  -------- -
    --- ----------------------------
      --------- --------------------------------------
    --
  -
--

上面的示例中,我们使用 DllReferencePlugin 引用了 vendor.dll.js 和 vendor.manifest.json。这样,在打包应用程序时,Webpack 会自动忽略 vendor.dll.js 中已经打包过的模块,从而避免了重复打包的问题。

提取公共模块

除了去重,我们还可以通过提取公共模块的方式来优化打包后的文件体积。提取公共模块可以将多个入口文件中相同的模块提取出来,打包成一个单独的文件,从而减小打包后的文件体积。

使用 optimization.splitChunks 配置项

我们可以使用 optimization.splitChunks 配置项来提取公共模块。该配置项的 chunks 和 minChunks 选项可以用来指定需要提取的模块和最小引用次数。

----- ---- - ----------------

-------------- - -
  ------ -
    ----- ----------------
    ----- ---------------
  --
  ------- -
    --------- ------------------------
    ----- ----------------------- -------
  --
  ------------- -
    ------------ -
      ------- ------
      ---------- -
    -
  -
--

上面的示例中,我们将入口文件 app1.js 和 app2.js 中引用次数大于等于 2 的模块提取出来,并打包到一个单独的文件中。

使用 CommonsChunkPlugin 插件

Webpack 4 中已经废弃了 CommonsChunkPlugin 插件,但是在 Webpack 3 中仍然可以使用该插件来提取公共模块。

----- ---- - ----------------
----- ------- - -------------------

-------------- - -
  ------ -
    ----- ----------------
    ----- ---------------
  --
  ------- -
    --------- ------------------------
    ----- ----------------------- -------
  --
  -------- -
    --- -------------------------------------
      ----- --------
    --
  -
--

上面的示例中,我们将 app1.js 和 app2.js 中相同的模块提取出来,并打包到一个名为 common.[chunkhash].js 的文件中。

总结

通过去重和提取公共模块的方式,我们可以优化 Webpack 打包后的文件体积,提高页面加载速度。在实际开发中,我们可以根据项目的具体情况选择合适的优化方式,从而达到更好的优化效果。

以上就是本文介绍的 Webpack 打包优化:去重与提取公共模块。希望本文能够对读者有所帮助。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/657eee8ed2f5e1655d9cfbc7


猜你喜欢

  • 这些.NET 性能优化技巧你了解吗?

    .NET 是一个广泛使用的开发框架,它提供了强大的工具和库来帮助开发人员构建高效、可靠的应用程序。然而,在实际开发中,我们常常会遇到性能瓶颈,这时就需要进行性能优化。

    10 个月前
  • Tailwind CSS 中如何优雅的创建响应式设计

    随着移动设备的普及,响应式设计成为了现代网页设计的重要组成部分。而 Tailwind CSS 是一个强大的 CSS 框架,可以让前端开发者更加高效地创建响应式设计。

    10 个月前
  • Deno 中网络编程的底层原理和应用场景探究

    前言 Deno 是一个新兴的 JavaScript 运行时,与 Node.js 不同的是,它是基于 V8 引擎和 Rust 语言开发的,同时也解决了 Node.js 中存在的一些问题,例如模块管理、权...

    10 个月前
  • ES6 中使用 jQuery 的技巧

    随着 ES6 的普及和 jQuery 的广泛应用,将两者结合使用已经成为了前端开发的常见做法。ES6 提供了许多新的语言特性和语法糖,可以让我们更加高效地使用 jQuery,同时也可以让我们编写出更加...

    10 个月前
  • 如何在 Jest 中 Mock 掉 Axios 的请求

    在前端开发中,我们经常会使用 Axios 来发起网络请求。但是在测试中,我们不希望真正发起网络请求,而是希望模拟请求的返回结果。这时候就需要使用 Jest 来 mock 掉 Axios 的请求。

    10 个月前
  • 小白学 ECMAScript 2020:Symbol 类型的使用详解

    在 ECMAScript 2015 标准中引入了 Symbol 类型,它是一种新的基本数据类型,用于表示独一无二的值。Symbol 类型的引入是为了解决对象属性名冲突的问题。

    10 个月前
  • SSE 的缓存机制及其影响因素

    什么是 SSE? SSE(Server-Sent Events)是一种基于 HTTP 协议的服务器推送技术,它允许服务器实时向客户端发送事件流(Event Stream),并且客户端可以通过 Java...

    10 个月前
  • Koa 应用程序上的 Nginx 反向代理

    什么是反向代理? 反向代理是指客户端通过访问一个代理服务器,代理服务器再将请求转发到内部的服务器上,并将返回的结果返回给客户端。这个过程中,客户端并不知道自己实际上是在访问内部的服务器,而是认为自己是...

    10 个月前
  • 如何在 Web Components 中实现无限滚动

    前言 随着 Web 技术的发展,Web Components 成为了一个越来越受欢迎的前端技术。Web Components 是一种用于创建可重用的自定义元素和组件的技术,它允许开发者将自己的代码封装...

    10 个月前
  • Express.js 中使用 body-parser 解析 POST 请求数据的方法

    在 Web 开发中,POST 请求是常见的一种请求方式。当我们使用 Express.js 框架进行开发时,需要对 POST 请求的数据进行解析。这时,就需要使用 body-parser 中间件。

    10 个月前
  • 使用 LESS 代替 CSS 的优势和弊端分析

    简介 LESS 是一种 CSS 预处理器,它扩展了 CSS 的语法,使得开发者可以使用变量、嵌套、混合、函数等功能,从而提高了 CSS 的可维护性和可扩展性。在前端开发中,使用 LESS 可以带来许多...

    10 个月前
  • 可靠地使用 Mocha 和 Chai 进行文件系统测试的指南

    在前端开发中,文件系统操作是非常常见的一种场景。文件系统测试也是非常重要的一步,能够有效地保证代码的稳定性和可靠性。本文将介绍如何使用 Mocha 和 Chai 进行文件系统测试,让你的测试更加简单和...

    10 个月前
  • Redis 内存溢出问题的解决方案

    Redis 是一款非关系型数据库,它采用内存存储,能够提供高性能的数据读写能力。然而,在使用 Redis 过程中,可能会遇到内存溢出问题。本文将介绍 Redis 内存溢出的原因,以及解决方案。

    10 个月前
  • 扩展 RxJS 异步操作符的基类

    RxJS 是一款强大的响应式编程库,它提供了众多的操作符用于处理异步数据流。在实际开发中,我们经常需要自定义操作符来处理特定的业务逻辑。本文将介绍如何扩展 RxJS 异步操作符的基类,以便更方便地创建...

    10 个月前
  • TypeScript 中使用 interface 定义函数类型的正确方式

    在 TypeScript 中,我们可以使用 interface 来定义函数类型,这种方式可以让我们更加清晰地描述函数的输入和输出。但是,在使用 interface 定义函数类型时,需要注意一些细节,本...

    10 个月前
  • ES7 特性之 Abstract Method-- 让代码更规范化

    在前端开发中,我们经常需要定义一些抽象方法,这些方法在子类中必须被实现,否则会导致程序出错。在 ES7 中,我们可以使用 Abstract Method 来实现抽象方法的定义,从而让代码更规范化。

    10 个月前
  • PM2 实现进程守护的几种方式

    在前端开发中,我们经常需要启动一些服务来提供数据或者渲染页面等功能。这些服务通常是由 Node.js 编写的,因为 Node.js 具有高效的 I/O 操作和事件驱动的特性,可以很好地处理高并发的请求...

    10 个月前
  • 如何使用 Webpack 优化 React 应用的性能

    React 是一个非常流行的 JavaScript 库,可以帮助我们构建复杂的用户界面。但是,当我们的应用程序变得越来越复杂时,它的性能可能会受到影响。为了解决这个问题,我们可以使用 Webpack ...

    10 个月前
  • Mongoose 实现调试提示信息方法总结

    Mongoose 是一个优秀的 Node.js ORM(对象关系映射)库,它提供了简单的 API 来操作 MongoDB 数据库。在前端开发中,我们经常会使用 Mongoose 来实现数据的 CRUD...

    10 个月前
  • Kubernetes 中使用 Ingress Nginx 进行路由管理

    什么是 Kubernetes? Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它可以帮助开发人员和运维人员更轻松地部署和管理应用程序,提高生产力和可靠性。

    10 个月前

相关推荐

    暂无文章