Node.js项目的文件夹结构


346

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

/ libs,/ vendor,/ support,/ spec,/ tests

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

Answers:


439

关于您提到的文件夹:

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

注意:自NPM引入了干净的程序包管理以来,/vendor/support都已弃用。建议使用NPM和package.json文件处理所有第三方依赖关系

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

  • /models包含您所有的ORM模型(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 包含您所有的表达意见(无论是jade,ejs还是任何其他模板引擎)

5
您将把您的客户端js,css,图像放在哪里?您是否建议在公用文件夹中使用类似的文件夹结构,例如:public / assets public / assets / css public / assets / images public / assets / docs public / libs public / support public / test public / models public / views public / controllers ?
ezmilhouse 2011年

2
expressjs创建一个./routes目录,与您的示例中的./controllers相同吗?
chovy 2012年

2
您为什么不使用该建议创建Yeoman生成器?它可能成为标准。
Jayr Motta 2013年

+1来自ASP.NET MVC,将“ routes”文件夹称为“ controllers”对我来说更有意义。
adam0101

问题,目录结构通常不是由框架生成的(即Symfony for PHP)吗?以Express为例,没有创建正确的目录结构吗?开发人员是否要手动创建和维护MVC设计和路线?感谢您的反馈,我是Express的
新手

49

由于存在与此问题类似的问题,因此在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
Scott

13

我的项目架构中的更多示例可以在这里看到:

├── 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相似文件夹结构)?
沃尔玛

2
@wal我更喜欢将前端项目分离到另一个存储库中,因为它更具组织性
Daniel Chernenkov

2

这是间接的答案,关于文件夹结构本身,非常相关。

几年前,我有一个相同的问题,采用了文件夹结构,但后来不得不做很多目录移动,因为该文件夹的目的与我在互联网上阅读的目的不同,即特定文件夹的功能不同人在某些文件夹上的含义不同。

现在,除了对所有其他答案进行解释之外,在文件夹结构本身上做了多个项目,我强烈建议遵循Node.js本身的结构,该结构可以在以下网址查看:https : //github.com/ nodejs / node。它详细介绍了所有内容,例如linters和其他文件,它们具有的文件和文件夹结构以及位置。有些文件夹具有自述文件,说明该文件夹中的内容。

从上面的结构开始是一个好习惯,因为有一天会有新的要求出现,但是您将有一个改进的余地,因为Node.js本身已经被它所遵循,并且已经维护了很多年。

希望这可以帮助。


1

重要的是要指出,对于什么是最好的方法还没有达成共识,并且相关的框架通常不会实施或奖励某些结构。

我发现这是令人沮丧的巨大开销,但同样重要。它是样式指南问题的轻描淡写版本(但IMO更重要)。我想指出这一点,因为答案是相同的:只要定义明确且连贯,使用哪种结构都无所谓

因此,我建议寻找您喜欢的综合指南,并明确说明该项目基于此。

这并不容易,特别是如果您是新手!期望花费数小时进行研究。您会发现大多数指南都推荐类似MVC的结构。尽管几年前这可能是一个不错的选择,但如今并不一定如此。例如,这是另一种方法


1

假设我们正在谈论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

对于任何需要完成添加任务的新开发人员,如果书籍被标记为收藏,书籍搜索还应该返回信息,这很容易看出他/她应该在代码中查找的位置。

然后,当产品负责人进入并宣称应该完全删除“收藏夹”功能时,很容易将其删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.