Webpack 优化之 SplitChunksPlugin 配置详解

在 Webpack 4 中,官方推荐使用 SplitChunksPlugin 插件来进行代码的分割和优化。通过将公共代码抽离成单独的文件,可以减小文件的体积,提升应用的加载速度。

本文将对 SplitChunksPlugin 的常用配置进行详细介绍,并提供示例代码和学习指导。

什么是 SplitChunksPlugin

SplitChunksPlugin 是一个 Webpack 插件,用于抽离公共代码到单独的文件中。通过配置 SplitChunksPlugin,可以将应用中共享的代码提取出来,减小打包后的文件大小,缩短应用的加载时间,提升用户体验。

常用的配置选项

chunks

chunks 用来指定需要优化的代码块。该选项可以设置为字符串、数组和函数。

当设置为字符串时,可选值有: 'initial'、'async' 和 'all'。其中,'initial' 用于提取入口模块的公共代码,'async' 用于提取异步加载模块的公共代码,而'all' 则同时提取两者的公共代码。

当设置为数组时,可配置多个值。对于每个块,Webpack 会生成对应的代码块。例如:['a', 'b'] 将会创建一个名为 'a' 的代码块和一个名为 'b' 的代码块。

当设置为函数时,函数将会接收一个参数,该参数为 module 对象,函数需要返回一个值,表示该模块所处的代码块。

下面是一个示例代码:

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

在上面的配置代码中,chunks 被设置为了 'all',表示提取所有代码块的公共代码。同时,通过 cacheGroups 配置项,将 node_modules 中的代码提取到一个名为 'vendors' 的代码块中。

minSize

minSize 用来指定被抽离出来的代码块的最小体积。当被抽离出来的代码块的体积小于该值时,不会被分割。

maxSize

maxSize 用来指定被抽离出来的代码块的最大体积。当被抽离出来的代码块的体积大于该值时,会尝试进一步分割。

minChunks

minChunks 用来指定引用次数。如果一个模块被引用的次数不超过该值,则不会被抽离成公共代码块。

maxAsyncRequests

maxAsyncRequests 用来指定异步加载的代码块的最大数量。当异步加载的代码块数量超过该值时,将不会进行分割。

maxInitialRequests

maxInitialRequests 用来指定入口代码块的最大数量。当入口代码块的数量超过该值时,将不会进行分割。

automaticNameDelimiter

automaticNameDelimiter 用来指定自动生成的文件名中,用于分隔不同部分的字符串。例如,如果该值为 '_',则生成的文件名可能为:vendors~main_index_bundle.js

下面是一个示例配置:

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

在上面的配置中,首先将 chunks 设置为 'all',表示将所有代码块中的公共代码抽离出来。然后通过 cacheGroups 配置项,定义了两个代码块:vendor 和 common。

vendor 代码块用于将 node_modules 中的代码提取到一个单独的文件中。由于 vendors 和默认的 cacheGroups 中都会匹配 node_modules 中的代码,因此需要将 default 和 vendors 设置为 false。

common 代码块用于将模块中的第三方依赖(被至少两个模块引用)提取到一个公共文件中,并设置了一些自定义选项,例如设置 priority 为 -10 以防止将 vendor 和 common 中的公共代码合并到一起。

总结

SplitChunksPlugin 是一个非常有用的 Webpack 插件,能够将多个代码块中共享的代码提取到单独的文件中,缩小应用的体积,提升应用的加载速度。在使用 SplitChunksPlugin 时,应根据自己的应用场景和需求,选择合适的配置选项,以达到最佳的优化效果。

示例代码:

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

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

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


