Common.js和Node.js的工厂模式

我明白了,我希望有一个工厂在一个地方pipe理我所有模块的依赖关系,而不是在我的代码中使用大量的语句。

我已经看过一些依赖于AMD的方法,但是我想知道如何使用node.js / express与OOB模块加载器(我认为它使用common.js)结合使用。

我一直在想着做这样的事情:

module.exports = { lib:[], load:function(name){ if(this.lib[name]!==undefined && this.lib[name]!==null){ return this.lib[name]; } switch(name) { case 'express': this.lib[name] = require('express'); break; case 'morgan': this.lib[name] = require('morgan'); break; case 'body-parser': this.lib[name] = require('body-parser'); break; } console.log(this.lib); return this.lib[name]; } }; 

有人说这不仅仅是一个工厂的中介模式,我只是想说明一下我的观点。

我的基本要求是处理来自系统中单个位置的所有依赖关系,如果需要更改依赖关系,则只需在此文件上对其进行更改,然后通过整个系统自动更新。

那么有没有更好的方法来处理这个问题? 任何已经完成这个方法的实现?

谢谢!

从技术上讲,这是require()在内部做的事情。

 require('foo'); require('foo') 

保证它只会加载和运行foo一次。 第二次调用将从内部数组中返回一个caching副本。

您可以通过要求JS文件或节点模块来重新导出实际使用的模块来实现相同的命名间接(和API适配器,如果您决定更改实现而不更改调用方)(例如require('./my-express-wrapper')而不是require('express') )。

如果我需要改变一个依赖关系,我只是改变它在这个文件,并自动更新整个系统。

我担心这会导致代码令人惊讶:

 require('factory').load('body-parser'); // loads Formidable!? 

我觉得有这样一个间接的层面没有什么好处:

  • 即使在最好的情况下,它也可以节省很less的工作,因为在大多数文本编辑器中,项目全局find require('foo')require('bar')是一件容易的事情。

  • replace模块(这不太可能100%兼容)的困难部分是让现有的代码正确地使用它。 这不能通过使用工厂模式来避免。 您需要以任何一种方式编写适配器,有时甚至可能更好地改变模块的使用,而不是为可能不太好的API编写模拟层。