传送门:node
axios是时下最流行的http请求库,能够用于浏览器环境与nodejs环境。目前axios的最近版本是0.18.0
,本文所分析的源码也是该版本。ios
axios的主要特征包括:git
xhr
请求http
请求Promise
APIaxios基本用法github
axios.get('/user?ID=12345') .then(function (response) { // handle success console.log(response); }) .catch(function (error) { // handle error console.log(error); }) .then(function () { // always executed });
axios的具体使用方法见GitHub。axios
├── /lib/ # 项目源码目 │ ├── /adapters/ # 定义发送请求的适配器 │ │ ├── http.js # node环境http对象 │ │ └── xhr.js # 浏览器环境XML对象 │ ├── /cancel/ # 定义取消功能 │ ├── /helpers/ # 一些辅助方法 │ ├── /core/ # 一些核心功能 │ │ ├── Axios.js # axios实例构造函数 │ │ ├── createError.js # 抛出错误 │ │ ├── dispatchRequest.js # 用来调用http请求适配器方法发送请求 │ │ ├── InterceptorManager.js # 拦截器管理器 │ │ ├── mergeConfig.js # 合并参数 │ │ ├── settle.js # 根据http响应状态,改变Promise的状态 │ │ └── transformData.js # 改变数据格式 │ ├── axios.js # 入口,建立构造函数 │ ├── defaults.js # 默认配置 │ └── utils.js # 公用工具
// /lib/axios.js /* ... */ var defaults = require('./defaults'); /* ... */ var axios = createInstance(defaults); /* ... */ module.exports = axios;
在入口文件中,能够看到经过createInstance
方法建立了axios对象,而后将其导出,其中defaults
是默认的配置。segmentfault
createInstance
方法的具体实现:promise
function createInstance(defaultConfig) { // 建立一个Axios类的实例,获得一个上下文环境 // 包含defaults配置与拦截器(详见/lib/core/Axios.js) var context = new Axios(defaultConfig); // instance是一个函数(request请求方法) // this绑定到context上下文 var instance = bind(Axios.prototype.request, context); // 将Axios.prototype的各方法绑定到instance上 // 其中this做用域为context上下文 utils.extend(instance, Axios.prototype, context); // 将context中的属性(defaults与拦截器)绑定到instance实例中 utils.extend(instance, context); return instance; }
值得注意的是,入口文件导出的axios
并非Axios
类的实例,而是bind(Axios.prototype.request, context)
返回的一个函数,其中context
才是Axios
类的实例。浏览器
入口文件的其余代码以下:函数
// 将Axios类暴露出来(若是用户有使用的需求) axios.Axios = Axios; // 工厂函数,根据用户传入的配置,建立新的axios axios.create = function create(instanceConfig) { return createInstance(mergeConfig(axios.defaults, instanceConfig)); }; // 取消请求的方法 axios.Cancel = require('./cancel/Cancel'); axios.CancelToken = require('./cancel/CancelToken'); axios.isCancel = require('./cancel/isCancel'); // 处理并行请求的方法 axios.all = function all(promises) { return Promise.all(promises); }; axios.spread = require('./helpers/spread'); // 导出axios module.exports = axios; // 用于TypeScript module.exports.default = axios;