【问题标题】:Folder structure for a Node.js projectNode.js 项目的文件夹结构
【发布时间】:2011-07-07 21:25:11
【问题描述】:

我注意到 Node.js 项目通常包含如下文件夹:

/libs、/vendor、/support、/spec、/tests

这些到底是什么意思?它们之间有什么不同,我应该在哪里包含引用的代码?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    关于你提到的文件夹:

    • /libs 通常用于自定义classes/functions/modules
    • /vendor/support 包含 3rd 方库(添加为 git 使用 git 作为源代码控制时的子模块)
    • /spec 包含 BDD 测试的规范。
    • /tests 包含应用程序的单元测试(使用测试 框架,见 here)

    注意:/vendor/support 都已弃用,因为 NPM 引入了干净的包管理。建议使用 NPM 和 package.json 文件处理所有 3rd 方依赖项

    在构建一个相当大的应用程序时,我建议使用以下附加文件夹(尤其是如果您使用某种 MVC-/ORM-Framework,例如 expressmongoose):

    • /models 包含您所有的 ORM 模型(在 mongoose 中称为 Schemas
    • /views 包含您的视图模板(使用 express 支持的任何模板语言)
    • /public 包含所有静态内容(图像、样式表、客户端 JavaScript)
      • /assets/images 包含图片文件
      • /assets/pdf 包含静态 pdf 文件
      • /css 包含样式表(或由 css 引擎编译的输出)
      • /js 包含客户端 JavaScript
    • /controllers 包含您所有的 express 路由,由应用程序的模块/区域分隔(注意:使用 express 的引导功能时,此文件夹称为 /routes

    我习惯了以这种方式组织我的项目,我认为它运作良好。

    基于 CoffeeScript 的 Express 应用程序更新(使用 connect-assets):

    • /app 包含您编译的 JavaScript
    • /assets/ 包含所有需要编译的客户端资产
      • /assets/js 包含您的客户端 CoffeeScript 文件
      • /assets/css 包含您所有的 LESS/Stylus 样式表
    • /public/(js|css|img) 包含您的静态文件,这些文件未被任何编译器处理
    • /src 包含所有服务器端特定的 CoffeeScript 文件
    • /test 包含所有单元测试脚本(使用您选择的测试框架实现)
    • /views 包含您所有的表达意见(无论是玉、ejs 还是任何其他模板引擎)

    【讨论】:

    • 你会把你的客户端 js,css,images 放在哪里?您会建议在公共文件夹中使用类似的文件夹结构,例如:public/assets public/assets/css public/assets/images public/assets/docs public/libs public/support public/tests public/models public/views public/controllers ?
    • expressjs 创建一个 ./routes 目录,和你的例子中的 ./controllers 一样吗?
    • 你为什么不使用该提案创建一个 Yeoman 生成器?它可能会成为一种标准。
    • +1 来自 ASP.NET MVC,将“路由”文件夹称为“控制器”对我来说更有意义。
    • 问题,目录结构不是通常由框架生成(即 PHP 的 Symfony)吗?以 Express 为例,没有正确创建目录结构?开发人员是否要手动创建和维护 MVC 设计和路由?感谢任何反馈,我是 Express 的新手
    【解决方案2】:

    因为一个类似的问题,在 GitHub 上有一个讨论: https://gist.github.com/1398757

    您可以使用其他项目进行指导,在 GitHub 中搜索:

    • ThreeNodes.js - 在我看来,似乎有一个特定的结构并不适合每个项目;
    • 更轻 - 结构更简单,但缺乏组织性;

    最后,在一本书 (http://shop.oreilly.com/product/0636920025344.do) 中提出了这种结构:

    ├── index.html
    ├── js/
    │   ├── main.js
    │   ├── models/
    │   ├── views/
    │   ├── collections/
    │   ├── templates/
    │   └── libs/
    │       ├── backbone/
    │       ├── underscore/
    │       └── ...
    ├── css/
    └── ...
    

    【讨论】:

    • 我创建了一个动态请求文件的模块,允许您按功能而不是典型的模型、视图、控制器来构建项目。希望对某人有所帮助:github.com/ssmereka/crave
    【解决方案3】:

    您可以在此处查看我的项目架构中的更多示例:

    ├── Dockerfile
    ├── README.md
    ├── config
    │   └── production.json
    ├── package.json
    ├── schema
    │   ├── create-db.sh
    │   ├── db.sql
    ├── scripts
    │   └── deploy-production.sh 
    ├── src
    │   ├── app -> Containes API routes
    │   ├── db -> DB Models (ORM)
    │   └── server.js -> the Server initlializer.
    └── test
    

    基本上,逻辑应用程序在 SRC 目录中分为 DB 和 APP 文件夹。

    【讨论】:

    • 如果您的应用程序还包含一个前端应用程序,您是把它放在src 下还是前端应用程序有自己的文件夹(有自己的package.json 和类似的文件夹结构)?跨度>
    • @wal 我更喜欢将前端项目分离到另一个存储库,因为它更有条理
    【解决方案4】:

    假设我们谈论的是 Web 应用程序和构建 API:

    一种方法是按功能对文件进行分类,就像微服务架构的样子。在我看来,最大的胜利是非常容易查看哪些文件与应用程序的某个功能相关。

    最好的说明方法是通过一个例子:


    我们正在开发一个库应用程序。在应用程序的第一个版本中,用户可以:

    • 搜索书籍并查看书籍的元数据
    • 搜索作者并查看他们的书籍

    在第二个版本中,用户还可以:

    • 创建一个帐户并登录
    • 借书/借书

    在第三个版本中,用户还可以:

    • 保存他们想要阅读的书籍列表/标记收藏

    首先我们有以下结构:

    books
      ├─ controllers
      │   ├─ booksController.js
      │   └─ authorsController.js
      │
      └─ entities
          ├─ book.js
          └─ author.js
    

    然后我们添加用户和贷款功能:

    user
      ├─ controllers
      │   └─ userController.js
      ├─ entities
      │   └─ user.js
      └─ middleware
           └─ authentication.js
    loan
      ├─ controllers
      │   └─ loanController.js
      └─ entities
          └─ loan.js
    

    然后是收藏夹功能:

    favorites
      ├─ controllers
      │   └─ favoritesController.js
      └─ entities
          └─ favorite.js
    

    对于任何接到任务的新开发人员,如果任何书籍被标记为收藏,书籍搜索也应该返回信息,很容易看出他/她应该在代码中的哪个位置查找。

    然后当产品负责人一扫而空,惊呼要彻底删除收藏夹功能时,删除它很容易。

    【讨论】:

      【解决方案5】:

      请务必注意,对于最佳方法没有达成共识,相关框架通常不会强制执行或奖励某些结构。

      我发现这是一个令人沮丧和巨大的开销,但同样重要。这是style guide issue 的一个轻描淡写的版本(但IMO 更重要)。我想指出这一点,因为答案是相同的:只要定义明确且连贯,您使用什么结构并不重要

      所以我建议寻找一份你喜欢的综合指南,并明确说明该项目是基于此的。

      这并不容易,尤其是如果您是新手!期望花费数小时研究。您会发现大多数指南都推荐类似 MVC 的结构。虽然几年前这可能是一个可靠的选择,但现在情况并非如此。例如here's another approach

      【讨论】:

        【解决方案6】:

        这是间接回答,就文件夹结构本身而言,非常相关。

        几年前我有同样的问题,采用了一个文件夹结构,但后来不得不做很多目录移动,因为该文件夹的目的与我在互联网上阅读的不同,也就是说,什么特别文件夹在某些文件夹上对不同的人确实有不同的含义。

        现在,已经完成了多个项目,除了在所有其他答案中的解释之外,关于文件夹结构本身,我强烈建议遵循 Node.js 本身的结构,可以在:https://github.com/nodejs/node 看到。它有很多细节,比如 linter 和其他人,他们有什么文件和文件夹结构以及在哪里。有些文件夹有一个自述文件,解释了该文件夹中的内容。

        从上面的结构开始是好的,因为有一天会出现新的需求,但是你将有改进的空间,因为它已经被 Node.js 本身所遵循,现在已经维护了很多年。

        【讨论】:

          【解决方案7】:

          只需从 GitHub 克隆 repo

          https://github.com/abhinavkallungal/Express-Folder-Structure

          这是一个node.js express.js项目的基本结构 已经设置 MongoDB 作为数据库,hbs 作为视图引擎,nodemon 也是, 这样您就可以轻松设置 node js express 项目

          第 1 步:下载或克隆 repo
          第 2 步:在任何代码编辑器中打开
          第 3 步:在文件夹路径上打开终端
          第四步:在终端npm start运行评论
          第五步:开始编码

          【讨论】:

            猜你喜欢
            • 2014-07-09
            • 2018-03-11
            • 2020-09-11
            • 1970-01-01
            • 1970-01-01
            • 2011-01-31
            • 2015-12-05
            • 2016-08-05
            • 1970-01-01
            相关资源
            最近更新 更多