在凤凰钩中使用闪光
#javascript #网络开发人员 #elixir #gleam

Phoenix使用Elixir,但是在处理LiveView Hooks时,需要JavaScript。但是如何在该领域使用另一种功能语言?

呈现Gleam

Gleam

闪闪发光的编程语言

favicon gleam.run

类型系统的功能,功能编程的表现力,具有熟悉的现代语法。

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之后您将在浏览器控制台中看到类似的消息。

GleamPHX

下一步?

todo:也许在更改GLEAM文件时配置自动加载。

您可以在此处查看示例项目https://github.com/ElixirCL/gleamphx