Webpack 在异步请求 JS 文件时获取 JS Bundle 的机制

Webpack 在异步请求 JS 文件时获取 JS Bundle 的机制

Webpack 在处理代码分割(Code Splitting)后产生的异步 chunk(通常是import()动态导入)时,浏览器最终是怎么知道要去请求哪个 .js 文件,以及**请求回来后怎么正确执行**,这个过程主要依赖以下几个核心机制:

核心机制概览(2024~2025 主流方式)

机制主要文件作用谁负责生成当前主流方式
manifestruntime chunkchunkId → 文件名映射表webpack(内置)绝大多数项目都有
publicPathruntime 或配置决定请求的 URL 前缀用户配置 + runtime 推断非常重要
webpack_require.pruntime就是 publicPath 的运行时变量runtime 注入核心变量
webpack_require.uruntimechunkId → chunk 文件名 的函数webpack(新版本更智能)现代主流
webpack_require.eruntime真正发起 chunk 加载的函数webpack异步加载入口
JSONP / script tag浏览器实际发起 .js 请求的方式浏览器仍然是默认(2025年)

详细流程(以最常见的 JSONP + webpackChunkName 方式为例)

1. 代码里写: import(/* webpackChunkName: "user-detail" */ './user-detail.js') 2. 打包后生成的文件大致如下: - main.js ← 入口文件 + runtime - 123.user-detail.js ← 异步 chunk(chunkId=123) - 456.other-page.js ← 另一个异步 chunk 3. webpack 在 main.js(或单独的 runtime chunk)中注入了一段类似这样的代码: // 简化的伪代码 var installedChunks = { 0: 0 }; // 已加载的 chunk 标记 __webpack_require__.e = function requireEnsure(chunkId) { var promises = []; // 检查是否已经加载过 if (!installedChunks[chunkId]) { var promise = new Promise(function(resolve, reject) { // 记录 promise,后面 onload 会 resolve var callbacks = installedChunks[chunkId] = [resolve, reject]; // 重要!决定文件名的地方 ↓↓↓ var filename = __webpack_require__.u(chunkId); // ← 得到 "123.user-detail.js" var fullUrl = __webpack_require__.p + filename; // ← publicPath + 文件名 // 创建 script 标签 var script = document.createElement('script'); script.charset = 'utf-8'; script.timeout = 120; script.src = fullUrl; // 错误处理 script.onerror = script.onload = function(event) { // ... 处理成功/失败,把 promise resolve/reject }; document.head.appendChild(script); }); promises.push(promise); } return Promise.all(promises); } 4. 当代码执行到 import() 时,实际上调用的是: __webpack_require__.e("123").then(function() { // chunk 已经加载完成,可以使用模块了 var module = __webpack_require__("./src/user-detail.js"); // ... })

几个关键问题解答

问题答案来源说明
文件名是怎么知道的?__webpack_require__.u(chunkId)webpack 打包时把 chunkId → 文件名映射写死或生成函数
请求路径前缀从哪来?__webpack_require__.p(publicPath)通常来自 output.publicPath 配置
publicPath 是相对路径怎么办?runtime 会尝试推断(script.src 位置)现代 webpack 5 有比较智能的推断逻辑
CDN + 版本号怎么办?output.publicPath = ‘https://cdn.com/v1.2.3/’直接写死或通过环境变量注入
如何知道 chunk 加载成功了?script.onload + JSONP 回调chunk 内部会调用 webpackJsonp.push
多个 chunk 同时加载会不会冲突?webpackJsonp 是全局数组,push 的时候带 chunkId基本不会冲突
开发环境和生产环境的区别?开发环境通常用 webpack-dev-server 的内存文件系统 + sockjs生产环境才是真正的 .js 文件请求

2024-2025 年现代趋势对比表

方式chunk 名控制方式publicPath 处理推荐场景备注
JSONP(默认)webpackChunkName / id自动推断 + 配置绝大多数项目兼容性最好
importScripts基本不用Service Worker特殊场景
SystemJS/Federation远程模块名由 host 决定Module Federation微前端
ESM + import()浏览器原生type=“module”实验性、全 ESM 项目未来方向,但目前还需 polyfill

