node.js - 为 Nodejs 应用程序编写插件的教程?

标签 node.js plugins npm karma-runner

我发现很难找到一个关于为 NodeJS 应用程序编写插件的好教程(不是为 NodeJS 本身!)。

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

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

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

这在我的机器上运行得很好,但是,对于 CI 服务器来说这可能是一个问题。我不想在我们自己的项目中包含所有 karma 代码。我想从服务器上的公共(public)存储库安装 karma,并且只在我们的项目中包含 myreporter.js,这样我们就不必为每个构建安装修改后的 karma。我只想安装 myreporter.js 作为构建的 karma 插件。

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

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

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

更新:

尝试了对等依赖,看来 karma 0.8.6 没有选择我的插件。看起来从 0.9 karma 开始使用 di ,我想那就是它开始支持插件的时候了。然而,0.9.3仍然不是一个稳定的版本。

最佳答案

我自己找到了答案。如果应用程序本身不明确支持插件,则可能无法为通用 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.jsreporter.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());

关于node.js - 为 Nodejs 应用程序编写插件的教程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355025/

相关文章:

javascript - 如何在 Yeoman 生成器的 enquirer.js 多选提示中添加分隔符?

java - 如何使用 NSIS 互联网插件?

mysql - res.cookie() 在与 mysql 连接后没有

mysql - nodejs mysql参数查询失败

javascript - 使用nodejs fs 模块将路径添加到文件名中?

scala - IntelliJ IDEA Scala 插件问题

Gradle 如何在包含的通用构建脚本中使用插件

node.js - 为什么我的 npm 需要几个小时才能安装依赖项?

angular - NPM 包 : Referring to assets within the package

node.js - npm install -g yo 隧道套接字错误