一文搞懂 Webpack 分包:async、initial 与 all 的区别【附源码】

作者:程序员大卫日期:2025/11/29

大家好,我是前端架构师,关注微信公众号【程序员大卫】免费领取精品资料。

1. 背景

最近在优化一个项目的加载性能时,对 optimization.splitChunks.chunks 的三个可选值 asyncinitialall 的具体效果产生了疑惑。为了彻底搞清楚它们的区别,我专门搭建了一个 Demo 进行对比研究。

2. 核心区别:async vs initial

chunks 属性决定了 Webpack 对哪些类型的代码块进行分割。其中 async 是默认配置。

经过测试发现:在单入口应用中,二者区别不明显;但在多入口应用中,差异非常显著。

2.1 测试环境配置 (webpack.config.js)

为了直观观察分包结果,我将 minSize 设置为 0,确保即使是很小的模块也会被强制分割。

1const { CleanWebpackPlugin } = require("clean-webpack-plugin");
2
3module.exports = {
4  mode: "production",
5  entry: {
6    entry1: "./src/entry1.js",
7    entry2: "./src/entry2.js",
8  },
9  optimization: {
10    splitChunks: {
11      chunks: "async", // 实验变量:此处分别修改为 'async', 'initial', 'all'
12      minSize: 0       // 强制分割小模块
13    },
14  },
15  plugins: [
16    new CleanWebpackPlugin() // 每次构建前清理 dist 目录
17  ],
18};
19

2.2 代码结构

假设我们有两个入口文件,它们都引用了同步模块 shared.js,且 entry1 额外引用了一个异步模块 dynamic.js

  • entry1.js: 引用 shared + 动态引用 dynamic
  • entry2.js: 引用 shared
1// entry1.js
2import "./shared";       // 同步公共模块
3import("./dynamic");     // 异步动态导入
4console.log("entry1");
5
6// entry2.js
7import "./shared";       // 同步公共模块
8console.log("entry2");
9

2.3 打包结果对比

在上述场景下,切换配置会产生完全不同的结果:

  • 设置 chunks: 'async' (默认)
    • 结果dynamic.js 被单独打包,但 shared.js 没有被分离。
    • 原因async 只关注异步加载(动态导入)的模块。尽管 shared.js 被多个入口引用,但因为它是同步导入的,所以被忽略,直接打入了各自的入口包中。
  • 设置 chunks: 'initial'
    • 结果dynamic.js 被单独打包,同时 shared.js 也可以被剥离出来成为独立文件。
    • 原因initial 关注初始加载(同步导入)的模块。Webpack 发现 shared.js 在初始化时就被多个入口共享,因此将其分离。

3. 关于 all

当设置为 all 时,Webpack 会采用一种混合策略:无论同步还是异步,只要满足分割条件(如大小、引用次数),都会进行代码分割。

这是目前最推荐的配置,因为它能最大限度地复用代码,减小包体积。

4. 总结

三种模式的核心差异对比:

模式作用范围适用场景特点
async (默认)仅异步模块针对 import() 动态导入的模块确保首屏加载的 bundle 纯净,不影响初始包大小
initial仅同步模块针对入口文件直接 import 的公共模块优化多页应用的公共代码提取,减少重复打包
all所有模块希望最大化代码分割效果最全面的策略,通常能获得最佳的缓存利用率

源码地址: github.com/zm8/wechat-…


一文搞懂 Webpack 分包:async、initial 与 all 的区别【附源码】》 是转载文章,点击查看原文


相关推荐


用LLM+CadQuery自动生成CAD模型:CAD-Coder让文本秒变3D零件
安意诚Matrix2025/11/26

你有没有过这样的经历?想画个法兰盘的CAD模型,得打开专业软件、调坐标系、画草图、做拉伸……步骤繁琐还得熟稔操作逻辑。现在,基于大语言模型(LLM)和CadQuery的CAD-Coder方案,能让你输入一段零件描述,直接生成可执行的CAD代码——今天我们就来拆解这个让CAD建模“动口不动手”的技术! 一、从文本到3D模型:不同表示方式的对比 先看一个法兰盘的例子: 文本描述:只需要说明“120mm直径的金属法兰盘,15mm厚,中心50mm孔,6个12mm安装孔(分布在90mm圆周),还有70m


SpringMVC的工作流程
q***48252025/11/24