总结一句话

Webpack 异步 chunk 的加载机制本质上是:
通过运行时注入的__webpack_require__.e函数 + chunkId → 文件名映射 + publicPath 前缀,动态创建<script>标签去请求对应的 js 文件,文件执行后通过全局 webpackJsonp 回调通知 webpack 该 chunk 已就绪。

如果你想深入了解某个特殊场景(CDN 部署、Module Federation、publicPath 动态计算、chunk loading 错误重试、预加载 prefetch/preload 等),可以告诉我,我可以继续展开说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OLAP在大数据营销分析中的关键作用

OLAP在大数据营销分析中的关键作用&#xff1a;从原理到实战的深度解析 引言&#xff1a;当营销分析遇到“数据困境” 想象一个场景&#xff1a;某电商公司的营销总监正在筹备618大促。他想知道&#xff1a; 近30天来自抖音渠道、25-35岁女性、浏览过护肤品但未下单的用户有…

2026年口碑好的市政路灯,新农村路灯,锂电太阳能路灯厂家实力品牌推荐榜 - 品牌鉴赏师

引言在我国城市建设与发展的进程中,路灯作为必不可少的基础设施,其质量、性能与节能环保等特性愈发受到关注。国内相关行业协会为了引导市场健康发展、规范路灯企业的生产销售行为,依据一系列科学、严谨的测评方法,…

ArkTS问题:怎么提升代码的优先级呢?

ArkTS问题:怎么提升代码的优先级呢?如题,现在我这边有个问题。 代码片段: ... this.firstFunction(); this.secondFunction(); this.thirdFunction(); ... 现在,出现的情况就是,firstFunction()必须得执行完成,…

2026年有实力的草坪灯,景观灯,景观灯厂家口碑品牌推荐榜 - 品牌鉴赏师

引言在城市化进程不断加速的今天,景观灯和草坪灯作为城市夜景照明与景观营造的重要元素,其品质和性能愈发受到关注。为了给消费者提供客观、公正的品牌参考,我们依据景观灯协会公开的数据形成的指南,结合国内相关行…

LeeCode_476 数字的补数

476. 数字的补数 对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。 例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到…

2026国内最新爆款裤料品牌top10推荐!广东广州等地优质裤料供应商权威榜单发布,创新工艺与品质保障助力服饰产业升级 - 品牌推荐2026

2026最新爆款裤料推荐!国内优质裤料供应商权威榜单发布,创新工艺与品质保障助力服饰产业升级 广州/广东爆款裤料服务公司推荐 引言 随着快时尚产业迭代加速与消费需求个性化升级,服饰品牌对裤装面料的功能性、定制灵…

51单片机_SPI

51单片机_SPI 一、SPI 时序初步认识 UART、I2C 和 SPI 是单片机系统中最常见的三种协议。SPI 是英文 Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口。SPI 是一种高速的、全双工、同步通信总线,标…

零成本搭建全球加速后端!Cloudflare Workers + 国内优化,小白也能30分钟搞定

一、准备工作 1.1 注册Cloudflare账号 首先需要注册一个Cloudflare账号,可以用Google、GitHub等账号,Cloudflare提供免费计划,有数据库、对象存储等完全足够个人项目使用。 1.2 准备域名 自备一个域名,可以使用阿…

轮廓系数(Silhouette Score)量化K-Means聚类效果的核心指标

在K-Means聚类中,仅靠可视化判断聚类效果不够精准(尤其是高维数据),而**轮廓系数(Silhouette Score)** 是衡量聚类质量的黄金指标——它能从“同类紧致性”和“异类分离度”两个维度,用数值量化聚类的好坏,帮你…

BeautifulSoup-cnblog

BeautifulSoup ​ 蔬菜网 ​ (完整代码再文后) ​ 首先再基础的部分,和re正则不同的是,我们要先对拿到的网页源代码进行解析。 ​ 接着我们观察一下源代码,这里我们要爬的是网页中蔬菜的价格。 我们可以发现所…

方框标定代码

