Что делает config.set в Karma?

#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: { ... },
    },
});