Elixir Phoenix 指南 - 认识目录结构 - 精简翻译

437 阅读4分钟

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, templatesviews 中的所有文件,都是为我们看到的欢迎页面服务的。

看下 templatesviews 目录,可以看到,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。同样你可以改成其他的。

本章完,就是介绍下默认的目录,分别是些什么功能。