16
14

More than 5 years have passed since last update.

Elm開発環境について

Last updated at Posted at 2017-12-10

Elm開発環境について
Elm Architecture の Model-View-Updateについて

 ElmはWebアプリのフロントエンドの開発言語です。Haskellのような純粋関数型言語であり、コンパイルするとJavaScriptとHtml、CSSのコードを吐き出します。つまりAltJSの言語です。個人的にはHaskellが単に好きなので、JavaScriptを書かずにHaskellのようなシンタックスで書けるのならありがたいと思います。今まで手を出さずに来たのですが、最近はElmも十分に実用的になり生産性の高い言語になったとの噂を聞き、試してみたいと思いました。

 まずは公式サイトを見ながら、基本的な開発環境を構築したいと思います。Centos7のサーバ上で実験をしていきます。
https://guide.elm-lang.org/install.html

1.elmのインストール

 次のnpmコマンド一発でインストールできます。必要最低限な開発ツールーもインストールされますので、便利です。

npm install -g elm

(追記)2018/09/05 上記のインストールでは Elm 0.19がインストールされます。
0.19の新機能を特に望まない方は下記のコマンドで0.18をインストールすることをお勧めします。
既存のパッケージが使えません。===>Elm 0.19 について

npm install -g elm@0.18.0

 elm-repl (the Read-Eval-Print Loop, or REPL)という会話型のインタープリタが使えるようになります。elm言語のコアの部分を確認するには良いツールでしょう。まあ、しかしここでは説明はしません。

 その他に、elm-packageとelm-make、elm-reactorというツールが使えるようになります。これはよく使うので以下に説明していきます。

2.elmのソースコード

 公式サイトのButtonsサンプルプログラムを少し修正します。

MyButtons.elm
module MyButtons exposing (..)

import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)

main =
  Html.beginnerProgram { model = model, view = view, update = update }

-- MODEL
type alias Model = Int

model : Model
model =
  0

-- UPDATE
type Msg = Increment | Decrement

update : Msg -> Model -> Model
update msg model =
  case msg of
    Increment ->
      model + 1

    Decrement ->
      model - 1

-- VIEW
view : Model -> Html Msg
view model =
  div []
    [ button [ onClick Decrement ] [ text "-" ]
    , div [] [ text (toString model) ]
    , button [ onClick Increment ] [ text "+" ]
    ]

 
 先頭にmodule宣言を置きました。これで他のファイルからこのプログラムをMyButtons moduleとして読み込むことが可能となります。実際にはindex.jsでElm.MyButtons.embed()のようにMyButtons moduleを使っています。

module MyButtons exposing (..)

 ここでは開発環境の構築に焦点を合わせていますので、プログラムの中身の説明は後日に回します。Elm Architecture (Model,Update,View)はReduxのモデルとなったということもありますし、cmd/subはHaskellのIO モナドとの関連もありそうなので別テーマとしたいです。

3.パッケージのインストール

 
 MyButtons.elmのソースコードでHtmlパッケージをimportしているので、そのパッケージをインストールしておく必要があります。以下のコマンドを打ちます。

elm-package install elm-lang/html

 以下にコマンド履歴を示しておきます。

[sand@www13134uf test]$ elm-package install elm-lang/html
Some new packages are needed. Here is the upgrade plan.

  Install:
    elm-lang/core 5.1.1
    elm-lang/html 2.0.0
    elm-lang/virtual-dom 2.0.4

Do you approve of this plan? [Y/n]
Starting downloads...

  ● elm-lang/html 2.0.0
  ● elm-lang/core 5.1.1
  ● elm-lang/virtual-dom 2.0.4

Packages configured successfully!

 htmlとvirtual-domがダウンロードされるばかりでなく、coreもローカルにダウンロードされるようです。virtual-domはReactのものよりも高速だとの評判があります。elm-stuffディレクトリの下にダウンロードされます。またnpmの時と同じように、elm-package.jsonファイルが作られます。

elm-package.json
{
    "version": "1.0.0",
    "summary": "helpful summary of your project, less than 80 characters",
    "repository": "https://github.com/user/project.git",
    "license": "BSD3",
    "source-directories": [
        "."
    ],
    "exposed-modules": [],
    "dependencies": {
        "elm-lang/core": "5.1.1 <= v < 6.0.0",
        "elm-lang/html": "2.0.0 <= v < 3.0.0"
    },
    "elm-version": "0.18.0 <= v < 0.19.0"
}

4.コンパイル

 次のコマンドをターミナルから打つことで、MyButtons.elmをコンパイルし、elm.jsを出力します。コンパイルの位置づけは、Reactの時にWebpackでバンドルファイルを作るのに似ています。index.htmlで読み込むと、ブラウザからアクセスできる仕組みです。

elm-make MyButtons.elm --output elm.js

5.index.html

 コンパイル結果であるelm.jsをindex.htmlで読み込みます。

index.html
<!doctype html>
<html>
    <head>
    </head>
    <body>
        <div id="elm-area"></div>
        <script src="elm.js"></script>
        <script>
            Elm.MyButtons.embed(document.getElementById("elm-area"));
        </script>
    </body>
</html>

Elm.MyButtons.embed(document.getElementById("elm-area"))行で、作成したプログラム(elm.js)が、<div id="elm-area"></div>の中で走るようになります。

6.httpサーバの立ち上げ

 以下のコマンドでhttpサーバが立ち上がります。www.mypress.jpはサーバのアドレスで、3030はポート番号です。

elm-reactor -a=www.mypress.jp -p=3030

 以下のURLにブラウザでアクセスするとアプリがブラウザに表示されます(今回は参照することができません)。

http://www.mypress.jp:3030/index.html

 今回はこれで終わりますが、次回からは言語やアーキテクチャーの中身に触れていきたいと思います。

16
14
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
16
14