webpack 打包时公共模块 (vendor) 单独打包

随着前端项目的复杂度不断增加,现代前端应用已经远远不是简单的一些 HTML、CSS 和少量的 JavaScript 代码了。越来越多的库和框架变得必不可少。这些库和框架不仅消耗了大量的网络资源和加载时间,还有助于增加 JavaScript 包的大小,从而导致页面加载时间过长的问题。为了解决这个问题,服务端渲染与按需加载等技术诞生了。其中 webpack 打包时公共模块 (vendor) 单独打包是一种关键技术。

为什么要把公共模块单独打包

我们假设有一个项目,其中有多个入口点(entry points)和许多模块(modules)。当我们使用 webpack 将这些模块打包成 bundle 时,我们将得到一个包含所有代码的 bundle 文件。而这个文件只有当它被加载时,才会开始执行整个应用程序。因此,我们将需要加载的 JavaScript 代码压缩成尽可能小的文件。

这里的问题在于,如果我们的多个入口点之间共享了一些公共代码,这些代码将被打包到多个 bundle 中,从而导致代码冗余,增加整个包的大小。例如,如果我们在不同的文件中使用了 jQuery,这意味着我们在每个文件中都将包含一份 jQuery 代码。这样做不仅导致代码冗余,而且还增加了 bundle 的体积,使整个项目加载变慢。因此,我们需要将这些公共代码提取到一个单独的文件中,然后在每个入口点中使用这个文件。

如何将公共模块单独打包

webpack 支持使用 CommonsChunkPlugin 插件将代码分离为不同的 chunk。这个插件将公共模块提取出来并打包到一个单独的文件中。我们可以将所有共享模块提取到一个文件中,将不同的入口文件和 vendor 文件组合起来,以便在浏览器中加载并渲染。

我们来看一个简单的示例:

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

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

在上面的示例中,我们使用了 CommonsChunkPlugin 插件将名为 vendor 的 chunk 提取出来。此外,我们还将 minChunks 设置为 Infinity,这表示不要将任何其他模块提取到 vendor chunk 中。这段代码将提取出所有在 vendor chunk 中引用的依赖。

如果我们使用 HTML 页面作为我们的入口点,我们可以通过将这些脚本作为标签添加到 HTML 中来使用它们:

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

在这个示例中,我们首先加载 vendor.bundle.js 文件,然后加载 app.bundle.js 文件。由于 vendor chunk 包含了所有共享的依赖,我们可以确保它会在应用代码之前加载。

总结

在本文中,我们介绍了将 webpack 打包时公共模块 (vendor) 单独打包的原因和如何实现。这是使您的 JavaScript 代码更小,更快速加载,从而帮助提高应用性能的关键技术。

在开发过程中,当我们开始使用一些其他人创建的库时,我们应该考虑它们的大小,以及我们应该如何在我们的应用程序中使用它们。一般情况下,提取这些库中的公共代码,或者使用像 webpack 中的模块系统,将是解决问题的最佳方式。

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


