简介
Phoenix是Elixir开发的web框架,采用MVC架构。如果你有其他网络框架(如Ruby on Rails或Django)的开发经验,会对Phoenix的许多组件和概念感到熟悉。
Phoenix兼顾了开发效率和运行性能,同时也有一些有趣的新特性,如用于实时通信的channel以及高效的预编译模板。
在学习Phoenix之前,需要熟悉Elixir,因为Phoenix项目本身也是一个Elixir应用。本文是Phoenix的入门教程,旨在帮助你快速创建一个Phoenix项目并运行起来。更多更全面的知识你永远可以从Phoenix官网获取。
安装
在开始使用Phoenix之前,需要先安装Elixir。当然,安装Elixir的前提是安装Erlang,因为Elixir程序也是编译成beam运行在Erlang虚拟机中的。安装Erlang和Elixir不是本文的重点,大家可自行去各自的官网下载安装。要求是Elixir 1.14及以上版本,Erlang 24及以上版本,本教程使用的Phoenix是1.7.1版本。
运行 elixir -v
命令可以查看Erlang和Elixir的版本。
elixir -v
Erlang/OTP 24 [erts-12.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Elixir 1.14.0
安装好Erlang和Elixir之后,还需要安装Hex。Hex是Elixir的包管理工具,安装方式是在命令行执行下面的命令:
$ mix local.hex
如果你已经安装了Hex,上面的命令会将你的Hex更新到最新版本。
因为Elixir可以无缝使用Erlang的库,因此我们还需要安装Erlang的包管理工具。虽然Erlang没有官方的包管理工具,但是rebar3已经成为了事实上的Erlang官方包管理工具了。rebar3其实不用单独安装,后面安装Phoenix时会自动安装rebar3。如果你对安装rebar3感兴趣,可以看下这篇文章:rebar3安装-windows篇。建议还是看下,相信会有新的收获。特别是当你在PowerShell中运行Elixir相关命令报错时,它会给你答案。
如果你想搜索Elixir包或者查看包的文档,可以访问hexdocs网站。当然,Phoenix的文档也在这里可以找到。
一切就绪后,通过下面的命令安装Phoenix命令:
$ mix archive.install hex phx_new
做为后端框架,要用到数据库是很合理的,Phoenix默认使用的是PostgreSQL,当然MySQL也是支持的。数据库不是一个必选项,但是建议你有一个。
修改镜像源
Hex默认使用的镜像源在S3上,国内访问可能出现无法访问的情况。好在Hex也提供了国内的镜像源,Hex和rebar3都可以配置。
配置方式有两种,第一种是配置环境变量,如下:
export HEX_MIRROR="https://hexpm.upyun.com"
export HEX_CDN="https://hexpm.upyun.com"
第一行是配置Hex,第二行是配置rebar3。如果遇到下面的问题,可以先运行 mix local.hex
。
** (Mix) Could not verify authenticity of fetched registry file. This may happen because a proxy or some entity is interfering with the download or because you don't have a public key to verify the registry.
You may try again later or check if a new public key has been released in our public keys page: https://hex.pm/docs/public_keys
第二种方式是对于Hex和rebar3的配置方式就不一样了。对于Hex,可以使用下面的命令配置:
$ mix hex.config mirror_url https://hexpm.upyun.com
对于rebar3,需要修改项目的rebar.config文件:
{rebar_packages_cdn, "https://repo.hex.pm"}.
详细内容可参考下面的链接:
- https://ruby-china.org/topics/31631
- https://hex.pm/docs/mirrors
配置IDE
Elixir没有官方的IDE(集成开发环境),这里推荐VisualStudioCode和Spacemacs。
vscode推荐安装ElixirLS和Phoenix Framework这两个插件。Spacemacs配置Elixir开发环境推荐看官方文档,笔者也还未亲自试验,希望可行。
其他代码编辑器如Atom,IntelliJ IDEA以及vim等也有Elixir插件支持,可自行搜索配置。
HelloWorld
终于来到了HelloWorld,让我们来创建我们的第一个Phoenix应用。创建Phoenix应用的命令如下:
$ mix phx.new hello
hello
是项目名,它会在命令的工作目录下创建一个hello目录,这里也支持相对路径,比如 mix phx.new learn/hello
,此时工程文件会放到 ./learn/hello
目录下,项目名依然是hello。
前面我们说过,Phoenix默认使用的是PostgreSQL数据库,如果你使用的是MySQL数据库,可以使用 --database
指定:
$ mix phx.new hello --database mysql
除了PostgreSQL和MySQL,Ecto还支持MSSQl,SQLite3,ClickHouse和ETS。如果现阶段你还不打算使用数据库或者你的项目不需要使用数据库,那么可以使用 --no-ecto
去掉数据库依赖:
$ mix phx.new hello --no-ecto
Ecto是Elixir中一个功能强大的数据验证和持久化库,同时提供了数据库适配器,后面我们还会再学习它。
按下回车之后,命令会打印出它为你创建的文件,并询问你是否下载依赖:
$ mix phx.new hello
* creating hello/config/config.exs
* creating hello/config/dev.exs
* creating hello/config/prod.exs
...
Fetch and install dependencies? [Yn]
我们输入Y来安装所需的依赖,如果是第一次执行命令,Phoenix还会询问你是否安装rebar3,选择安装即可。
安装完依赖以后,Phoenix会打印一段提示告诉你接下来如何启动应用:
Fetch and install dependencies? [Yn] Y
* running mix deps.get
* running mix deps.compile
We are almost there! The following steps are missing:
$ cd hello
Then configure your database in config/dev.exs and run:
$ mix ecto.create
Start your Phoenix app with:
$ mix phx.server
You can also run your app inside IEx (Interactive Elixir) as:
$ iex -S mix phx.server
先暂停一下,别急着按照提示去操作。
如果你创建应用时使用了 --no-ecto
选项,那么这里不会有 $ mix ecto.create
这条命令。如果你用到了数据库,也先别急着去执行这条命令。这条命令的功能是为你创建一个数据库,但是我们还没告诉ecto数据库在那里,如何连接以及数据库名称呢,所以先别急。
打开 hello/config/dev.exs
文件,找到下面这段配置:
# Configure your database
config :hello, Hello.Repo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "hello_dev",
stacktrace: true,
show_sensitive_data_on_connection_error: true,
pool_size: 10
如果使用的是MySQL数据库,配置如下:
# Configure your database
config :world, World.Repo,
username: "root",
password: "",
hostname: "localhost",
database: "hello_dev",
stacktrace: true,
show_sensitive_data_on_connection_error: true,
pool_size: 10
我们需要根据实际情况来修改这里的配置,然后再执行 mix ecto.create
,如果你已经提前建好了数据库,那么这个命令也不必要执行。
接下来我们可以使用命令 mix phx.server
来启动服务了,默认端口是4000。如果你在创建应用时没有安装依赖,那么这里还会提示你去安装依赖,输入Y回车即可。
打开浏览器,输入localhost:4000,不出意外的话,你会看到Phoenix的欢迎页,那么恭喜你入坑Phoenix。虽然每个版本的Phoenix欢迎页可能都不太一样,但是你总能看到这样的画面。
![](https://img-blog.csdnimg.cn/direct/9ab8effc9af54084b18601a0c1808a3c.png)
Phoenix自带了热更新功能,服务启动后,Phoenix会自动监听文件变化并更新网页,Windows和Mac OS自带了这个功能,但是在Linux上,需要手动安装文件监视器才能生效,具体可参考 inotify-tools wiki 。
除了欢迎页,Phoenix在开发环境下还默认自带了一个监控后台。在浏览器输入localhost:4000/dev/dashboard,就可以看到监控看板了。
目录结构
在终端按下ctrl+c,然后输入Y停止服务。接下来我们简单介绍下Phoenix项目的目录结构,更详细的说明会在后面的教程中逐步完善。
![](https://img-blog.csdnimg.cn/direct/a967c8fdf4bb481b971249099971000c.png)
_build
目录是存放编译结果的目录,不应该加入版本控制。
assets
目录是存放前端资源的目录,CSS,JS文件都在这里。
config
目录是配置文件存放目录,Phoenix的配置文件使用的是ELixir的脚本文件。
deps
目录是依赖存放目录。
lib
是服务主要代码的存放目录,包括路由,页面和业务逻辑等,也就是MVC都在这个目录下。
priv
也是各种资源文件的存放目录。 gettext
存放的是国际化相关文件; repo
下存放的是数据库变更脚本文件,注意这里的脚本不是 .sql
文件,而是 .exs
文件; assets
目录下的资源文件经过编译之后会放到 static
目录下。在 static
目录下也有一个 assets
目录,里面是css和js文件,还有一个 images
目录用来存放图片资源。
test
目录下是测试文件。
下面我们再看下 hello_web
这个目录,它的主要内容是MVC中的V和C。
![](https://img-blog.csdnimg.cn/direct/7df256b741f4454090265aab722fc5bc.png)
components
目录是组件目录,所谓组件就是页面。
controllers
目录是控制器目录,但实际上它里面既有C也有V, page_html
下面放的其实就是HTML模板,你看到的欢迎页就是由 home.html.heex
渲染出来的。
hello_web
下还有一些其他文件,我们会在后面的教程中介绍它们的作用,以及如何编辑它们。