组织大型Node.js项目有哪些好方法?
例如,一个使用express.js和socket.io的应用程序?这将包括应用程序逻辑结构和文件系统。
目前,我发现自己将大量代码推入单个主js文件并将代码放入一个巨大的全局对象中,它感觉很顽皮。
答案 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编程非常有趣的众多原因之一。
这是我回复的另一篇关于快递4道路的帖子。
答案 1 :(得分:42)
我建议你考虑一下图书馆。 npm
是一个很好的工具来抓取库,你的代码可能会一直这样做。那么,为什么不看看你正在写什么,并想“我宁愿做什么部分require
- 图书馆这样做呢?”
然后,您可以先搜索这样的库,然后突然减少需要编写的代码。如果找不到这样的库,可以编写自己的库,然后决定是否要将其作为开源库发布,或者保持关闭。
如果您有一个相当复杂的对象要在代码中使用,但是认为它对于您正在努力获得的特定网站来说太习惯了,请记住您始终可以{{1并将其移出到自己独立的文件中,以便以类似于C / C ++ / Java代码的方式组织代码。
但同样,以尽可能通用的方式解决问题更好,因为它鼓励更多的代码重用和更好的代码测试(特别是如果它是开源的,而其他人可能会使用它)。
答案 2 :(得分:10)
我几天前写了blog post about this very subject,虽然这篇文章是法文的,但我设置了一个GitHub repo(英文)来展示我使用的结构的一个工作示例。
显然,这个问题没有明确的答案,但看到其他人在做什么很有意思,而且我对所有关于这个问题的意见都很感兴趣(也是discussed here,你可以看到总结我的建议。)
答案 3 :(得分:2)
与其他博客文章类似,我专门撰写了一篇关于组织Express
应用程序的文章。这是我用了大约一年半的方法。基本上,围绕数据实体或任何其他核心元素组织应用程序。将每个元素的逻辑放在它们自己的目录中。我试图从Python中借用很多东西。
答案 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可能有助于适当的项目组织。