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

时间:2015-02-05 16:36:32

标签: node.js express commonjs

我已经到了这样的程度,我想让一个工厂在一个地方管理我所有的模块依赖项,而不是在我的代码中使用大量的语句。

我已经看过一些依赖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];
    }
};

有些人说这不仅仅是一个工厂,而是一个中介模式,所以无论哪种方式,我只是想说明我的观点。

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

那么有更好的方法来解决这个问题吗?任何已经采用这种方法的实施工作?

谢谢!

1 个答案:

答案 0 :(得分:2)

从技术上讲,这就是require()内部的作用。

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

保证只加载并运行foo一次。第二个调用将从其内部数组返回一个缓存副本。

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

  

如果我需要更改依赖项,我只需在此文件上更改它并自动更新整个系统。

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

require('express')

我认为拥有这样的间接层没什么好处:

  • 即使在最佳情况下,直接替换它也可以节省很少的工作,因为项目全局查找&{39}替换require('factory').load('body-parser'); // loads Formidable!? require('foo')是一个大多数文本编辑器中的简单任务。

  • 替换模块的难点(不太可能100%兼容)是让现有代码正确使用它。使用工厂模式无法避免这种情况。您需要以任何一种方式编写适配器,有时甚至可能更好地实际更改模块的使用,而不是为API编写仿真层,无论如何都不是很好。