NodeJS和Javascript(requirejs)依赖注入

Chi*_*hin 6 javascript dependency-injection node.js requirejs express

我目前正在使用requirejs来管理模块js/css依赖项.我想发现节点通过集中配置文件执行此操作的可能性.所以不要手动做类似的事情

define([    
'jquery'
'lib/somelib'
'views/someview']
Run Code Online (Sandbox Code Playgroud)

在每个模块内.

我有节点注入依赖关系,即

require('moduleA').setDeps('jquery','lib/somelib','views/someview')
Run Code Online (Sandbox Code Playgroud)

无论如何,我对任何寻找节点依赖注入的项目感兴趣.

谢谢

Nat*_*nes 6

我想出了依赖注入的解决方案.它被称为injectr,它使用节点vm库并替换require包含文件时的默认功能.

所以在你的测试中,而不是require('libToTest')使用injectr('libToTest' { 'libToMock' : myMock });.我想让界面尽可能简单,不需要改变被测试的代码.我觉得它运作得很好.

值得注意的是,injectr文件是相对于工作目录的,与require相对于当前文件不同,但这并不重要,因为它仅用于测试.


Rub*_*rgh 5

我以前玩过这样的想法,即require在Node.js 中提供一种替代方法来提供一种依赖注入形式.

模块代码

例如,假设您在code.js中有以下语句:fs = require('fs');

console.log(fs.readFileSync('text.txt', 'utf-8'));
Run Code Online (Sandbox Code Playgroud)

如果运行此代码node code.js,则会打印出text.txt的内容.

注射器代码

但是,假设您有一个想要抽象掉文件系统的测试模块.
您的测试文件test.js可能如下所示:

var origRequire = global.require;
global.require = dependencyLookup;
require('./code.js');

function dependencyLookup (file) {
  switch (file) {
    case 'fs': return { readFileSync: function () { return "test contents"; } };
    default: return origRequire(file);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你现在运行node test.js,它会打印出" 测试内容 ",即使它包括code.js.