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

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

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

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 的区别【附源码】》 是转载文章,点击查看原文


相关推荐


深度学习在教育数据挖掘(EDM)中的方法体系:从任务建模到算法范式的理论梳理与总结
智算菩萨2025/12/8

目录 1 引言 2 理论知识与技术基础 2.1 教育数据的形式化:事件流、序列、图与稀疏矩阵 2.2 监督学习的目标函数:从分类到排序 2.3 表示学习与自编码器:从重构到迁移 2.4 图神经网络与知识图谱:结构归纳偏置 2.5 生成模型与能量函数:RBM/DBN 的另一条线 2.6 强化学习:把推荐与学习路径当作序列决策 3 EDM 的典型任务与场景:问题定义、输入输出与评价方式 4 深度学习范式在 EDM 中的总体框架:监督、无监督与强化学习如何落到教育任务 4.1 监


【金猿人物展】涛思数据创始人、CEO陶建辉:实现AI时代时序数据库向“数据平台”的转型
数据猿2025/12/16

陶建辉 “【提示】2025第八届年度金猿颁奖典礼将在上海举行,此次榜单/奖项的评选依然会进行初审、公审、终审三轮严格评定,并会在国内外渠道大规模发布传播欢迎申报。 大数据产业创新服务媒体 ——聚焦数据 · 改变商业 在数字化转型与AI技术爆发的浪潮中,时序数据库作为处理海量实时数据的核心工具,已成为工业互联网、自动驾驶、能源电力等领域的刚需。 作为国内时序数据库赛道的领军企业,涛思数据从2016年入局至今,凭借精准的赛道选择、持续的技术迭代与独特的发展策略,实现了从单一产品到生


刷新后点赞全变 0?别急着怪 Redis,这八成是 Long 被 JavaScript 偷偷“改号”了(一次线上复盘)
WanderInk2025/12/25

做社区功能的人,多半都经历过这种抓狂时刻:你在帖子上点了个赞,按钮立刻高亮,数字也加一,用户体验看起来很丝滑;可你一刷新页面,点赞数像被人清空了一样,全部回到 0。你打开 Redis 客户端看,计数 key 明明存在,值也不是 0。于是你开始怀疑缓存一致性,怀疑是不是读了另一台 Redis,怀疑线上 jar 没更新,甚至怀疑自己是不是在梦里写代码。 我得说,这类问题最阴的地方就在于它特别像缓存问题,实际上却往往跟缓存一点关系都没有。真正的凶手是数据类型边界,准确地说,是 Java 的 long


GDAL 实现自定义数据坐标系
GIS之路2026/1/3

^ 关注我,带你一起学GIS ^ 前言 ❝ 在GIS开发中,经常需要进行数据的转换处理,特别是Shapefile数据的投影转换更是重中之重,如何高效、准确的将源数据坐标系转换到目标坐标系是我们需要研究解决的问题。 在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,本篇教程在之前一系列文章的基础上讲解如何使用GDAL实现自定义数据坐标系。 GDAL 简介 GDAL 下载安装 GDAL 开发起步 GDAL 实现 GIS 数据读取转换(全) 如


hive问题
心止水j2026/1/11

一、基础概念 问题:简述 Hive 的定义及核心作用?答案:Hive 是基于 Hadoop 的数据仓库工具,支持类 SQL(HQL)查询分析;核心作用是让非开发人员通过 SQL 分析 Hadoop 上的海量数据。 问题:Hive 的元数据默认存储在哪里?生产环境中为什么要替换为 MySQL?答案:默认存 Derby;生产换 MySQL 因 Derby 仅单用户、不支持并发,MySQL 支持多用户并发、数据持久化且易维护。 问题:Hive 支持哪些执行引擎?它们的区别是什么?答案


2025.12.17华为软开
ゞ 正在缓冲99%…2026/1/19

细胞增殖 import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long n = scanner.nextLong();//n个观测值

首页编辑器站点地图

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

Copyright © 2026 XYZ博客