Phoenix使用Elixir,但是在处理LiveView Hooks时,需要JavaScript。但是如何在该领域使用另一种功能语言?
呈现Gleam
类型系统的功能,功能编程的表现力,具有熟悉的现代语法。
Gleam附带编译器,构建工具,格式化器,编辑器集成和软件包管理器都内置了,因此创建Gleam Project只是运行gleam new
。
以我的拙见,闪光是打字稿的理想选择!如果您想要功能性语言的所有好处和凤凰钩的类型系统。
安装
确保gleam
二进制位于您的 $ path 中。您可以参考Installation Guide以获取更多详细信息。
$ gleam --version
gleam 0.26.1
GLEAMPHX项目
这将是一个没有ecto的小型简单项目(凤凰1.6)。只是一个带有简单挂钩的Liveview。
创建我们的项目
首先,让我们从一个名为gleamphx
的项目开始,没有数据库要求(只是要苗条)。
$ mix phx.new . --app gleamphx --no-ecto
创建我们的闪光项目
让我们转到assets/
目录,创建一个名为hooks
的新的Gleam Project
。
$ cd assets
$ gleam new hooks
$ cd hooks
现在我们编辑gleam.toml
,以便我们可以设置Javascript
target。
name = "hooks"
version = "0.1.0"
description = "A Gleam project"
# ...
target = "javascript"
[javascript]
# Generate TypeScript .d.ts files
typescript_declarations = true
# Which JavaScript runtime to use with `gleam run`, `gleam test` etc.
runtime = "node" # or "deno"
JavaScript代码
这将是将导出我们所有挂钩的主要JavaScript文件。该文件将在稍后在app.js
中使用。
$ touch assets/hooks/index.js
import * as Hello from "./build/dev/javascript/hooks/hello.mjs";
export default { Hello };
闪光代码
在src/
目录中我们将创建钩子。
让我们创建hello.gleam
钩。
import gleam/io
pub fn mounted() {
io.println("Hello from Gleam!")
}
Phoenix配置
好吧,我们已经准备好了。让我们配置Phoenix!
资产/app.js
首先让编辑assets/app.js
导入我们的钩子。
// ...
import Hooks from "../hooks"
// ...
let liveSocket = new LiveSocket("/live", Socket, {hooks: Hooks, params: {_csrf_token: csrfToken}})
mix.exs
让我们在assets.deploy
任务中添加一个新的构建步骤。
"gleam.build": [
"cmd cd assets/hooks && rm -rf build && gleam build"
]
此任务仅将闪光代码构建到目标JavaScript文件。
defp aliases do
[
"gleam.build": [
"cmd cd assets/hooks && rm -rf build && gleam build"
],
setup: ["deps.get"],
"assets.deploy": [
"gleam.build",
"esbuild default --minify",
"phx.digest"]
]
end
我们将任务添加到assets.deploy
管道。
lib/gleamphx_web/router.ex
好的,现在我们只需要测试。让我们创建一个简单的实时视图,其中div挂在闪光中的Hello
函数中。
首先,我们配置路由器
scope "/", GleamphxWeb do
pipe_through :browser
live "/", Live.Example, :index
end
lib/gleamphx_web/live/example.ex
然后创建我们的模块
defmodule GleamphxWeb.Live.Example do
use GleamphxWeb, :live_view
@impl true
def render(assigns) do
~H"""
<div id="ExampleGleamHook" phx-hook="Hello">Example Hooked Component</div>
"""
end
end
如果一切顺利,则在mix phx.server
之后您将在浏览器控制台中看到类似的消息。
下一步?
todo:也许在更改GLEAM文件时配置自动加载。
您可以在此处查看示例项目https://github.com/ElixirCL/gleamphx