【Webpack】Webpack 中 jsonp 的使用

server/2024/10/18 12:25:17/

Webpack 在处理模块加载时会使用 JSONP(JSON with Padding)技术,特别是在动态加载(异步加载)模块的场景中。

JSONP 在 Webpack 中的作用

Webpack 使用 JSONP 来实现代码拆分和按需加载。这种技术使得浏览器可以通过插入 <script> 标签来动态加载其他模块。因为 <script> 标签不会受到跨域限制,Webpack 可以利用 JSONP 来加载分离的模块文件。

具体使用场景:
  1. 代码分割(Code Splitting)和懒加载(Lazy Loading)
    当你使用 import() 动态导入模块时,Webpack 会将这个模块拆分为一个单独的包,并且在运行时通过 JSONP 加载该包。

    import('./module').then(module => {// 使用动态导入的模块
    });
    

    Webpack 在后台会生成多个文件,每个文件对应一个拆分后的模块。它通过 JSONP 加载这些文件,确保它们被正确地加载和执行。

  2. Chunk 加载
    当 Webpack 生成多个 chunk 时,主文件会包含一个 JSONP 回调函数。在需要加载某个 chunk 时,Webpack 会创建一个 <script> 标签指向相应的文件,文件加载后通过 JSONP 回调函数执行代码。

    Webpack 内部有一个叫做 jsonpScriptSrc 的函数来生成 <script> 标签,用于加载需要的 chunk。它的基本工作流程如下:

    • Webpack 运行时通过 <script> 标签加载 chunk 文件。
    • chunk 文件加载后会通过 JSONP 回调,将模块挂载到 Webpack 的运行时中,完成模块注册。
  3. 运行时加载机制
    在 Webpack 生成的 bundle 文件中,运行时会为动态导入的模块和其他按需加载的资源设置 JSONP 加载机制。每个 chunk 文件加载完成后会触发 Webpack 注册的回调,将该模块的导出值插入到依赖图中,使得其他模块可以访问到该值。

Webpack 中 JSONP 的实现原理

Webpack 运行时主要做了以下几件事来实现 JSONP:

  1. 动态创建 <script> 标签:当需要加载某个模块时,Webpack 通过 JavaScript 动态生成一个 <script> 标签,设置其 src 属性为需要加载的 chunk 文件的 URL。

  2. JSONP 回调机制:Webpack 会为每个 chunk 文件设置一个全局回调函数,当 chunk 文件加载完毕时,会执行这个回调来通知 Webpack 该模块已经加载完成。

  3. 模块注册:当回调函数被执行时,Webpack 会将新加载的模块注册到模块系统中,并将其标记为已加载,防止重复加载。

示例

在一个 Webpack 打包项目中,假设有两个 chunk 文件:main.js0.js(动态加载的模块),Webpack 会为动态加载的模块生成如下结构的代码:

// 在 main.js 中
var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
jsonpArray.push([[0], {"./src/lazy.js": function (module, exports, __webpack_require__) {// 这里是模块的代码}
}]);// 在 0.js 中
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0], {"./src/lazy.js": function (module, exports, __webpack_require__) {// 这里是被动态加载的模块}
}]);

总结

Webpack 使用了 JSONP 技术,特别是在实现代码分割和动态加载模块时。JSONP 通过 <script> 标签加载模块,并在加载完成后执行回调函数,完成模块的加载和注册。


http://www.ppmy.cn/server/130786.html

相关文章

【C++】基于红黑树封装set和map

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、更高维度的泛型二、模版参数三、比较逻辑的重写四、迭代器4.1 const迭代器4.2 重载4.3 - -重载 五、完整代…

【分布式微服务云原生】深入探究:多分片键下的分库分表策略

深入探究&#xff1a;多分片键下的分库分表策略 摘要&#xff1a; 在大数据时代&#xff0c;数据库的分库分表策略对于提升性能和可扩展性至关重要。本文将深入探讨在存在多个分片键时&#xff0c;选择冗余全量还是只冗余关系索引表的策略&#xff0c;并分析这两种策略的优缺点…

1129.统计数字字符个数(vs2022中 gets, gets_s 无法使用的情况下)

题目描述 输入一行字符&#xff0c;统计出其中数字字符的个数。 输入 一行字符串&#xff0c;总长度不超过255。 输出 输出为1行&#xff0c;输出字符串里面数字字符的个数。 样例 输入数据 1 Peking University is set up at 1898.输出数据 1 4 #include <iostrea…

FPGA时序分析和约束学习笔记(2、FPGA时序传输模型)

Tclk1TcoTdata < Tclk Tclk2 -Tsu Slack Tskew Tclk - Tsu - Tdata - Tco Skew时钟偏斜&#xff1a;时钟从源端口出发&#xff0c;到达目的寄存器和源寄存器的时间差值&#xff08;Tclk2-Tclk1&#xff09; Tsu建立时间&#xff1a;目的寄存器自身的特性决定&#xff…

SQL 中UPDATE 和 DELETE 语句的深入理解与应用

在 SQL 中&#xff0c;UPDATE和DELETE语句是用于操作表数据的重要工具&#xff0c;它们允许我们对已存在的数据进行修改和删除。 一、UPDATE 语句 &#xff08;一&#xff09;基本语法 UPDATE语句的基本语法如下&#xff1a; UPDATE table_name SET column1 value1, colum…

React复习

文章目录 常用的HooksuseStateuseReduceruseRefuseContextuseMemouseCallbackuseEffect 组件通信Props&#xff08;属性&#xff09;Ref&#xff08;引用&#xff09;Context&#xff08;上下文&#xff09;State&#xff08;状态&#xff09;回调函数Event Bus&#xff08;事件…

【AIGC】OpenAI 宣布推出Whisper large-v3-turbo 语音转录模型 速度提高了8倍

OpenAI 宣布推出了一个名为 large-v3-turbo&#xff08;简称 turbo&#xff09;的新 Whisper 模型。这是 Whisper large-v3 的优化版本&#xff0c;将解码器层数从大型模型的 32 层减少到与 tiny 模型相同的 4 层。此优化版本的开发受到了 Distil-Whisper 的启发&#xff0c;后…

区块链到底是什么?

区块链是一种分布式、数字化的、不可篡改的账本&#xff0c;用于记录交易和以安全透明的方式存储数据。它基于一个去中心化的节点网络&#xff0c;这些节点共同维护一个权威记录&#xff0c;允许参与者直接与协议交互&#xff0c;而无需中介服务商。 区块是一种容器数据结构&a…