1.工作流程 (1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet拦截。 (2)DispatcherServlet拦截到请求后,会调用HandlerMapping(处理器映射器)。 (3)处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 (4)DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)。 (


Spring Boot接收参数的19种方式
a***56062025/11/22

Spring Boot是一个强大的框架,允许开发人员通过多种方式接收和处理参数。无论是HTTP请求参数、路径变量,还是请求体中的数据,Spring Boot都能提供灵活的处理方式。本文将介绍19种不同的方式来接收参数。 1. 查询参数(Query Parameters) 使用@RequestParam注解接收查询参数。适用于GET请求。 @GetMapping("/greet") public String greet(@RequestParam String name) { retur


为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
G探险者2025/11/20

大家好,我是G探险者! 在开发过程中,我们经常遇到这样的灵异现象:明明数据库字段设置为 VARCHAR(1000),前端校验也限制了 1000 个字,但用户提交时后端却报错:“Data too long”。 这并非因为数据库坏了,而是因为不同的数据库对**“长度(Length)”**的定义完全不同。有的按“人眼看到的字”算,有的按“计算机存储的字节”算。 本文将横向对比主流数据库(MySQL, Oracle, SQL Server, PostgreSQL, 达梦)的字段长度表现,并给出避坑建议。


django测试缓存命令的解读
一路生花工作室2025/11/19

命令如下: python manage.py test_cache_performance --clear-cache --iterations 5 是 Django 自定义管理命令(custom management command) 的一种调用方式,用于测试缓存性能。下面逐部分解释其含义: 🔹 1. python manage.py Django 项目的标准命令行入口。所有 Django 内置或自定义的管理命令都通过它执行。 🔹 2. test_cache_performa


深入浅出蓝桥杯:算法基础概念与实战应用(三)搜索
铭哥的编程日记2025/11/18

算法基础概念与实战应用(三)搜索 文章目录 算法基础概念与实战应用(三)搜索1.1 深度优先搜索 - DFS1.1.1 枚举⼦集1.1.2 组合型枚举1.1.3 枚举排列1.1.4 全排列问题 1.2 DFS1.2.1 选数1.2.2 ⻜机降落 整体源代码总结 1.1 深度优先搜索 - DFS 1.1.1 枚举⼦集 代码如下(示例): #include <iostream> using namespace std; int n;


Snapchat 开源全新跨平台框架 Valdi ,一起来搞懂它究竟有什么特别之处
恋猫de小郭2025/11/17

最近看到好几篇在推 Valdi 的文章,大致意思就是 「RN/Flutter 的地位将受到威胁」,「Valdi 将成为全新的跨平台流行架构」云云,这不仅就让我好奇这个新框架有什么魔力,还能在 2025 的跨平台领域玩出新花样? 首先,Valdi 是由 Snapchat 开源的跨平台框架,其核心技术已在 Snap 的生产应用中验证长达 8 年,号称在不牺牲开发速度的前提下提供原生性能 ,那它是怎么做到的? 简单来说,Valdi 是一个 “用 TypeScript(TSX)写 UI,然后编


Java游戏高级编程 | 深入探索游戏引擎与优化技巧
mfnart_2822025/11/15

在线编译C语言|探索在线编译器的优势与应用在线编译C语言是一项非常实用的技术,它使得程序员能够在没有本地开发环境的情况下直接在浏览器中编写、调试和执行C语言代码。在线编译器通过提供一个即时反馈的开发环境,大大提高了学习和工作的效率,尤其对于初学者而言,更是降低了编程的门槛。相比传统的桌面编译器,在线编译器的优势在于其便捷性和灵活性。用户不需要安装任何开发工具,只需在浏览器中输入代码,点击“编译”按钮,就可以立即看到运行结果。这种即时性大大减少了开发中的等待时间,尤其是在调试阶段,可以快速查看修改


前端图形引擎架构设计:双引擎架构设计
猪猪拆迁队2025/11/14

ECS渲染引擎架构文档 写在前面 之前写过一篇ECS文章,为什么还要再写一个,本质上因为之前的文档,截止到目前来说,变化巨大,底层已经改了很多很多,所以有必要把一些内容拎出来单独去说。 由于字体文件较大,加载时间会比较久😞 另外如果有性能问题,我会及时修复,引擎改造时间太仓促,只要不是内存泄漏,暂时没去处理。 还有很多东西要做。 体验地址:baiyuze.github.io/design/#/ca… 项目概览 Duck-Core 是一个基于 ECS(Entity-Component-Sy


GPT-5.1 凌晨突袭,奥特曼听劝!全网呼唤的人味回来了
新智元2025/11/13

「【新智元导读】今天,OpenAI GPT-5.1「全家桶」突然登场,Instant 和 Thinking 王炸组合同步上线。这一次,模型情商智商双核升级,不仅更聪明,而且聊天更有人味了。」 没有直播,OpenAI 一早放大招,让所有人猝不及防。 就在刚刚,GPT-5.1 正式发布,GPT-5 系列重大升级版登场! 一共有三个版本,目前已经上线了前两个: · GPT-5.1 Instant :最常用的模型,语气更亲切、更智能,更善于遵循指令。 · GPT-5.1 Thinking :先进的推理模

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读