目录结构

目录结构

在本指南中,我们将一探 AdonisJS 在安装过程中创建的重要文件与目录。

我们提供了一套经过深思熟虑的默认目录结构,帮助你保持项目整洁且易于重构。不过,你完全有自由偏离它,采用对团队和项目更合适的目录结构。

adonisrc.ts 文件

adonisrc.ts 文件用于配置工作区以及应用的一些运行时设置。

在该文件中,你可以注册服务提供者、定义命令别名,或指定要复制到生产构建中的文件。

另见:AdonisRC 文件参考指南

tsconfig.json 文件

tsconfig.json 文件存储了应用的 TypeScript 配置。欢迎根据项目或团队的需求对此文件进行更改。

AdonisJS 内部正常工作需要以下配置选项。

{
"compilerOptions": {
"module": "NodeNext",
"isolatedModules": true,
"declaration": false,
"outDir": "./build",
"esModuleInterop": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"skipLibCheck": true
}
}

子路径导入

AdonisJS 使用 Node.js 的子路径导入功能来定义导入别名。

以下导入别名已在 package.json 文件中预配置。欢迎添加新的别名或编辑已有的别名。

package.json
{
"imports": {
"#controllers/*": "./app/controllers/*.js",
"#exceptions/*": "./app/exceptions/*.js",
"#models/*": "./app/models/*.js",
"#mails/*": "./app/mails/*.js",
"#services/*": "./app/services/*.js",
"#listeners/*": "./app/listeners/*.js",
"#events/*": "./app/events/*.js",
"#middleware/*": "./app/middleware/*.js",
"#validators/*": "./app/validators/*.js",
"#providers/*": "./app/providers/*.js",
"#policies/*": "./app/policies/*.js",
"#abilities/*": "./app/abilities/*.js",
"#database/*": "./database/*.js",
"#tests/*": "./tests/*.js",
"#start/*": "./start/*.js",
"#config/*": "./config/*.js"
}
}

bin 目录

bin 目录包含用于在特定环境中加载应用的入口文件。例如:

  • bin/server.ts 文件在 web 环境中启动应用以监听 HTTP 请求。
  • bin/console.ts 文件启动 Ace 命令行并执行命令。
  • bin/test.ts 文件启动应用以运行测试。

ace.js 文件

ace 文件启动附属于你的应用的命令行框架。因此,每次你运行 ace 命令时,都会经过该文件。

如果你注意到,ace 文件以 .js 扩展名结尾。这是因为我们希望在不编译的情况下使用 node 二进制直接运行该文件。

app 目录

app 目录组织应用领域逻辑的代码。例如,控制器、模型、服务等全都位于 app 目录中。

欢迎创建额外的目录来更好地组织你的应用代码。

├── app
│ └── controllers
│ └── exceptions
│ └── middleware
│ └── models
│ └── validators

resources 目录

resources 目录包含 Edge 模板,以及前端代码的源文件。换言之,应用表示层的代码位于 resources 目录中。

├── resources
│ └── views
│ └── js
│ └── css
│ └── fonts
│ └── images

start 目录

start 目录包含在应用启动生命周期中你想要导入的文件。例如,用于注册路由和定义事件监听器的文件应当位于 start 目录中。

├── start
│ ├── env.ts
│ ├── kernel.ts
│ ├── routes.ts
│ ├── validator.ts
│ ├── events.ts

AdonisJS 不会自动导入 start 目录中的文件。它仅仅是一个用于归类相似文件的约定。

我们建议你阅读关于预加载文件应用启动生命周期的内容,以更好地理解哪些文件应当放在 start 目录下。

public 目录

public 目录托管 CSS 文件、图片、字体或前端 JavaScript 等静态资源。

不要将 public 目录与 resources 目录混淆。resources 目录包含前端应用的源代码,而 public 目录包含编译后的输出。

使用 Vite 时,你应将前端资源存储在 resources/<SUB_DIR> 目录中,并让 Vite 编译器在 public 目录中创建输出。

另一方面,如果你不使用 Vite,可以直接在 public 目录中创建文件,并通过文件名访问它们。例如,你可以通过 http://localhost:3333/style.css 这个 URL 访问 ./public/style.css 文件。

database 目录

database 目录包含数据库迁移和种子文件。

├── database
│ └── migrations
│ └── seeders

commands 目录

ace 命令存储在 commands 目录中。你可以通过运行 node ace make:command 在该文件夹中创建命令。

config 目录

config 目录包含应用的运行时配置文件。

框架核心和其他已安装的软件包会从该目录读取配置文件。你也可以将应用本地的配置存储在该目录中。

了解更多关于配置管理的内容。

├── config
│ ├── app.ts
│ ├── bodyparser.ts
│ ├── cors.ts
│ ├── database.ts
│ ├── drive.ts
│ ├── hash.ts
│ ├── logger.ts
│ ├── session.ts
│ ├── static.ts

types 目录

types 目录是应用中使用的 TypeScript 接口或类型的归宿。

该目录默认为空,不过,你可以在 types 目录中创建文件和文件夹来定义自定义类型和接口。

├── types
│ ├── events.ts
│ ├── container.ts

providers 目录

providers 目录用于存储应用使用的服务提供者。你可以使用 node ace make:provider 命令创建新的服务提供者。

了解更多关于服务提供者的内容

├── providers
│ └── app_provider.ts
│ └── http_server_provider.ts

tmp 目录

应用生成的临时文件存储在 tmp 目录中。例如,这些可能是用户上传的文件(在开发期间生成)或写入磁盘的日志。

tmp 目录必须被 .gitignore 规则忽略,你也不应将其复制到生产服务器。

tests 目录

tests 目录组织你的应用测试。其中会为 unitfunctional 测试创建子目录。

另见:测试

├── tests
│ ├── bootstrap.ts
│ └── functional
│ └── regression
│ └── unit