为nodejs app编写插件的教程?

时间:2013-06-27 23:42:35

标签: node.js plugins npm karma-runner

我很难找到一个关于为nodejs app编写插件的好教程(不适用于nodejs本身!)。

我想要做的是,对于某些nodejs应用程序,我想用我写的几个js文件来扩展它的功能。

例如,我使用karma runner来运行JS单元测试,但是现有的记者不能很好地满足我们的日志记录要求。所以我写了自己的记者并把它放在一个单独的js文件中,例如的 myreporter.js 即可。要立即使用它,我必须将 myreporter.js 添加到karma代码的文件夹中,并将这样的一行添加到karma的 reporter.js 中:

exports.myreporter = require('./reporters/myreporter');

这在我的机器上运行良好,但是,它可能是CI服务器的问题。我不想在我们自己的项目中包含所有业力代码。我想在服务器上安装来自公共仓库的业力,并且只在我们的项目中包含myreporter.js,这样我们就不必为每个构建安装修改后的业力。我只想安装myreporter.js作为构建的业力插件。

我不确定这是否足够清楚。所以我需要的是为业力或任何现有的nodejs应用程序编写插件。我仍然可以像以前一样使用应用程序,而我可以使用插件带来的新功能。

我看到this page关于 peerdependency 。这是否意味着如果我将peerdependency或karma添加到myreporter.js的package.json文件中,一旦我安装了myreporter包并运行karma,karma会选择新的记者吗?

感谢您对这个长期问题的任何帮助。

更新

尝试了同行依赖性,似乎业力0.8.6并没有选择我的插件。看起来像0.9 karma开始使用di,我猜这是它开始支持插件的时候。但是,0.9.3仍然不是一个稳定的版本。

1 个答案:

答案 0 :(得分:2)

自己找到答案。如果应用程序本身没有明确支持插件,有可能无法为通用nodejs应用程序编写插件。

但是,更改应用程序以支持插件非常容易。唯一要做的就是使用功能强大的“require”来获取带有名称的插件模块。例如,在Karma 0.9.4(最新版本)中,它有plugin.js加载所有插件模块:

...
var requirePlugin = function(name) {
    log.debug('Loading plugin %s.', name);
    try {
      modules.push(require(name));  // Call require here!
    } catch (e) {
      if (e.code === 'MODULE_NOT_FOUND' && e.message.indexOf(name) !== -1) {
        log.warn('Cannot find plugin "%s".\n  Did you forget to install it ?\n' +
                 '  npm install %s --save-dev', name, name);
      } else {
        log.warn('Error during loading "%s" plugin:\n  %s', name, e.message);
      }
    }
  };

所有自定义插件都可以在 conf.js 文件中设置,如下所示:

...
plugins: ['you-own-plugin'],
...

要编写自己的插件,请查看the Karma github,有很多针对Karma的插件示例。

不幸的是,最新稳定版的Karma(0.8.6)不支持外部插件。我必须自己修改 preprocessor.js reporter.js 以支持自定义预处理器和记者。我提供下面的更改,这是一个简单的更改,但不是真的推荐。

//preprocessor.js line 26
processor = exports[processorName] || require(processorName.toLowerCase())

//reporter.js line 48
var Reporter = exports[helper.ucFirst(name) + (config.colors ? 'Color' : '')] || require(name.toLowerCase());
相关问题