从输出文件大小看 webpack4 的优化机制

前言

Webpack 作为前端开发中常用的模块打包工具, 在众多开发者和团队中得到了广泛的应用和普及。在 Webpack 4 的升级中,其性能和优化机制也得到了极大的提升和改进。

但是,我们在实践中发现 Webpack 打包的输出文件大小却是一个 「瓶颈」,存在非常大的优化空间。

因此,本文将从输出文件大小这个重要的指标,深入研究并探讨 Webpack 4 的优化机制。

Webpack 的输出文件

Webpack 构建的项目最终输出的文件主要包括以下类型:

  • HTML 文件
  • JavaScript 文件
  • CSS 文件
  • 图像等其他文件

其中比较核心的,就是 JavaScript 文件。

Webpack 开发者中常常用到的命令:webpack --config webpack.config.js,可以看到 Webpack 的输出信息。

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

上面展示了 Webpack 输出文件的一部分信息。其中关键部分如下:

  • app.d5d5e5ec1bc30f8b24.js :应用的 JavaScript 文件
  • vendors~app.d5d5e5ec1bc30f8b24.js :依赖库的 JavaScript 文件
  • index.html:应用的入口文件
  • *.js.map:Webpack 打包的 source Map 文件

这里,我们只需要关注 JavaScript 文件 app.d5d5e5ec1bc30f8b24.jsvendors~app.d5d5e5ec1bc30f8b24.js

Webpack 的优化机制

在 Webpack 4 中,有许多内置的优化机制。下面针对 JavaScript 输出文件的优化机制进行详细说明:

Tree Shaking

Tree Shaking 是 Webpack 4 的一个重要特性,它可以实现从代码库中删除未引用的模块代码,减少打包后的文件大小。

根据官方文档的介绍,Tree Shaking 利用了 ES6 的模块系统中,import 和 export 都是静态化的特性,可以静态分析出代码依赖关系从而进行死代码的消除。

在 Webpack 4 中,默认进行了 Tree Shaking 的操作,无需额外配置。

举个例子来看。下面是一个简单的脚本:

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

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

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

另一端,在另一个文件中,我们仅仅只使用了其中一个函数:

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

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

那么在最终输出的 JS 文件中,只会包含 square() 函数的代码,而 cube() 函数的相关代码就会被剔除掉。

UglifyJS

UglifyJS 是一个 JavaScript 的压缩和混淆工具,可以帮助我们剔除 JavaScript 中的空间和注释,减小文件大小。在 Webpack 中,我们可以通过 webpack-parallel-uglify-plugin 插件来实现 UglifyJS 操作。

按需加载

按需加载是指,当一个应用过大时,webpack 可以自动将模块进行拆分,形成多个小模块,然后在需要的时候进行加载。这样可以提高应用的首屏加载速度,并且减少了整个应用的资源占用。

适用于大型应用开发。

splitChunks

splitChunks 是 webpack 4 内置的一个插件,专门用于提取公共的 js 资源,减少冗余,避免代码重复造成的加载和解析时间浪费。

在 webpack 的配置文件中配置:

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

在配置参数中,我们可以指定 groups 缓存策略,将多个 chunks 模块中公共的部分分割成单独的 chunk 输出。这样可以有效地避免代码的冗余,提高代码块的复用率。

示例代码

本文使用了一个非常简单的 React 应用作为示例,展示 Webpack 4 的效果。您可以在这个 Github 仓库 中找到示例代码。

下图是未进行 Webpack 优化之前的项目结构:

打包生成的文件数量多达 47 个,文件总大小为 1.74MB,其中 1.1MB 占用了 JavaScript 的输出文件。

为了优化这些输出文件,我们需要先进行配置。

Webpack 配置

在 Webpack 4 的配置中,我们需要先引用一些必要的内置优化插件:

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

其中,optimization 中的 minimizer 选项来自 webpack-parallel-uglify-plugin 插件,用于生产环境中的代码压缩和混淆。minChunks 选项指定了公共 chunk 的最小的块数。对于小于 2 个的块,我们可以使用默认配置,用于打包其他类库等文件。cacheGroups 中的 defaults 指定了默认缓存策略,我们将重复出现次数比较多的模块,当作可复用模块,优先压缩和缓存。cacheGroups 中的 vendors 用于将 node_modules 的模块打包分离开来。maxSize 指定了缓存策略的缓存最大大小,可以进行压缩和拆分。

Webpack 分析

我们使用 webpack-bundle-analyzer 对打包后的文件进行分析:

可以发现,在实际使用中,Webpack 的输出文件大小已经极大地优化了。

总结

本文围绕 Webpack 打包后的 JS 文件大小进行了讲解,并深度剖析了 Webpack 4 的优化机制。我们使用了 Tree Shaking、UglifyJS、按需加载和 splitChunks 等机制。

如果我们能够合理使用 Webpack 4 的优化机制,就可以有效地减少 JS 文件的大小。在今天的分布式和高性能化的互联网应用开发中,合理使用 Webpack 4 的优化机制是非常有必要和有益的。

最后,我们留给读者一个问题:是否为自己的应用合理配置 Webpack 4 的优化机制?

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


