如何组织大型的Node.js项目

什么是组织大型Node.js项目的好方法?

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

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

一个初学者的例子

我喜欢最初从@ david-ellis检查,你应该深入研究它,因为它是一个很好的理解。 不过,我想让初学者更简单一些,希望看到一个简单的例子。 这是我希望看到有人给我看的东西。

让我们给出一个典型的场景,你使用express,并且你的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文件中移除一些混乱的东西会很好。

你会做什么是在你的应用程序中创build一个“controllers”文件夹,所以你的结构现在看起来像这样:

 app.js /controllers 

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

/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编程非常愉快的一个原因。

可pipe理的Express 4路由示例

这里是另外一篇文章,我回答了有关与此相关的快递4条路线。

rest与Express.js嵌套路由器

我build议你从图书馆的angular度思考。 npm是抓库的好工具,你的代码可能会一直这样做。 那么为什么不看看你在写些什么,并且想一下“我宁可require什么样的部分呢?

然后,你可以先search这样一个库,并且你突然减less了你需要编写的代码。 如果找不到这样的库,可以自己编写,然后决定是否要将其作为开放源代码库进行发布,或保持closures。

如果你有一个相当复杂的对象,你想在你的代码中使用,但是认为它对你正在工作的特定站点来说太过于自定义为一个库,请记住,你总是可以var myObj = require('./relative/path/to/javascript/file'); 并将其移出到它自己的单独文件中,以便以类似于C / C ++ / Java代码的方式组织代码。

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

我前几天写了一篇关于这个主题的博客文章 ,虽然这篇文章是用法文写成的,但我还是build了一个GitHub回购 (英文版)来展示我使用的结构的一个实例。

很明显,这个问题没有明确的答案,但是看看别人在做什么是很有意思的,我对这个问题的其他意见都非常感兴趣( 这里也讨论了这个问题 ,你可以在这里看到我所build议的内容) 。

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

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

我意识到这个问题是相当古老的,但是我发现Eric Satterwhite的Node系列在我第一次开始开发Node时非常有用。

http://www.codedependant.net/2015/01/19/production-ready-node-structure-packaging/

在这个世界里,你会发现一大堆好东西,还有一个这样的结构:

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

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