如何组织大型Node.js项目

时间:2012-03-22 23:23:00

标签: node.js

组织大型Node.js项目有哪些好方法?

例如,一个使用express.js和socket.io的应用程序?这将包括应用程序逻辑结构和文件系统。

目前,我发现自己将大量代码推入单个主js文件并将代码放入一个巨大的全局对象中,它感觉很顽皮。

7 个答案:

答案 0 :(得分:95)

初学者示例

我喜欢最初从@ david-ellis检查的内容,你应该深入研究它以理解它,因为它是一个很好的。但是,对于想要看到一个直接的例子的初学者,我会更喜欢它。这是我希望看到有人给我看的东西。

让我们给出一个典型的场景,你正在使用快递,你的app.js文件中列出了很多路线。它的内容看起来像这样:

<强> app.js

// ... startup code omitted above

app.get('/', function(req, res) {
  res.render('index', { title : 'home' });
});
app.get('/contactus', function(req, res) {
  res.render('contactus', { title : 'contact us' });
});
app.get('/anotherpage', function(req, res) {
  res.render('anotherpage', { title : 'another page' });
});
// and so on...

你可以想象如果你有50条路线,这个文件可能会失控。从app.js文件中删除一些混乱是很好的。

你要做的是在你的应用程序中创建一个“controllers”文件夹,这样你的结构现在看起来像这样:

app.js
/controllers

在名为“index.js”的“/ controllers”中创建一个文件,然后输入以下代码。

<强> /controllers/index.js

module.exports.set = function(app) {
   // copy your routes listed in your app.js directly into here
}

从“app.js”文件中剪切并粘贴路线列表,并将它们放入“/controllers/index.js”文件中。

在您的app.js文件中,删除您的路线并代替它们执行以下操作。

<强> app.js

// remove your routes and replace with this code
var controllers = require('./controllers');
controllers.set(app);

现在,如果你想让你的“/controllers/index.js”文件被拆分,让我们再添加一个例子,这样你就可以看到Node.js如何真正像俄罗斯娃娃那样组织代码如何组织

在“/ controllers”中添加一个文件“accounts.js”并将以下内容放入其中。

<强> /controllers/account.js

module.exports.set = function(app) {
    // put more app route listings here
}

现在在你的“/controllers/index.js文件中,引用”account.js“

<强> /controllers/index.js

var account = require('./account.js');

module.exports.set = function(app) {
   // your routes here

   // let "account.js" set other routes
   account.set(app);
}

您可以想象,如果您愿意,可以将内容分成更小和更小的部分,并将更多文件夹放在文件夹中并使用“require”引用。您可以对“/ lib”或库文件使用相同的概念。 “node_modules”已经在这样做了。

这只是node.js编程非常有趣的众多原因之一。

可管理的Express 4路由示例

这是我回复的另一篇关于快递4道路的帖子。

Rest with Express.js nested router

答案 1 :(得分:42)

我建议你考虑一下图书馆。 npm是一个很好的工具来抓取库,你的代码可能会一直这样做。那么,为什么不看看你正在写什么,并想“我宁愿做什么部分require - 图书馆这样做呢?”

然后,您可以先搜索这样的库,然后突然减少需要编写的代码。如果找不到这样的库,可以编写自己的库,然后决定是否要将其作为开源库发布,或者保持关闭。

如果您有一个相当复杂的对象要在代码中使用,但是认为它对于您正在努力获得的特定网站来说太习惯了,请记住您始终可以{{1并将其移出到自己独立的文件中,以便以类似于C / C ++ / Java代码的方式组织代码。

但同样,以尽可能通用的方式解决问题更好,因为它鼓励更多的代码重用和更好的代码测试(特别是如果它是开源的,而其他人可能会使用它)。

答案 2 :(得分:10)

我几天前写了blog post about this very subject,虽然这篇文章是法文的,但我设置了一个GitHub repo(英文)来展示我使用的结构的一个工作示例。

显然,这个问题没有明确的答案,但看到其他人在做什么很有意思,而且我对所有关于这个问题的意见都很感兴趣(也是discussed here,你可以看到总结我的建议。)

答案 3 :(得分:2)

与其他博客文章类似,我专门撰写了一篇关于组织Express应用程序的文章。这是我用了大约一年半的方法。基本上,围绕数据实体或任何其他核心元素组织应用程序。将每个元素的逻辑放在它们自己的目录中。我试图从Python中借用很多东西。

http://rycole.com/2013/01/28/organizing-nodejs-express.html

答案 4 :(得分:1)

他的文章不再在线,但Eric Satterwhite的节点系列推荐了如下所列的结构。

# Project 
. 
|-- packages/
|   |-- project-core
|   |   |-- lib/
|   |   |-- commands/
|   |   |-- startup/
|   |   |-- conf/
|   |   |-- test/
|   |   |-- package.json
|   |   |-- README.md
|   |   |-- events.js
|   |   |-- .npmignore
|   |   `-- index.js
|-- package.json
`-- index.js

packages/文件夹变成模块化的来源。

答案 5 :(得分:0)

如果您是这方面的初学者,我建议您查看受开发人员喜爱的现有项目。其中一些是:

  • Sails.js - 18k星。您可以在我提供的链接上查看他们如何组织APP结构。一个很棒的网站对结构中的每个文件夹都有一个解释。

  • Express.js generator - 800颗星。有一个伟大而简单的模板可以开始使用Express.js。在这里,您可以注意到他们如何从应用程序中分割路线。

顺便说一句,很多开发人员之前都做过你的情况,你可以分叉并升级。

  • Kioska。看看他们如何将事件分成events/文件夹中的不同文件。

  • Ballons.io 2.3k星。不幸的是,他们将整个套接字服务器放在一个文件中,但您可以通过node.js和socket.io

  • 了解应用程序的整个结构。

答案 6 :(得分:0)

如果您不介意的话,可以随时学习打字稿并尝试https://nestjs.com/

如果您要坚持使用JS,我强烈建议您使用洋葱架构。 最佳实践是保持分离的业务逻辑,控制器,甚至库(它们应该包装在某些类/帮助器中)-以防万一,如果您必须迁移到另一个库(不同的CSV分析器等)。

使用洋葱体系结构,您不在乎请求来自何处,即使添加某些消息代理,也不会有太多更改。

也尝试这个https://en.wikipedia.org/wiki/Domain-driven_design

ESLint可能有助于适当的项目组织。