查看源代码 目录结构
当我们使用mix phx.new
生成一个新的 Phoenix 应用程序时,它会构建如下所示的顶层目录结构
├── _build
├── assets
├── config
├── deps
├── lib
│ ├── hello
│ ├── hello.ex
│ ├── hello_web
│ └── hello_web.ex
├── priv
└── test
我们将逐一介绍这些目录。
_build
- 由mix
命令行工具创建的目录,该工具随 Elixir 一起提供,用于保存所有编译后的工件。正如我们在 "启动并运行" 中看到的,mix
是您应用程序的主要接口。我们使用 Mix 来编译代码、创建数据库、运行服务器等等。此目录不能被检入版本控制系统,并且可以随时删除。删除它将强制 Mix 从头开始重建您的应用程序。assets
- 一个保存前端资产源代码的目录,通常是 JavaScript 和 CSS。这些源代码会由esbuild
工具自动捆绑。静态文件(例如图像和字体)放在priv/static
中。config
- 一个保存项目配置的目录。config/config.exs
文件是您的配置的入口点。在config/config.exs
的最后,它会导入环境特定的配置,这些配置可以在config/dev.exs
、config/test.exs
和config/prod.exs
中找到。最后,config/runtime.exs
会被执行,它是读取机密和其他动态配置的最佳位置。deps
- 一个包含我们所有 Mix 依赖项的目录。您可以在mix.exs
文件中的defp deps do
函数定义中找到所有依赖项。此目录不能被检入版本控制系统,并且可以随时删除。删除它将强制 Mix 从头开始下载所有依赖项。lib
- 一个保存应用程序源代码的目录。此目录被分成两个子目录,lib/hello
和lib/hello_web
。lib/hello
目录将负责托管所有业务逻辑和业务领域。它通常直接与数据库交互 - 它是在 Model-View-Controller (MVC) 架构中的“Model”。lib/hello_web
负责将您的业务领域公开给世界,在本例中,是通过 Web 应用程序。它包含来自 MVC 的 View 和 Controller。我们将在接下来的部分中更详细地讨论这些目录的内容。priv
- 一个保存所有在生产中必需但在源代码中不直接包含的资源的目录。您通常会将数据库脚本、翻译文件、图像等等放在这里。从assets
目录中的文件生成的资产默认情况下会放在priv/static/assets
中。test
- 一个包含所有应用程序测试的目录。它通常反映lib
中找到的相同结构。
lib/hello 目录
lib/hello
目录托管所有业务领域。由于我们的项目还没有任何业务逻辑,因此该目录基本上是空的。您只会找到三个文件
lib/hello
├── application.ex
├── mailer.ex
└── repo.ex
lib/hello/application.ex
文件定义了一个名为 Hello.Application
的 Elixir 应用程序。这是因为最终 Phoenix 应用程序只是 Elixir 应用程序。 Hello.Application
模块定义了哪些服务是我们应用程序的一部分
children = [
HelloWeb.Telemetry,
Hello.Repo,
{Phoenix.PubSub, name: Hello.PubSub},
HelloWeb.Endpoint
]
如果您是第一次使用 Phoenix,现在不用担心细节。目前,我们只需知道我们的应用程序启动了一个数据库存储库、一个用于在进程和节点之间共享消息的 PubSub 系统,以及应用程序端点,它实际上用于处理 HTTP 请求。这些服务会按照它们定义的顺序启动,并且在关闭应用程序时,会以相反的顺序停止。
您可以在Elixir 的 Application 官方文档中了解更多关于应用程序的信息。
lib/hello/mailer.ex
文件包含 Hello.Mailer
模块,它定义了用于发送电子邮件的主要接口
defmodule Hello.Mailer do
use Swoosh.Mailer, otp_app: :hello
end
在同一个 lib/hello
目录中,我们会找到一个 lib/hello/repo.ex
。它定义了一个 Hello.Repo
模块,它是我们与数据库交互的主要接口。如果您使用的是 Postgres(默认数据库),您将看到类似的内容
defmodule Hello.Repo do
use Ecto.Repo,
otp_app: :hello,
adapter: Ecto.Adapters.Postgres
end
目前就这些。在您进行项目开发时,我们将向此目录添加文件和模块。
lib/hello_web 目录
lib/hello_web
目录包含我们应用程序的 Web 相关部分。展开后看起来像这样
lib/hello_web
├── controllers
│ ├── page_controller.ex
│ ├── page_html.ex
│ ├── error_html.ex
│ ├── error_json.ex
│ └── page_html
│ └── home.html.heex
├── components
│ ├── core_components.ex
│ ├── layouts.ex
│ └── layouts
│ ├── app.html.heex
│ └── root.html.heex
├── endpoint.ex
├── gettext.ex
├── router.ex
└── telemetry.ex
当前位于 controllers
和 components
目录中的所有文件都用于创建我们在 "启动并运行" 指南中看到的“欢迎使用 Phoenix!”页面。
通过查看 controller
和 components
目录,我们可以看到 Phoenix 提供了开箱即用的布局、HTML 和错误页面处理功能。
除了提到的目录之外, lib/hello_web
在其根目录中还有四个文件。 lib/hello_web/endpoint.ex
是 HTTP 请求的入口点。一旦浏览器访问 http://localhost:4000,端点就会开始处理数据,最终导致路由器,它在 lib/hello_web/router.ex
中定义。路由器定义了将请求分派到“控制器”的规则,控制器会调用视图模块来将 HTML 页面渲染回客户端。我们将在其他指南中详细介绍这些层,从下一篇 "请求生命周期" 指南开始。
通过遥测,Phoenix 能够收集应用程序的指标并发送监控事件。 lib/hello_web/telemetry.ex
文件定义了负责管理遥测进程的监督者。您可以在遥测指南中找到有关此主题的更多信息。
最后,还有一个 lib/hello_web/gettext.ex
文件,它通过Gettext 提供国际化功能。如果您不担心国际化,可以安全地跳过此文件及其内容。
assets 目录
assets
目录包含与前端资产相关的源文件,例如 JavaScript 和 CSS。从 Phoenix v1.6 开始,我们使用 esbuild
来编译资产,它由 esbuild
Elixir 包管理。与 esbuild
的集成已内置到您的应用程序中。相关配置可以在您的 config/config.exs
文件中找到。
您其他的静态资产放在 priv/static
文件夹中,其中 priv/static/assets
用于保存生成的资产。 priv/static
中的所有内容都由 Plug.Static
插件提供服务,该插件在 lib/hello_web/endpoint.ex
中配置。在开发模式下运行 (MIX_ENV=dev
) 时,Phoenix 会监视您在 assets
目录中所做的任何更改,然后在您工作时负责更新浏览器中的前端应用程序。
请注意,当您第一次使用 mix phx.new
创建 Phoenix 应用程序时,可以指定会影响 assets
目录的存在和布局的选项。事实上,Phoenix 应用程序可以自带前端工具,也可以完全没有前端(如果您要编写 API,这将非常有用)。有关更多信息,您可以运行 mix help phx.new
或查看Mix 任务中的文档。
如果默认的 esbuild 集成无法满足您的需求,例如您想要使用其他构建工具,您可以切换到自定义资产构建。
对于 CSS,Phoenix 附带了 Tailwind CSS 框架,为项目提供基本设置。您可以切换到您选择的任何 CSS 框架。其他参考资料可以在资产管理指南中找到。