什么是配置.在因果报应中做

What does config.set do in Karma?

本文关键字:因果报应 配置 什么      更新时间:2023-09-26

这两个配置文件有什么不同?

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

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

第二个更短,可读性更强,但第一个在整个文档中使用。为什么?

简短回答

使用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
      }
    })
  }

使用Lodash的merge方法。(注意,merge在Lodash 4中发生了变化。X及以上。在撰写本文时,Karma将Lodash的安装限制在3。x系列。)

merge方法使得当您调用config.set(otherConfig)时,它会智能地组合configotherConfig的值。这是一个方便的问题。如果你愿意,你可以为每个值写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: { ... },
    },
});