【Webpack】Webpack 中 jsonp 的使用

ops/2024/10/18 18:18:04/

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/ops/124757.html

相关文章

【设计模式】装饰者模式

装饰者模式 角色和buff进行解释 步骤 角色和Buff共有一个Component&#xff0c;理解为有同一个操作&#xff0c;给予Buff里面可以填充角色。角色有一个基类&#xff0c;Buff有一个基类&#xff0c;因为有多种Buff 理解 不是常规理解上的给角色填装Buff&#xff0c;角色作为…

云原生后端

云原生后端 云原生后端是当今软件开发领域的一个重要概念&#xff0c;它代表了将软件应用程序容器化部署在云环境中&#xff0c;并采用微服务架构进行开发和管理的一种趋势。这种趋势的兴起&#xff0c;得益于云计算和微服务架构的快速发展&#xff0c;以及企业对高效、灵活、…

甲方安全和乙方安全的区别

信息安全工作&#xff0c;总会被人分成甲方和乙方&#xff0c;甲乙方原本只是商务层面需方和供方的代称&#xff0c;在安全领域&#xff0c;成了做公司内部安全和为客户提供安全的区别。 通常意义上&#xff0c;什么是甲方安全人员呢&#xff1f;就是在非安全业务的公司从事信…

MYSQL-windows安装配置两个或多个版本MYSQL

安装第一个mysql很简单&#xff0c;这里不再赘述。主要说说第二个怎么安装&#xff0c;服务怎么配置。 1. 从官网下载第二个MySQL并安装 一般都是免安装版了&#xff0c;下载解压到某个文件目录下(路径中尽量不要带空格或中文)&#xff0c;再新建一个my.ini文件&#xff08;或…

Linux 内核中USB鼠标枚举失败问题总结

一、环境&#xff1a; 机器平台&#xff1a;linux 内核版本&#xff1a;linux-3.4 二、问题&#xff1a; USB鼠标接入后报错&#xff0c;log显示设备无法枚举 usb 1-1: new low-speed USB device number 10 using musb-hdrc hub 1-0:1.0: unable to enumerate USB device o…

Django学习笔记之Django基础学习

Django笔记 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录…

【WebGIS】Cesium:Viewer 初始化、地图加载与基础交互

Cesium 是一个功能强大、基于 WebGL 的开源三维地球引擎&#xff0c;它允许用户在浏览器中渲染高性能的三维地图和地球。本文将带领新手入门 Cesium&#xff0c;学习如何初始化 Cesium Viewer&#xff0c;加载地图和地形&#xff0c;了解地球的基础交互操作&#xff0c;并掌握如…

RISC-V知识点目录

分支预测 分支预测概述https://blog.csdn.net/zhangshangjie1/article/details/136947089?sharetypeblogdetail&sharerId136947089&sharereferPC&sharesourcezhangshangjie1&spm1011.2480.3001.8118分支指令的方向预测https://blog.csdn.net/zhangshangjie1/a…