Node.js将模块连接在一起,而不会变得混乱

一个简单的问题真的。 我试图将我的node.js应用程序分解到依赖于特性或function的相关模块中。 例如用于读取日志文件的login模块,用于与IRC机器人一起工作的IRC模块等。

我目前使用一个全局事件发射器模块把所有东西都捆绑在一起,这个模块完成了所有需要传递的消息,比如我想把数据库中的日志条目添加到数据库中。

这个工作已经有一段时间了,但是我已经开始觉得好像我需要开始需要一些function模块来完成其他一些工作。 我想避免紧密耦合(因此事件模块),但真的有什么不好吗?

在审查其他一些node.js项目时,我经常会看到一个app.js文件,其中有10个左右的其他模块需要在其中尝试在一个地方做所有事情。 我正在努力保持我的轻巧,易于阅读。 有没有这样做的例子,你可以想到呢?

我遇到的最好的经验法则是:模块可以单独testing吗? 我可以要求模块,并从testing用例中调用它的function吗? 如果这个模块依赖于其他模块,那么我有多难以用假模拟这些模块进行testing呢?

在我看来,可testing性是良好分离问题的最好指标。 如果您的模块确实需要它们,那么可以使用其他十个模块。 即使你没有真正花时间编写testing,我也会始终保持可testing性。

即使只是保持开放testing的选项也没有什么好处,对于您的模块专业化程度如何,这是一个有用的指导。 如果你有三个模块,你不能使用另外两个,那么他们可能属于一个模块。 或者,也许这三个模块是大的,而且更容易导航,而拆分; 对于这种情况下,我通常创build一个包装模块

我创build一个相关名称的目录,我在那里需要其他三个模块(或任何我需要的)抛出一个index.js文件。 然后从我的应用程序的其余部分,我可以访问该模块,就好像它是一个专门的API,即使内部它是复杂的,拆分成多个子模块。 包装模块隐藏了我的应用程序的其余部分,所以我仍然可以模块化,同时保持API简单。 对于那些将东西合并到一个模块中太混乱,并且在分割configuration中使用模块的情况,这是一个很好的解决方法。

如果一个模块足够通用(如果可能的话,我通常会这样做),那么我会经常把它作为一个独立的模块发布到NPM上。 然后我会像在NPM上的任何其他模块一样,在我的项目中要求它。 例如,我一直在编写一个脚本来将所有的mongoose模型加载到一个单独的db对象中,以便于访问。 该代码将遍历我的项目根目录下的dbmodels目录中的mongodb模型文件。 这将需要模块,模型数据与mongoose注册,并生成一个简单的db对象,我可以使用(例如db.User.findOne({ username: 'munkee' }, function (err, user) { ... } )。

我没有继续复制和粘贴相同的代码块到我build立的每个项目中,而是创build了一个名为mongoose-simpledb的通用NPM模块。 如果你看看这个模块的代码,你可以看到它不是很复杂。 这是通用的,有用的,尽pipe我觉得它应该在NPM注册中心中占有一席之地。 在新项目中它使事情变得容易很多。 其他人发现它也有用,只是一个快乐的奖金:)