猜你喜欢

  • 解析 ECMAScript 2016 的 for...of 循环及其应用场景

    前言 ECMAScript 2015(简称 ES6)带来了许多新特性,其中一个特性就是 for...of 循环。相比于 for...in 循环,for...of 循环有许多的优势,并且能够处理更多的数...

    1 年前
  • 了解 ES8 中引入的 Atomics

    ES8 中引入了原子操作对象 Atomics,这个对象提供了一种可以在并发执行的多个线程之间安全地共享内存的方式。在此之前,在 JavaScript 中没有原生的机制能够实现线程之间的共享内存,使用锁...

    1 年前
  • 如何在 Angular 应用中设置全局变量和常量

    在 Angular 应用中,我们经常需要定义一些全局变量或常量,用于存储应用的配置信息或公共的数据。本文将介绍如何在 Angular 应用中设置全局变量和常量,并提供相应的示例代码。

    1 年前
  • 解决 Express.js 应用程序中的跨站脚本攻击 (XSS) 问题

    跨站脚本攻击 (Cross-Site Scripting, XSS) 是一种常见的 Web 应用程序安全漏洞,指攻击者利用应用程序中存在的漏洞,向页面注入恶意脚本代码,从而获取用户敏感信息或攻击其他网...

    1 年前
  • 如何处理响应式设计中的横向滚动条问题

    在响应式设计中,我们会遇到这样的问题:不同设备宽度不同,如果元素宽度固定,可能会导致横向滚动条出现,影响用户体验。本文将介绍如何处理响应式设计中的横向滚动条问题,旨在帮助前端工程师更好地应对这一挑战。

    1 年前
  • 这可能是你错过的最好的 Node.js 进程管理工具 - PM2

    前言 Node.js 是一个非常流行的 JavaScript 运行时环境,可以轻松地开发服务器应用程序和 Web 应用程序。但是在实际生产环境中,如何保证 Node.js 应用稳定、高效地运行是一个非...

    1 年前
  • 如何在 Next.js 框架中使用 Ant Design UI 组件库

    Ant Design 是一个流行的 UI 组件库,为前端开发人员提供了一系列易于使用和自定义的 React 组件。在开发过程中,如果使用 Ant Design 可以大大提高开发效率和代码质量。

    1 年前
  • 如何使用 React Native 开发 SPA 移动应用,并避免遇到的坑

    React Native 是一个用于构建原生应用的开源框架,可以让你使用 JavaScript 和 React 来编写现代化的原生应用程序。在本文中,我们将学习如何使用 React Native 开发...

    1 年前
  • 在 ES10 中正确的使用可选的 catch 绑定

    在 ES6 中,我们可以使用 Promise 对象来处理异步操作,它们提供了一种更优雅和可读的方式来处理异步工作流。ES10(ES2019)推出了一个新功能——可选的 catch 绑定,可以更好地处理...

    1 年前
  • ESLint 解决 JS 过于严格的问题

    什么是 ESLint? ESLint 是一个用于检查 JavaScript 代码中语法和代码错误的工具。它可以找到常见的编码错误,并加强代码质量和一致性。使用 ESLint,你可以确保你的代码遵循最佳...

    1 年前
  • Vue.js 中使用 slot-scope 的方法

    在 Vue.js 中,使用 slot-scope 提供了一种非常有用的方式来访问父组件中的数据,并将之传递给子组件。slot-scope 常常用于在父组件中定义“插槽”,并在子组件中动态渲染。

    1 年前
  • Redis 安全问题处理方案:如何使用密码认证、IP 过滤等安全措施保护 Redis 服务器

    Redis 是一款高性能的键值数据库,广泛应用于 Web 开发中的缓存服务、消息队列、会话存储等领域。然而,Redis 默认并未启用任何安全措施,如果直接将 Redis 服务暴露在公网上,极易受到各种...

    1 年前
  • Socket.io 实现心跳机制及会话管理的细节解析

    Socket.io 实现心跳机制及会话管理的细节解析 前言 随着 Web 技术的发展,前后端分离、实时性等需求的提出,WebSocket 技术应运而生。然而,WebSocket 的实现是基于 TCP ...

    1 年前
  • 深入理解 RxJS 中的 Subject

    RxJS 是一个强大的响应式编程库,它提供了许多实用的工具和操作符来完成各种任务。其中一个最强大的工具就是 Subject。Subject 既是观察者(Observer),又是可观察对象(Observ...

    1 年前
  • Cypress 测试中操作表格数据

    在前端开发中,测试是非常重要的一环,而 Cypress 是一个非常流行的测试框架。在使用 Cypress 进行测试时,经常需要对表格数据进行操作。本文将介绍如何在 Cypress 测试中操作表格数据,...

    1 年前
  • Deno 与 JavaScript 的区别

    JavaScript 已经成为了 Web 开发的标准,而 Deno 是一个相对新的 JavaScript 运行时。它旨在提供一个安全的环境,让开发人员能够在其中运行 JavaScript 和 Type...

    1 年前
  • PWA 开发中遇到的缓存机制问题及解决方案

    作为一种新兴的前端技术方案,PWA(Progressive Web App)已经被越来越多的开发者所接受和应用。在实际开发中,PWA 应用缓存机制是一个必不可少的特性,它可以让应用在离线状态下仍然可以...

    1 年前
  • 使用 sinon 和 Chai 进行 mock 和 stub 时遇到的方法覆盖问题解析

    使用 sinon 和 Chai 进行 mock 和 stub 是前端开发中常用的技术手段,但在实践中,我们可能会遇到方法覆盖的问题。本文将从原理、常见情况和解决方法等方面进行分析和介绍,帮助读者更好地...

    1 年前
  • ES12 之 WeakRefs 和 FinalizationRegistry

    ES12(即 ECMAScript 2021)是 JavaScript 的最新规范版本,其中新增了一些新的特性和 API,这些都为前端的开发者带来了一些新的机会和优化。

    1 年前
  • 在 GraphQL 中使用 Flutter

    GraphQL 是一种用于 API 的查询语言和运行时环境。在前端开发中,GraphQL 可以用于优化网络请求,减少不必要的数据传输,从而提高应用性能。Flutter 是一种移动开发框架,可以轻松地创...

    1 年前

相关推荐

    暂无文章