12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

#NervesJPAdvent Calendar 2021

Day 12

Third-party JS packages on Phoenix 1.6 (2021/12/12)

Last updated at Posted at 2021-12-11

2021/12/12(日)の回です。
前の日は、水力発電所のオープンソース化で有名なkochi.exで活動されている@nishiuchikazumaさんによる『Nervesにユーザ名/パスワードでSSHログインする』でした。
とりあえずNervesに触れてみましょう! 的なハンズオンなどでファームウェアを配るときに活用するとよいのではないかとおもいました。

はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:
Nervesを楽しんでいますか:bangbang::bangbang::bangbang:
Phoenixを楽しんでいますか:bangbang::bangbang::bangbang:

#NervesJPのカレンダーですが、Phoenixの話題を書きます。

ぶっちゃけNerves関係ないけど,こんなんやってみたよ! (ElixirかIoTくらいは絡んでいればおけ

なので:ok:です、きっと。

もっと言うと、Nervesで作ったアプリケーションが会話する先として、Phoenixを使うことがあるとおもいます。

たとえば

なプロジェクトの感じです。
@takasehideki 先生に使っていただきました。

:point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5:Phoenix 1.5で作りました。

Chart.js等を追加したくなることありますよね、これからもきっと。
Phoenix 1.6になってからどうやって追加すればいいのかちょっと迷った(ほんのちょっとね、迷走、瞑想をしました)ので、私が掴んだ情報を披露しておきます。

Esbuild Hexドキュメントを読むと書いてあるよ!!!

Phoenix 1.6

気づいたことをつれづれなるままに

1.6からはmix phx.new hell_worldこれでLiveViewつきです。
逆に俺にはLiveViewなぞいらぬという御仁のために、--no-live Optionが追加されています。

mix setup(セラップ)してからのmix phx.serverして、Visit: http://localhost:4000できるようになるまでが、Phoenix 1.5の時と比べるとメチャクチャ速い:rocket::rocket::rocket:です。
その正体はEsbuild Hexです。
OwnerはElixir作者であるJosé Valimさんで、安心です。

名前がいっしょだから紛らわしいですが結局のところ、esbuild -- An extremely fast JavaScript bundlerが使われています。
詳しいことを知りたい方は、@koga1020 さんが、『Elixirのesbuildラッパーは何をしているのか』にて解説してくださっていますので、こちらの記事をご参照ください1:pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

スクリーンショット 2021-11-21 22.50.53.png

(https://esbuild.github.io/)

これです。
まさにこの通りです。
Phoenix 1.5では、webpackerが使われていました。
Phoenix 1.6では、esbuild -- An extremely fast JavaScript bundlerが使われています。

3rd PartyのJS Packageを追加する

3rd PartyのJS Packageを追加したいとおもいました。
フロントエンドに詳しい方ならなんてことはないのでしょうが、Phoenix 1.5と1.6では雰囲気が全然違いまして、どうやって追加するのだろう? 私は途方に暮れそうになりました。

1.5
├── assets
│   ├── .babelrc
│   ├── css
│   │   ├── app.css
│   │   └── phoenix.css
│   ├── js
│   │   └── app.js
│   ├── package.json
│   ├── static
│   │   ├── favicon.ico
│   │   ├── images
│   │   │   └── phoenix.png
│   │   └── robots.txt
│   └── webpack.config.js
1.6
├── assets
│   ├── css
│   │   ├── app.css
│   │   └── phoenix.css
│   ├── js
│   │   └── app.js
│   └── vendor
│       └── topbar.js

なんか少ない...
package.jsonがない...

どうすりゃいいのさ? って悩んでいるFRIENDもいたみたい。

こたえ

に書いてあります。
2つ方法があります。

  1. assets/vendorにJSを置きましょう
  2. assetsフォルダ配下で、npm install chart.js --save

その他公式ドキュメントとしては、

に、esbuildではないビルドシステムを使う方法が書かれています。

また

のブログはわかりやすかったです。
Esbuild Hexは外しちゃって、esbuild -- An extremely fast JavaScript bundlerをJSのまま使うとでも申しましょうか、**esbuild + NPM combo(The best of both worlds)**と紹介されています。
実を言うと、私は先にこちらに飛びついて、そのあと https://github.com/phoenixframework/esbuild#third-party-js-packages をみつけました

Thanks!

assetsフォルダ配下で、npm install chart.js --save 実践

をやってみます。

準備

を参考にインストールを済ましておいてください。
npm install ...ができるようにしておいてください。

さっそくつくるぜよ

$ mix phx.new hello --no-ecto
$ cd hello
$ mix setup
$ cd assets
$ npm install chart.js --save
$ cd ..

npm install chart.js --saveで、

  • assets/package.json
  • assets/package-lock.json

が作られます。

assets/package.json
{
  "dependencies": {
    "chart.js": "^3.6.0"
  }
}

とりあえずここと同じものを表示してみます。

$\huge{はい!\ できました}$

スクリーンショット 2021-11-22 0.02.57.png

説明が面倒になってきたし、雰囲気でJS -> Elixirの置き換えを私はしているだけなのでソースコードを全部載っけておきます。
なんとなく感じてください!!!

ドキュメントは

です。

lib/hello_web/live/chart_live.ex
defmodule HelloWeb.ChartLive do
  use HelloWeb, :live_view

  def mount(_params, _session, socket) do
    labels = [
      "January",
      "February",
      "March",
      "April",
      "May",
      "June",
    ]
    data = %{
      labels: labels,
      datasets: [%{
        label: "My First dataset",
        backgroundColor: "rgb(255, 99, 132)",
        borderColor: "rgb(255, 99, 132)",
        data: [0, 10, 5, 2, 20, 30, 45],
      }]
    }
    config = %{type: "line",
              data: data,
              options: %{}}

    socket = assign(socket, :config, config)
    {:ok, socket}
  end

  def render(assigns) do
    ~H"""
    <div>
      <canvas id="myChart"
              phx-hook="Chart"
              data-chart-data={ Jason.encode!(@config) }>
      </canvas>
    </div>
    """
  end
end
lib/hello_web/router.ex
   scope "/", HelloWeb do
     pipe_through :browser
 
     get "/", PageController, :index
+    live "/chart", ChartLive
   end
assets/js/hooks.js
import Chart from 'chart.js/auto';

let Hooks = {};

Hooks.Chart = {
  mounted() {
    const config = JSON.parse(this.el.dataset.chartData)
    this.chart = new Chart(this.el, config)
  }
}

export default Hooks;
assets/js/app.js
 import {Socket} from "phoenix"
 import {LiveSocket} from "phoenix_live_view"
 import topbar from "../vendor/topbar"
 
+import Hooks from "./hooks";
+
 let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
-let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}})
+let liveSocket = new LiveSocket("/live", Socket, {hooks: Hooks, params: {_csrf_token: csrfToken}})
assets/package.json
{
  "dependencies": {
    "chart.js": "^3.6.0"
  }
}

