Directory structure
上一章使用 mix phx.new 创建了新的 Phoenix 应用,现在来认识一下生成的代码目录:
├── _build
├── assets
├── config
├── deps
├── lib
│ ├── hello
│ ├── hello.ex
│ ├── hello_web
│ └── hello_web.ex
├── priv
└── test
一个一个来看:
_build,Elixir 程序的编译产物。从上一章我们看到mix命令对应用程序至关重要。我们需要使用 Mix 来编译代码,创建数据库,运行服务等等。这个_build不要放进 git 里,也可以随时删除,因为还会重新生成。assets放前端的资源,比如 JavaScript、CSS 这些,并且由esbuild来处理。config放项目配置。config/config.exs是配置开始的地方,还有其他一些跟环境相关的配置。config/runtime.exs可以放一些密钥和其他动态的配置。deps放依赖的地方,在mix.exs文件可以找到所有的依赖列表。不用把deps放进 git,同样可以删除。lib放项目的源代码。lib/hello放业务逻辑代码,通常是跟数据库交互相关的代码,在 MVC 中相当于 "Model"。lib/hello_web负责把业务逻辑暴露给外部,比如这里是通过 web 应用的方式。在 MVC 中相当于 "View" 和 "Controller"。这块后面细说。priv用于保存生产中必需但不直接包含在源代码中的所有资源。您通常会在此处保留数据库脚本、翻译文件等。默认情况下,来自 assets 目录的静态和生成的资产也从这里提供。【机翻】test测试相关。
lib/hello 目录
lib/hello 目录放所有业务域代码,当前还没有任何业务逻辑,所以基本上是空的。现在的文件是:
lib/hello
├── application.ex
├── mailer.ex
└── repo.ex
lib/hello/application.ex 文件定义了一个名为 Hello.Application 的 Elixir 应用程序。归根结底,Phoenix 应用程序也是 Elixir 应用程序。Hello.Application 模块定义了我们的应用程序由哪些服务组成:
children = [
# Start the Ecto repository
Hello.Repo,
# Start the Telemetry supervisor
HelloWeb.Telemetry,
# Start the PubSub system
{Phoenix.PubSub, name: Hello.PubSub},
# Start the Endpoint (http/https)
HelloWeb.Endpoint
# Start a worker by calling: Hello.Worker.start_link(arg)
# {Hello.Worker, arg}
]
如果您是第一次使用 Phoenix,现在也不用担心细节。现在,只需说我们的应用程序启动了一个数据库存储库、一个用于跨进程和节点共享消息的 PubSub 系统以及有效地服务于 HTTP 请求的应用程序端点。这些服务按照定义的顺序启动,每当关闭应用程序时,它们都会以相反的顺序停止。【机翻】
lib/hello/mailer.ex 文件包含 Hello.Mailer 模块,发送 Email 相关:
defmodule Hello.Mailer do
use Swoosh.Mailer, otp_app: :hello
end
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 目录
这个目录会放 web 相关的代码:
lib/hello_web
├── controllers
│ └── page_controller.ex
├── templates
│ ├── layout
│ │ ├── app.html.heex
│ │ ├── live.html.heex
│ │ └── root.html.heex
│ └── page
│ └── index.html.heex
├── views
│ ├── error_helpers.ex
│ ├── error_view.ex
│ ├── layout_view.ex
│ └── page_view.ex
├── endpoint.ex
├── gettext.ex
├── router.ex
└── telemetry.ex
当前在 controllers, templates 和 views 中的所有文件,都是为我们看到的欢迎页面服务的。
看下 templates 和 views 目录,可以看到,Phoenix 提供了开箱即用的 layouts 和 error page。
lib/hello_web/endpoint.ex 是 HTTP 请求的入口。当浏览器打开 http://localhost:4000 时,这个 endpoint 开始处理数据,并最终转入 lib/hello_web/router.ex 中的 router 处理。然后 router 分发给 controllers,然后是使用 views 和 templates 渲染 HTML 页面返回给客户端。这块后面细说。
通过 Telemetry,Phoenix 能够收集指标并发送应用程序的监控事件。
lib/hello_web/telemetry.ex 文件定义了负责管理遥测过程的supervisor。
怎样理解这个 Telemetry(遥测) 呢?
lib/hello_web/gettext.ex 这个是跟国际化相关的,如果没有这个需求,可以暂时跳过。
assets 目录
前端资源相关的目录,放 JavaScript 和 CSS 等。从 Phoenix 1.6 开始,使用 esbuild 来编译前端资源。esbuild 已经集成好了,不用用户操心。相关配置可以在 config/config.exs 中找到。
其他的静态资源被放置在 priv/static 文件,priv/static/assets 放置生成的资源。 priv/static 下的所有资源都由 lib/hello_web/endpoint.ex 中的 Plug.Static 来伺服。开发环境下,任何 assets 目录下的改变都会触发浏览器端的前端更新。
然后就是 mix phx.new 的选项可能会影响 assets 目录的存在和布局。万一只需要一个 API 项目呢?是吧。
如果默认集成的 esbuild 满足不了你,你也是可以改变的。
最后是 Phoenix 提供了一个小小的 CSS 框架 Milligram。同样你可以改成其他的。
完
本章完,就是介绍下默认的目录,分别是些什么功能。