猜你喜欢

  • Socket.IO 的优缺点、使用场景及技术优化

    Socket.IO 是一个可以让浏览器与服务器建立实时、双向通信的 JavaScript 库。它提供了极其简单易用的 API,同时支持诸如 WebSocket、轮询等多种传输协议,因此广受前端开发者欢...

    1 年前
  • Enzyme:简化你的 React 测试

    React 是一个非常流行的 JavaScript 库,可轻松构建基于组件的用户界面。对于开发人员来说,测试 React 应用程序至关重要,因为这可以确保我们的代码在生产环境中能够按照我们预期的方式工...

    1 年前
  • 如何使用媒体查询在响应式设计中实现完美的层叠效果

    在现代 web 应用程序中,响应式设计已经成为了一个必不可少的部分。它允许应用程序适应不同的屏幕大小和设备,提供最佳的用户体验。其中最重要的一部分就是实现层叠效果,以确保内容在不同的屏幕尺寸下都能够清...

    1 年前
  • Server-Sent Events:一种新的 WebSocket 协议

    在前端开发中,我们经常需要实现实时数据更新的功能。传统的轮询和长轮询方式虽然可以实现这一功能,但是都存在着效率低、占用资源多等问题。而 WebSocket 一度成为解决这些问题的良好方案,但是由于其需...

    1 年前
  • ES10 中 JSON 增强的使用

    随着 ES10 的推出,JavaScript 语言得以享受许多新功能,其中最令前端开发者感到兴奋的莫过于对 JSON 的增强。在本篇文章中,我们将探讨 ES10 中新增的 JSON 增强功能,以及如何...

    1 年前
  • 如何解决 RESTful API 请求超时的问题

    在前端开发中,我们经常需要使用 RESTful API 与后端进行数据交互。但是,由于网络问题、服务器负载等原因,RESTful API 请求有可能会发生超时的情况。

    1 年前
  • LESS 如何使用循环

    LESS 是一种动态样式语言,与 CSS 相似,但比 CSS 更加强大和灵活。LESS 中循环语句的使用可以帮助开发者减少重复的代码,提高代码的复用性。本文将为大家介绍 LESS 中如何使用循环语句。

    1 年前
  • 如何在 Kubernetes 中管理集群证书

    在 Kubernetes 集群中,为了保证通信的安全,需要使用证书进行认证和加密。证书管理是 Kubernetes 集群中比较重要的一部分。在本篇文章中,我们将深入介绍如何在 Kubernetes 中...

    1 年前
  • 如何在 Node.js 中处理文件上传?

    在前端开发中,文件上传是一个经常会遇到的需求。Node.js 提供了处理文件上传的强大工具,让文件上传变得轻松简单。本文将介绍如何在 Node.js 中处理文件上传。

    1 年前
  • Deno 应用中使用 Mock.js 模拟数据

    Deno 是一个新兴的 JavaScript 运行时,它可以用于构建后端应用程序和工具。Mock.js 是一个流行的 JavaScript 库,它可以用来生成随机数据。

    1 年前
  • 如何针对不同浏览器使用 CSS Reset?

    如何针对不同浏览器使用 CSS Reset? CSS Reset 是前端开发中非常重要的一环,它的作用是取消不同浏览器在默认样式上的差异,使我们能够更加准确地控制页面的各个元素。

    1 年前
  • Cypress 如何进行网络模拟?

    Cypress 是一款前端自动化测试工具,它的特点是简单易用、集成度高且支持 end-to-end 测试。除了基于 UI 界面的测试,Cypress 还提供了一种模拟网络请求的方法,这可以使测试更加严...

    1 年前
  • Serverless 应用如何增强性能

    随着云计算技术的不断发展,Serverless 架构成为了越来越多前端应用的选择。作为一种全新的架构模式,Serverless 能够大幅度减少前端应用构建和运行的成本,提高应用的开发效率。

    1 年前
  • 在 Custom Elements 中使用 CSS Grid Layout 实现流式布局

    在前端开发中,我们经常需要使用流式布局来适应不同设备的屏幕尺寸,以及响应式设计的需要。CSS Grid Layout 是一种强大的布局方式,可以实现复杂的布局需求,同时也适用于流式布局的实现。

    1 年前
  • 使用 Chai 和 Supertest 进行 Express 应用程序测试的方法和技巧

    前端开发在开发完前端代码之后需要进行测试,以确保应用程序运行良好。在测试过程中,为了确保应用程序的质量和可靠性,需要进行多种测试,其中之一就是端到端测试(End-to-End Testing)。

    1 年前
  • 无障碍网站设计中按钮标签的优化处理

    随着全球范围内对于无障碍网站设计的重视度越来越高,前端开发者不仅需要考虑到网站设计的美观性与可用性,还需要关注到如何优化所有用户的网站访问体验。本文将重点介绍如何在按钮标签上优化处理,使得无障碍用户和...

    1 年前
  • ES9 之 Object.values() 与 Object.entries() 使用详解

    在这个快速发展的时代,前端技术也在不断进步。ES9 (ECMAScript 2018) 是最近推出的 JavaScript 版本,其中包含了一些强大的新特性,其中就包括 Object.values()...

    1 年前
  • RxJS 中的 window、windowCount 和 windowTime 操作符

    RxJS 是一款前端开发中常用的响应式编程框架,它极大地方便了异步编程的开发,其中的 window、windowCount 和 windowTime 操作符更是非常有用的工具。

    1 年前
  • Redux 教程:使用 Thunk 进行异步操作

    异步操作在 Redux 中的问题 在使用 Redux 进行状态管理时,我们通常会遇到需要进行异步操作的情况。比如:从服务器获取数据、处理用户输入、将数据保存到服务器等等。

    1 年前
  • SASS 的函数库:Compass 的使用方法和注意事项

    SASS 是一种 CSS 预处理器,它能够让开发者更加高效地编写样式。SASS 提供了许多强大的功能,例如变量、嵌套、Mixin 等,使得编写样式代码变得更加简单和灵活。

    1 年前

相关推荐

    暂无文章