Что делает config.set в карме?

В чем разница между этими двумя модулями . export = function ( config ) { config . set ({ basePath : '../ ..' , рамки : [ 'jasmine' ], }); }; файлов?

module.exports = function(config) {
  config.basePath = '../..';
  config.frameworks = ['jasmine'];
};

а также

config.set

Второй - более короткий и читаемый, но первый используется во всей документации. Зачем?

javascript,configuration,karma-runner,

1

Ответов: 1


3 принят

Короткий ответ

Использование, setа не запись отдельных назначений, таких как ваш второй фрагмент кода, является вопросом удобства. Это позволяет нам написать конфигурацию, не беспокоясь о несущественных подробностях о том, как Karma создает исходный объект конфигурации.

объяснение

Если вы посмотрите на источник , вы увидите реализацию метода: this.set = function (newConfig) { _.merge(config, newConfig, function (obj, src) { // Overwrite arrays to keep consistent with #283 if (_.isArray(src)) { return src } }) }

merge

Он использует mergeметод Лодаша . (Обратите внимание, что это было config.set(otherConfig)изменено в Lodash 4.x и более. На момент написания статьи Karma ограничивает установку Lodash, которую он использует, чтобы быть в серии 3.x.)

mergeМетод делает это так , что при вызове configон сочетает в себе разумно значения configи otherConfig. Это вопрос удобства. Вы можете написать config.foo.bar = somethingдля каждого значения, если хотите, но тогда вам придется беспокоиться о том, имеют ли значения, которые вы устанавливаете, по умолчанию или нет.

Например, если я это сделаю, мне не нужно беспокоиться о том, clientчто уже определено и какие ключи могут существовать на нем:

config.set({
    client: {
        captureConsole: false,
    },
});

Конечным результатом является то, что я отключен captureConsoleот trueзначения по умолчанию, а остальная часть параметра clientконфигурации остается по умолчанию. Если я наивно сделал это:

config.client = {
    captureConsole: false,
};

Я бы удалял другие значения, которые установлены config.clientпо умолчанию (например useIframe, clearContextи т. Д.). Конечно, я мог бы сделать это:

config.client.captureConsole = false;

И это сработало бы: другие значения, определенные на config.client, останутся нетронутыми. Однако объект конфигурации по умолчанию, созданный Karma, не имеет значений, определенных для всех возможных параметров, которые вы можете установить. Например, если бы я сделал:

config.customPreprocessors.babelModule = { ... };

Я столкнулся с ошибкой, потому что для значения по умолчанию нет customPreprocessors. Я должен был бы сделать это вместо этого:

config.customPreprocessors = {
    babelModule: { ... },
};

Использование config.setпозволяет нам не беспокоиться об этих деталях:

config.set({
    client: {
        captureConsole: false,
    },
    customPreprocessor: {
        babelModule: { ... },
    },
});
JavaScript, конфигурация, карма-бегун,
Похожие вопросы