猜你喜欢

  • ES7 中数组去重的新方法 Set 与 Array.from 结合应用

    ES7 中数组去重的新方法 Set 与 Array.from 结合应用 在前端开发中,经常需要对数组进行去重处理。ES6 中提供了一种新的数据结构 Set,可以很方便地实现数组去重。

    1 年前
  • Redux 中如何处理服务器端渲染?

    Redux 中如何处理服务器端渲染? 在 Web 应用开发中,服务器端渲染 (SSR) 已经成为了前端极为重要的一部分。而对于 Redux 作为前端的一个重要状态管理库,如何进行服务器端的渲染呢?对于...

    1 年前
  • Vue.js 中使用 vue-apexcharts 进行数据可视化开发的技巧

    Vue.js 已经成为了前端开发中的一种重要技术栈,并且在数据可视化方面有着广泛的应用。在 Vue.js 中,vue-apexcharts 是一个非常好的数据可视化工具,它使用了 ApexCharts...

    1 年前
  • React Native 开发中的 ESLint 配置

    ESLint 是 JavaScript 代码中常用的一种代码检查工具。它可以帮助我们避免代码中的错误、提高代码质量,使代码更加规范化、易于维护。在 React Native 开发中,ESLint 同样...

    1 年前
  • Koa2 下使用 Node.js 的 child_process 模块实现进程管理

    前言 在使用 Node.js 开发前端应用时,有时候需要使用进程,比如启动一个子进程执行一些耗时的任务,或者启动多个进程实现负载均衡。Node.js 提供了 child_process 模块来实现进程...

    1 年前
  • Mongoose 如何实现批量插入数据

    在使用 MongoDB 数据库时,Mongoose 是一个非常常用的 Node.js ODM(Object Data Modeling) 库。它可以帮助我们在 Node.js 应用程序中与 Mongo...

    1 年前
  • RxJS 中常见的操作符使用实例

    RxJS 是一个在前端开发中使用广泛的基于响应式编程思想的库,它的核心是观察者模式和异步数据流。在 RxJS 中,操作符是非常重要的一部分,可以对数据流进行处理和转换。

    1 年前
  • Sequelize 求援! save 也保存关联模型

    前言 Sequelize 是 Node.js 中使用最广泛的 ORM 框架之一,它提供了丰富的 API 和清晰的文档,方便开发者快速高效地操作数据库。然而,在处理模型之间的关联时,有一个非常常见的问题...

    1 年前
  • Promise 实现 Ajax 异步请求

    什么是 Ajax Ajax 全称是 Asynchronous JavaScript And XML,它是一种通过 JavaScript 在浏览器端向服务器发起异步请求,从而实现页面无刷新更新的技术。

    1 年前
  • ES6 中引入的 Generator 函数与异步编程详解

    前言 随着 Web 应用的复杂性不断增加,前端开发中的异步编程问题也变得越来越重要。ES6 中引入的 Generator 函数提供了一种异步编程解决方案,这篇文章将深入探讨 Generator 函数的...

    1 年前
  • SASS 生成长阴影效果的实现方法

    在前端开发中,阴影是一个经常被用到的效果。长阴影效果是一种比较流行的阴影效果,它可以为我们的页面增添层次感和视觉美感。在本文中,我们将介绍使用 SASS 实现长阴影效果的方法。

    1 年前
  • Custom Elements 教程:解决不同框架的使用冲突问题

    在前端开发中,我们经常会使用不同的框架和库来构建网站或应用。然而,不同框架之间的组件使用常常会产生冲突,导致一些意想不到的问题。为了解决这个问题,我们可以使用 Custom Elements 自定义元...

    1 年前
  • Socket.io 如何应对高并发请求的处理?

    前言 在现代 Web 应用程序中,实现实时数据传输变得更为常见。Socket.io 是一款流行的工具,可用于实现这一目标。Socket.io 可以使用 WebSockets,轮询(polling)和其...

    1 年前
  • MongoDB 的坑之对象超长引起的性能瓶颈

    前言 MongoDB 是一个广泛使用的 NoSQL 数据库,尤其适用于分布式和大规模的应用场景。但是,MongoDB 也有一些瓶颈和坑需要我们注意,本文将重点介绍其中一个,即对象超长引起的性能瓶颈。

    1 年前
  • Redis 应用:基于 Redis 的全文搜索引擎设计

    前言 在现代互联网时代,搜索引擎已经成为了我们日常工作和生活中必不可少的一部分。然而,现有的搜索引擎往往遇到了很多性能瓶颈和可扩展性问题,这就需要我们寻找更为灵活高效的解决方案。

    1 年前
  • Server-sent Events 在数据统计分析中的应用

    Server-sent Events 在数据统计分析中的应用 随着互联网技术的快速发展,数据分析和统计越来越受到企业和个人的青睐。在前端开发中,Server-sent Events(SSE)是一个很好...

    1 年前
  • 如何使用 Mocha 进行前端 JavaScript 单元测试

    前端项目需要进行单元测试,以保证代码质量和可靠性,能够快速定位并排除潜在的问题,提升开发效率和代码健康度。Mocha 是一款流行的 JavaScript 测试框架,支持多种浏览器和 Node.js 运...

    1 年前
  • 用 Deno 实现内存泄漏检测:无处可藏的懒惰

    前言 在我们的开发中,内存泄漏问题一直是一个棘手的问题。无论是在前端还是后端,内存泄漏问题可能会导致性能下降,甚至最终导致程序崩溃。由于 JavaScript 是一种披着高级语言外壳的脚本语言,因此内...

    1 年前
  • CSS Reset后如何解决按钮样式失效问题

    在前端开发中,CSS Reset 是一个常见的工具,它用于解决不同浏览器之间的样式差异问题。然而,使用 CSS Reset 后,按钮样式可能会失效,因为按钮样式在不同浏览器和操作系统之间差异较大。

    1 年前
  • ECMAScript 2021 中函数调用栈的新策略

    在 ECMAScript 2021 中,新增了一种函数调用栈的策略,它被称为 "函数调用队列",与传统的 "函数调用栈" 不同,它采用了一种更加高效的方法来处理函数调用过程中的内存分配问题。

    1 年前

相关推荐

    暂无文章