Gigalixir

ついでに。
知っていることを書いておきます。
Gigalixirにデプロイするときは、assets/package.jsonに書き足しておく必要があるものがあります。

に書いてあります。

If you’re using Phoenix v1.6, it uses esbuild to compile your assets but Gigalixir images come with npm, so we will configure npm directly to deploy our assets. Add a assets/package.json file if you don’t have any with the following:

assets/package.json
{
  "scripts": {
    "deploy": "cd .. && mix assets.deploy && rm -f _build/esbuild"
  },
  "dependencies": {
    "chart.js": "^3.6.0"
  }
}

Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir:bangbang::bangbang::bangbang:
Enjoy Nerves:bangbang::bangbang::bangbang:
Enjoy Phoenix:bangbang::bangbang::bangbang:

人間五十年 下天の内をくらぶれば、夢幻のごとくなり。一度生を得て滅せぬ者のあるべきか

時は今あめが下知る五月かな

露と落ち露と消えにしわが身かななにはのことも夢のまた夢

親思ふ心にまさる親心 今日のおとづれ何と聞くらん


おまけ

Elixirを始めてみよう! とおもった、あなたに参考情報(クリスマス🎄プレゼント)を贈ります。:gift::gift::gift:
思い立ったが吉日です!!!

オススメの書籍 :books:

Webアプリケーションを楽しむなら

IoTを楽しむなら

AIを楽しむなら

コミュニティ

FCOvBkAUYAE6mL8.jpeg
@piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:

  1. と言って、私は足早に立ち去ります。ごめん、私には説明できません。『Elixirのesbuildラッパーは何をしているのか』はコンパクトにまとまっているし、とてもわかりやすいです。ありがとうございます! 理解できた気になりました!

12
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?