import numpy as np import cv2 import glob# 1. 准备标定板参数 chessboard_size (7, 10) # 内角点数量 square_size 13.0 # 毫米# 2. 生成世界坐标系中的3D点 objp np.zeros((chessboard_size[0]*chessboard_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:chessboa…

揭秘TCP/IP协议栈:网络通信的核心架构

TCP/IP协议栈深度解析技术文章大纲引言简要介绍TCP/IP协议栈的历史背景、重要性及其在现代网络通信中的核心作用。TCP/IP协议栈的分层结构详细说明TCP/IP的四层模型&#xff08;应用层、传输层、网络层、链路层&#xff09;及其与OSI七层模型的对比。链路层&#xff08;数据链路…

揭秘TCP/IP协议栈:网络通信的核心架构

TCP/IP协议栈深度解析技术文章大纲引言简要介绍TCP/IP协议栈的历史背景、重要性及其在现代网络通信中的核心作用。TCP/IP协议栈的分层结构详细说明TCP/IP的四层模型&#xff08;应用层、传输层、网络层、链路层&#xff09;及其与OSI七层模型的对比。链路层&#xff08;数据链路…

捕捉瞬息万变的电信号世界:Waverunner力科610Zi示波器深度解读

156/2558/3328产品概述&#xff1a;在电子工程师的实验室里&#xff0c;每一块电路板的心跳与脉动——那些高速流动、转瞬即逝的电信号——决定了产品的性能与成败。如何精准“看见”并理解这些复杂的信号&#xff0c;尤其是捕捉那些隐蔽极深、稍纵即逝的异常&#xff1f;力科&…

vscode的几个版本说明

Stable稳定版(蓝色版)、Insider内测版(绿色版)、Exploration探索版(橙色版)橙色版目前只提供给VSCode开发团队使用&#xff0c;而绿色版的核心价值在于“抢先体验前沿功能”。绿色版1.默认支持 Copilot X 全功能&#xff1b;2.终端增强&#xff1a;多面板拆分与实时预览&#x…

存储技术全景:从基础原理到未来趋势

系统存储机制深度剖析技术文章大纲存储基础概念与分类存储介质类型&#xff08;机械硬盘、固态硬盘、非易失性内存等&#xff09;存储层次结构&#xff08;寄存器、缓存、主存、外存&#xff09;存储访问方式&#xff08;随机访问、顺序访问&#xff09;物理存储机制磁盘结构&a…

存储技术全景:从基础原理到未来趋势

系统存储机制深度剖析技术文章大纲存储基础概念与分类存储介质类型&#xff08;机械硬盘、固态硬盘、非易失性内存等&#xff09;存储层次结构&#xff08;寄存器、缓存、主存、外存&#xff09;存储访问方式&#xff08;随机访问、顺序访问&#xff09;物理存储机制磁盘结构&a…

C++跨平台开发:挑战与解决方案

C跨平台开发的核心挑战平台差异性处理 硬件架构差异&#xff08;x86/ARM等&#xff09;导致的内存对齐、字节序问题 操作系统API差异&#xff08;Windows/Linux/macOS系统调用、文件路径等&#xff09; 编译器兼容性问题&#xff08;GCC/Clang/MSVC对C标准的支持程度不同&#…

C++跨平台开发:挑战与解决方案

C跨平台开发的核心挑战平台差异性处理 硬件架构差异&#xff08;x86/ARM等&#xff09;导致的内存对齐、字节序问题 操作系统API差异&#xff08;Windows/Linux/macOS系统调用、文件路径等&#xff09; 编译器兼容性问题&#xff08;GCC/Clang/MSVC对C标准的支持程度不同&#…

Java性能优化实战:从原理到技巧

Java性能优化实战技术文章大纲性能优化的基础概念性能优化的定义与重要性性能指标&#xff1a;吞吐量、延迟、资源利用率常见性能瓶颈&#xff1a;CPU、内存、I/O、网络JVM层面的优化垃圾回收器选择与调优&#xff08;G1、ZGC、Shenandoah&#xff09;堆内存与元空间参数配置&a…