1. 程式人生 > >defaults(預設配置)和mergeConfig(合併config方法)

defaults(預設配置)和mergeConfig(合併config方法)

axios學習筆記defaults(預設配置)和mergeConfig(合併config方法)

原始碼地址

找到入口檔案

axios/lib/axios.js

    ...
    var mergeConfig  =  require('./core/mergeConfig');`
    var defaults = require('./defaults')`
    ...

學習mergeConfig

axios/lib/core/mergeConfig.js

    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;
    }