#javascript #configuration #karma-runner
#javascript #конфигурация #karma-runner
Вопрос:
В чем разница между этими двумя файлами конфигурации?
module.exports = function(config) {
config.set({
basePath: '../..',
frameworks: ['jasmine'],
});
};
и
module.exports = function(config) {
config.basePath = '../..';
config.frameworks = ['jasmine'];
};
Второй короче и более удобочитаем, но первый используется во всей документации. Почему?
Ответ №1:
Короткий ответ
Использование config.set
, а не написание отдельных назначений, как во втором фрагменте кода, — это вопрос удобства. Это позволяет нам писать конфигурацию, не беспокоясь о несущественных деталях того, как Karma создает начальный объект конфигурации.
Объяснение
Если вы посмотрите на исходный код, вы увидите, что реализация set
метода будет:
this.set = function (newConfig) {
_.merge(config, newConfig, function (obj, src) {
// Overwrite arrays to keep consistent with #283
if (_.isArray(src)) {
return src
}
})
}
Он использует merge
метод Lodash. (Обратите внимание, что это merge
изменилось в Lodash 4.x и выше. На момент написания Karma ограничивает установку используемого Lodash серией 3.x .)
merge
Метод делает так, что при вызове config.set(otherConfig)
он разумно объединяет значения 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: { ... },
},
});