config.set 在 Karma 中有什么作用?

Pau*_*per 2 javascript configuration karma-runner

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

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

module.exports = function(config) {
  config.basePath = '../..';
  config.frameworks = ['jasmine'];
};
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*uis 5

简答

使用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
      }
    })
  }
Run Code Online (Sandbox Code Playgroud)

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

merge方法使得当您调用config.set(otherConfig)它时智能地组合config和的值otherConfig。这是一个方便的问题。config.foo.bar = something如果需要,您可以为每个值编写,但是您必须担心您设置的值是否已经具有默认值。

例如,如果我这样做,我就不必担心是否client已定义以及其上可能存在哪些键:

config.set({
    client: {
        captureConsole: false,
    },
});
Run Code Online (Sandbox Code Playgroud)

最终结果是我captureConsole从其true默认值关闭,而其余client配置选项保持其默认值。如果我天真地这样做:

config.client = {
    captureConsole: false,
};
Run Code Online (Sandbox Code Playgroud)

我会消除那些在设置其他值config.client默认情况下(如useIframeclearContext等)。当然,我可以这样做:

config.client.captureConsole = false;
Run Code Online (Sandbox Code Playgroud)

它会起作用:定义的其他值config.client将保持不变。但是,Karma 创建的默认配置对象没有为您可以设置的所有可能选项定义值。例如,如果我这样做:

config.customPreprocessors.babelModule = { ... };
Run Code Online (Sandbox Code Playgroud)

我会遇到错误,因为customPreprocessors. 我不得不这样做:

config.customPreprocessors = {
    babelModule: { ... },
};
Run Code Online (Sandbox Code Playgroud)

使用config.set使我们不必担心这些细节:

config.set({
    client: {
        captureConsole: false,
    },
    customPreprocessor: {
        babelModule: { ... },
    },
});
Run Code Online (Sandbox Code Playgroud)