本文是 Node Hero 系列教程的第七部分——通过这些章节,你将学会如何开始使用 Node.js 发布软件产品。
大部分 Node.js 框架并不提供固定的目录结构,从一开始就采用正确的做法可能是一个挑战。通过这篇教程,你将学会如何正确地组织 Node.js 项目,从而在应用规模增长时避免混乱。
本系列全部文章:
- Node Hero 系列之:开始使用 Node.js
- Node Hero 系列之:npm 教程
- Node Hero 系列之:Node.js 异步编程
- Node Hero 系列之:你的第一个 Node.js HTTP 服务器
- Node Hero 系列之:数据库教程
- Node Hero 系列之:Node.js request 模块教程
- Node Hero 系列之:Node.js 项目文件组织教程
- Node Hero 系列之:使用 Passport.js 做 Node.js 身份验证
- Node Hero 系列之:Node.js 单元测试教程
- Node Hero 系列之:Node.js 调试教程
- Node Hero 系列之:Node.js 安全教程
- Node Hero 系列之:如何使用 Heroku 或 Docker 部署 Node.js
- Node Hero 系列之:Node.js 应用监控
Node.js 项目结构的五个基本原则
Node.js 项目有很多种组织方式,每种方式各有优缺点。但是,根据我们的经验,开发者想要的结果都是一样的:代码简洁,能轻松添加新功能。
在 RisingStack 的过去几年里,我们有机会构建了各种规模的高效 Node 应用,在项目组织的最佳实践方面我们获得了很多见解。
我们总结了五个简单的指导原则,在Node.js 开发过程中我们都在实施这些原则。如果你设法遵守这些原则,你的项目基本无虞:
原则 1:根据功能而不是角色组织文件
假设你的目录结构如下:
// 不推荐
.
├── controllers
| ├── product.js
| └── user.js
├── models
| ├── product.js
| └── user.js
├── views
| ├── product.hbs
| └── user.hbs
这种方式的问题是:
- 为了理解其中的产品页面如何工作,你不得不打开三个不同的目录,来回切换。
- 引入模块时你要写很长的路径:
require('../../controllers/user.js')
相反,你可以根据产品功能、页面、组件来组织结构。这样理解起来更容易:
// 推荐
.
├── product
| ├── index.js
| ├── product.js
| └── product.hbs
├── user
| ├── index.js
| ├── user.js
| └── user.hbs
原则 2:不要把逻辑放在index.js 文件中
这些文件只用来导出函数,比如:
// product/index.js
var product = require('./product')
module.exports = {
create: product.create
}
原则 3:把测试文件放在紧靠功能实现代码的位置
测试代码不只是为了检查模块输出是否符合预期,还能充当模块文档*(接下来的章节你会学到更多有关测试的内容)。因此,如果测试文件紧挨着功能实现代码,理解起来更容易。
把额外的测试文件放到单独的test文件夹中,以免混乱。
.
├── test
| └── setup.spec.js
├── product
| ├── index.js
| ├── product.js
| ├── product.spec.js
| └── product.hbs
├── user
| ├── index.js
| ├── user.js
| ├── user.spec.js
| └── user.hbs
原则 4:使用config目录
用config目录存放配置文件。
.
├── config
| ├── index.js
| └── server.js
├── product
| ├── index.js
| ├── product.js
| ├── product.spec.js
| └── product.hbs
原则 5:把大段的 npm 脚本放到 scripts目录里
为 package.json 文件中的额外长脚本创建一个单独的目录。
.
├── scripts
| ├── syncDb.sh
| └── provision.sh
├── product
| ├── index.js
| ├── product.js
| ├── product.spec.js
| └── product.hbs