axios学习笔记defaults(默认配置)和mergeConfig(合并config方法)
源码地址
找到入口文件
...
var mergeConfig = require('./core/mergeConfig');`
var defaults = require('./defaults')`
...
学习mergeConfig
var utils = require('../utils')//引入公用方法
// 合并 config1 和config2,并将一些默认配置项放到config中
function mergeConfig(config1, config2) {
config2 = config2 || {};
var config = {}
//默认配置参数字段
//从config2中拿到config里的字段
var valueFromConfig2Keys = ['url', 'method', 'params', 'data'];
//合并config1和config2中的这些字段,config2优先
var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy'];
// 从config2中拿到default的字段
var defaultToConfig2Keys = [
'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer',
'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',
'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress',
'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent',
'httpsAgent', 'cancelToken', 'socketPath'
];
//将config2中valueFromConfig2Key里存在的项复制config对象里
utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop){//prop为valueFromConfig2Keyd中的具体每项的值
if(typeof config2[prop] !== 'undefined'){
config[prop] = config2[prop];
}
})
utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop){
if(utils.isObject(config2[prop])){//如果config2[prop]为对象,进行深度合并
config[prop] = utils.deepMerge(config1[prop], config2[prop]);//此处确保了config1[prop]的存在
} else if(typeof config2[prop] != 'undefiend') {//config2[prop]存在且不为对象,直接赋值
config[prop] = config2[prop];
} else if(utils.isObect(config1[prop])){//config2[prop]不存在但config1[prop]存在且为对象
config[prop] = utils.deepMerge(config1[prop]);
} eles {//config2[prop]不存在且config1[prop]不为对象
config[prop] = config1[prop];
}
})
// 从config2中拿到default的字段,如果没有去config1中拿字段
utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop){
if(typeof config2[prop] !== 'undefined'){
config[prop] = config2[prop];
} else {
config[prop] = config1[prop]
}
})
//合并所有关键字
var axiosKeys = valueFromConfig2Keys.concat(mergeDeepPropeotiesKeys).cancat(defaultToConfig2Key2);
//找出存在config2中不同于默认配置项的项,并加到config上去
var otherKeys = Object.keys(config2).filter(function filterAxiosKeys(key){
return axiosKeys.indexOf(key) === -1
});
utils.forEach(otherKey2, function other(prop){
if(typeof config2[prop] !== 'undefined' || typeof config1[prop] !== 'undefined'){
config[prop] = config2[prop] || config1[prop];
}
})
//返回拼接后的对象
return config;
}