【问题标题】:How to organize large Node.js projects如何组织大型 Node.js 项目
【发布时间】:2012-04-07 14:08:25
【问题描述】:

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

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

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

【问题讨论】:

  • 有时间到read a book
  • 这本书我可能要买了,谢谢!
  • 谷歌“JavaScript 模块”或“模块化 JavaScript”:-)
  • 我读过 Straseus 推荐的这本书,它提供了很多很好的建议和分析,但恐怕没有多少能很好地用于使用 express 构建 Node.js 应用程序。 PuerkitoBio 在下面的回答链接到一些关于良好起始文件结构的建议;我计划根据需要在该结构上进行构建。

标签: node.js


【解决方案1】:

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

显然,这个问题没有明确的答案,但是看看其他人在做什么很有趣,而且我全神贯注于这个主题的其他意见(这也是discussed here,您可以在其中看到摘要我的建议)。

【讨论】:

  • 感谢您的链接,这是一本很好的阅读材料(在 Google 翻译的帮助下),我相信我会在设计项目组织时遵循您的一些建议目前正在进行中。
  • 你能修复链接吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    初学者示例

    我喜欢来自@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 文件中删除一些杂乱无章的东西。

    您要做的是在您的应用程序中创建一个“控制器”文件夹,这样您的结构现在将如下所示:

    app.js
    /controllers
    

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

    /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 编程非常有趣的众多原因之一。

    Manageable Express 4 路由示例

    这是我回复的另一篇关于与此相关的 express 4 路线的帖子。

    Rest with Express.js nested router

    【讨论】:

    • 恕我直言,在更新之前更好,您可以通过实现别名机制避免为每个控制器命名,其中一个路由路由到另一个,这也有助于规范 URL
    • 不要介意规范的 URL 部分,这是事后的想法。通过规范 URL,我的意思是当用户在地址栏中输入 /example/path/(或相反)时,将规范的 <link> 添加到类似 /example/path 的内容中。
    • 你知道,作为一个程序员,自然而然地想要这种有组织的层次结构,但在打开文件或读取签入时,它实际上并不适合。你最终会得到大量的“index.js”,使用起来很快就会很痛苦。
    • 一年后,对我来说很有价值的帖子。我刚刚开始使用 node.js 来做一个周末项目。
    • @JasonSebring 有这么多信息,我是新人!我现在很迷茫。作为一名数学研究生,我做了很多 matlab/R/mathematica,但我最后一次接触 Web/桌面框架是在 .net 2.0 天。
    【解决方案4】:

    他的文章不再在线,但 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】:

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

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

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

      顺便说一句,之前有很多开发者做过你的案例,你可以分叉升级。

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

      • Ballons.io 2.3k 颗星。不幸的是,他们将整个套接字服务器放在一个文件中,但您可以使用 node.js 和 socket.io 了解应用程序的整个结构

      【讨论】:

        【解决方案6】:

        如果您不介意,可以随时学习 typescript 并选择 https://nestjs.com/

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

        使用洋葱架构,您不必关心请求来自哪里,即使添加一些消息代理也不会有很多变化。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-26
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2019-05-27
          • 1970-01-01
          • 2011-08-03
          • 2011-02-04
          相关资源
          最近更新 更多