axios源码打包关于rollup.config.js文件分析

axios 项目下的rollup.config.js文件

const lib = require("./package.json");
const outputFileName = "axios";
const name = "axios";
const namedInput = "./index.js";
const defaultInput = "./lib/axios.js";
export default async () => {const year = new Date().getFullYear();const banner = `// Axios v${lib.version} Copyright (c) ${year} ${lib.author} and contributors`;return [// browser ESM bundle for CDN...buildConfig({input: namedInput, //'./index.js'output: {file: `dist/esm/${outputFileName}.js`, //outputFileName = 'axios;format: "esm", //-f, --format <format>   输出类型(amd、cjs、es、iife、umd、system)preferConst: true,exports: "named", //--exports <mode>    指定导出模式(auto、default、named、none)banner, //--banner <text>   在产物顶部插入的代码(位于包装器之外)},}),// Browser UMD bundle for CDN...buildConfig({input: defaultInput,es5: true,output: {file: `dist/${outputFileName}.js`,name,format: "umd",exports: "default",banner,},}),// Browser CJS bundle...buildConfig({input: defaultInput,es5: false,minifiedVersion: false,output: {file: `dist/browser/${name}.cjs`,name,format: "cjs",exports: "default",banner,},}),// Node.js commonjs bundle{input: defaultInput,output: {file: `dist/node/${name}.cjs`,format: "cjs",preferConst: true,exports: "default",banner,},plugins: [autoExternal(), resolve(), commonjs()],},];
};

buildConfig 函数

  • 接收一个参数,返回一个数组
const buildConfig = ({es5,browser = true,minifiedVersion = true,alias,...config
}) => {// 输出的文件名称已经路径const { file } = config.output;// path.extname() 方法返回 path 的扩展名,即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。const ext = path.extname(file);// path.basename() 方法返回 path 的最后一部分const basename = path.basename(file, ext);const extArr = ext.split(".");extArr.shift();const build = ({ minified }) => ({input: namedInput, // ./index.js...config,output: {...config.output,// path.dirname() 方法返回 path 的目录名file: `${path.dirname(file)}/${basename}.${(minified? ["min", ...extArr]: extArr).join(".")}`,},plugins: [aliasPlugin({entries: alias || [],}),json(),resolve({ browser }),commonjs(),minified && terser(),minified && bundleSize(),...(es5? [babel({babelHelpers: "bundled",presets: ["@babel/preset-env"],}),]: []),...(config.plugins || []),],});const configs = [build({ minified: false })];if (minifiedVersion) {configs.push(build({ minified: true }));}return configs;
};

umd 模块

UMDAMD + CommonJS 的结合体,同时还兼容了 script 标签引入,对组件库或框架库来说,解决了以前一套代码无法多端使用的难题。UMD 模块可借助 Rollup 工具来完成。

dist\axios.js
dist\axios.js.map
dist\axios.min.js
dist\axios.min.js.map

(function (global, factory) {typeof exports === "object" && typeof module !== "undefined"? (module.exports = factory()): typeof define === "function" && define.amd? define(factory): ((global =typeof globalThis !== "undefined" ? globalThis : global || self),(global.axios = factory()));
})(this, function () {"use strict";var axios = createInstance(defaults$1);// Expose Axios class to allow class inheritanceaxios.Axios = Axios$1;// Expose Cancel & CancelTokenaxios.CanceledError = CanceledError;axios.CancelToken = CancelToken$1;axios.isCancel = isCancel;axios.VERSION = VERSION;axios.toFormData = toFormData;// Expose AxiosError classaxios.AxiosError = AxiosError;// alias for CanceledError for backward compatibilityaxios.Cancel = axios.CanceledError;// Expose all/spreadaxios.all = function all(promises) {return Promise.all(promises);};axios.spread = spread;// Expose isAxiosErroraxios.isAxiosError = isAxiosError;// Expose mergeConfigaxios.mergeConfig = mergeConfig;axios.AxiosHeaders = AxiosHeaders$1;axios.formToJSON = function (thing) {return formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);};axios.getAdapter = adapters.getAdapter;axios.HttpStatusCode = HttpStatusCode$1;axios["default"] = axios;return axios;
});

可直接在 script 引入使用

也可例如 require 来使用

requirejs.config({baseUrl: "modules/",
});
require(["tools_umd"], function (tools) {console.log("tools", tools);
});

CommonJS(browser) 模块文件使用

dist\browser\axios.cjs

dist\browser\axios.cjs.map

axios.default = axios;module.exports = axios;
if (pathname === "/index.html") {pipeFileToResponse(res, "./client.html");
} else if (pathname === "/axios.js") {//pipeFileToResponse(res, "../dist/esm/axios.js", "text/javascript");
} else if (pathname === "/axios.js.map") {pipeFileToResponse(res, "../dist/esm/axios.js.map", "text/javascript");
}
function pipeFileToResponse(res, file, type) {if (type) {res.writeHead(200, {"Content-Type": type,});}fs.createReadStream(path.join(path.resolve(), "sandbox", file)).pipe(res);
}
<script src="/axios.js"></script>
<script>// 执行axios
</script>

## CommonJS(node) 模块

module.exports && require

dist\node\axios.cjs

dist\node\axios.cjs.map

//axios.cjs
(function (global, factory) {// typeof exports === "object" && typeof module !== "undefined"? (module.exports = factory())// 这段代码检查require.js是否存在,这是一个JavaScript依赖管理库。
// 如果'define'不是未定义的,并且它是一个函数,并且'amd'(异步模块定义)也被定义,那么代码假设require.js正在运行。: typeof define === "function" && define.amd? define(factory): ((global =typeof globalThis !== "undefined" ? globalThis : global || self),(global.axios = factory()));
})(this, function () {"use strict";var axios = createInstance(defaults$1);// Expose Axios class to allow class inheritanceaxios.Axios = Axios$1;// Expose Cancel & CancelTokenaxios.CanceledError = CanceledError;axios.CancelToken = CancelToken$1;axios.isCancel = isCancel;axios.VERSION = VERSION;axios.toFormData = toFormData;// Expose AxiosError classaxios.AxiosError = AxiosError;// alias for CanceledError for backward compatibilityaxios.Cancel = axios.CanceledError;// Expose all/spreadaxios.all = function all(promises) {return Promise.all(promises);};axios.spread = spread;// Expose isAxiosErroraxios.isAxiosError = isAxiosError;// Expose mergeConfigaxios.mergeConfig = mergeConfig;axios.AxiosHeaders = AxiosHeaders$1;axios.formToJSON = function (thing) {return formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);};axios.getAdapter = adapters.getAdapter;axios.HttpStatusCode = HttpStatusCode$1;axios["default"] = axios;return axios;
});

module.exports = factory() 是一种常见的模块导出模式,尤其在 CommonJS 环境中。

这种模式通常用于将模块的内部函数或对象导出,以便在模块外部使用。

这里的factory()通常是一个返回特定对象或函数的表达式,该对象或函数随后被赋值给module.exports

ES Modules 模块的文件使用

dist\esm\axios.js

dist\esm\axios.js.map

dist\esm\axios.min.js

dist\esm\axios.min.js.map

一个 JS 文件中,export 可以有无限个,但 export default 只能有一个。

const {Axios,AxiosError,CanceledError,isCancel,CancelToken,VERSION,all,Cancel,isAxiosError,spread,toFormData,AxiosHeaders,HttpStatusCode,formToJSON,getAdapter,mergeConfig,
} = axios$1;export {Axios,AxiosError,AxiosHeaders,Cancel,CancelToken,CanceledError,HttpStatusCode,VERSION,all,axios$1 as default,formToJSON,getAdapter,isAxiosError,isCancel,mergeConfig,spread,toFormData,
};
//# sourceMappingURL=axios.js.map
if (pathname === "/index.html") {pipeFileToResponse(res, "./client.html");
} else if (pathname === "/axios.js") {// text/javascriptpipeFileToResponse(res, "../dist/esm/axios.js", "application/javascript");
} else if (pathname === "/axios.js.map") {pipeFileToResponse(res, "../dist/esm/axios.js.map", "application/javascript");
}
function pipeFileToResponse(res, file, type) {if (type) {res.writeHead(200, {"Content-Type": type,});}fs.createReadStream(path.join(path.resolve(), "sandbox", file)).pipe(res);
}
<script type="module" src="/axios.js"></script>
<script type="module">import axios from "/axios.js";// 执行axios
</script>

AMD 模块

注意,AMD 只适用于浏览器,虽然也支持 Node,但不如 Node 自家的 CJS

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

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

相关文章

怎么彻底关闭Nacos?解决启动时Spring连接Nacos报错

Nacos Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是阿里巴巴开源的一个项目,旨在帮助您发现、配置和管理微服务。Nacos提供了一系列丰富的特性集合,支持服务发现和服务健康监测、动态配置服务、服务元数据和流量管理等功能。 主要功能 服务…

Steam社区101错误代码/steam社区报错、打不开怎么办

Steam社区是很多游戏玩家经常逛的一个互动空间&#xff0c;玩家可以在Steam社区了解游戏的相关评价&#xff0c;也可以在Steam社区和五湖四海的游戏玩家一起讨论最近游戏的心得&#xff0c;分享游玩技巧&#xff0c;探讨游戏战术等等&#xff0c;结识不同地区的玩家。不过很多玩…

【数据库原理】总结(期末版)

题型关系范式题[数据库原理]关系范式总结&#xff08;自用&#xff09;-CSDN博客事务分析题[数据库原理]事务-CSDN博客Sql题 MySQL:MySQL基本语法 Oracle:Oracle基本语法 ​​​​​​ 关系代数[数据库原理]关系代数-CSDN博客 sql里面主要是考增删改查授权撤销权限等内容&#…

Java案例实现双色球

一问题&#xff1a; 二具体代码&#xff1a; package 重修;import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {int []usersnumbersusernumslect();System.out.println("用户");for (int i 0; i <…

Kafka如何防止消息重复发送

Kafka 提供了几种方式来防止消息重复发送和处理。这些方式通常取决于生产者和消费者的设置和实现方式&#xff1a; 生产者端幂等性&#xff08;什么是幂等性&#xff09;&#xff1a; 幂等性生产者&#xff1a;从 Kafka 0.11 版本开始引入了生产者端的幂等性支持。生产者可以通…

力扣hot100 -- 贪心算法

&#x1f442; ▶ 逍遥叹 - 胡歌&沈以城【Mashup】 (163.com) &#x1f442; 庐州月 - 许嵩 - 单曲 - 网易云音乐 2.7 小时&#xff0c;加上写博客&#xff0c;4 道题&#xff0c;&#x1f602; -- 希望二刷时&#xff0c;可以 3 小时&#xff0c;8 道题.... 目录 &…

SVN到Git过渡中分支管理经验(值得收藏)!

背景&#xff1a; SVN过渡到Git&#xff0c;分享项目中分支管理的经验。 分支类型&#xff1a; master分支&#xff1a;作为主分支&#xff0c;只能通过release分支合并&#xff0c;且只能由特定管理员操作。开发人员不能直接推送代码到远程仓库的master分支。release分支&…

怎么找短视频素材在哪里找?推荐五个自媒体人必备的视频素材网站

自媒体时代&#xff0c;短视频创作已成为主流。高质量的视频素材不仅能够提升内容质量&#xff0c;还能增加观众的观看兴趣。本文将为各位自媒体创作者介绍五大必备的视频素材网站&#xff0c;帮助大家轻松解决素材寻找的困扰&#xff0c;确保视频内容的专业性和吸引力。 蛙学…

【第二套】华为 2024 年校招-硬件电源岗

1.为了避免 50Hz 的电⽹电压⼲扰放⼤器&#xff0c;应该⽤那种滤波器&#xff1a; A.带阻滤波器 B.带通滤波器 C.低通滤波器 D.⾼通滤波器 2.PID 中的 I 和 D 的作⽤分别是&#xff1f; A、消除静态误差和提⾼动态性能 B、消除静态误差和减⼩调节时间 C、提⾼动态性能和减⼩超调…

三步学会使用WebSocekt

目录 一 什么是websocket 二 如何使用websocket 1.导入websocket的maven坐标 2.创建websocket的服务类 3.创建websocket的配置类 4.按需求实现业务逻辑 5.前端实现websocket 一 什么是websocket websocket和HTTP一样是基于TCP的一个通信协议。不过他是支持客户端和服务端…

1688商品采集用什么?【1688采集API接口】无视大量复制-同行店铺采集-批量全店采集-包邮商品采集

功能亮点&#xff1a; 1688同行店铺采集&#xff0c;1688批量全店采集&#xff0c;1688包邮商品采集&#xff0c;仅采集一件代发产品&#xff0c;采集发货时间&#xff0c;比如48小时发货&#xff0c;1688运费价格采集:可以采集运费价格 功能介绍二&#xff1a; 仅采集一件代…

数据结构与算法笔记:高级篇 - 并行算法:如何利用并行处理提高算法的执行效率?

概述 时间复杂度是衡量算法执行效率的一种标准。但是&#xff0c;时间复杂度并不能跟性能划等号。在真是的软件开发中&#xff0c;即便在不降低时间复杂度的情况下&#xff0c;也可以通过一些优化手段&#xff0c;提升代码的执行效率。毕竟&#xff0c;对于实际的软件开发来说…

Android Compose 十二:常用组件列表 上拉加载

列表 上拉加载 当前思路 判断 列表最后一个显示的条目 为 数据集合的长度-1 用来记录刷新状态 var refreshing by remember {mutableStateOf(false)}数据集合 val list remember{List(10){"条目》》${it}"}.toMutableStateList()}用来记录列表当前状态及状态变化…

行业分析---造车新势力之极氪汽车

1 前言 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…

心跳机制简介

心跳机制 心跳机制&#xff08;Heartbeat Mechanism&#xff09;是一种用于监控和维护计算机系统、网络和分布式系统中各个节点之间连接状态的技术。它通过周期性地发送信号&#xff08;即“心跳”&#xff09;来确认系统组件之间的活跃性和可用性。如果某个节点没有在预期时间…

fastapi swagger js css 国内访问慢问题解决

fastapi swagger js css 国内访问慢问题解决 直接修改fastapi包中静态资源地址为如下地址 swagger_js_url: str "https://cdn.bootcdn.net/ajax/libs/swagger-ui/3.9.3/swagger-ui-bundle.js", swagger_css_url: str "https://cdn.bootcdn.net/ajax/libs/sw…

1971计算机毕业设计asp.net游乐园信息管理系统 VS开发access数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net游乐园信息管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net游乐园管理系统 二、功能介绍 前台功能&#xff1a; 1&#xff09;系统首页浏览 2&#xff09;园区通知浏…

leetcode-19-回溯-组合问题(剪枝、去重)

引自代码随想录 一、[77]组合 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4]] 1、大致逻辑 k为树的深度&#xff0c;到叶子节点的路径即为一个结果 开始索引保证不…

【计算机网络】网络层(作业)

【一】 1、某主机的 IP 地址为 166.199.99.96/19。若该主机向其所在网络发送广播 IP 数据报&#xff0c; 则目的地址可以是&#xff08;D&#xff09;。 A. 166.199.99.255B. 166.199.96.255C. 166.199.96.0D. 166.199.127.255 解析&#xff1a; 166.199.99.96/19166.199.0…

深入解读OkHttp3中的Dispatcher

OkHttp3是一个非常流行的HTTP客户端&#xff0c;用于与服务器通信。Dispatcher是OkHttp3中的一个关键组件&#xff0c;负责管理和调度请求。在这篇博客中&#xff0c;我们将深入探讨Dispatcher的工作原理、相关类的关系以及其实现细节。 什么是Dispatcher&#xff1f;&#x1…