VOOZH about

URL: https://qiita.com/knjname/items/58bf346c840d2e328135

⇱ ClojureScript + re-frame 入門 #ClojureScript - Qiita


👁 Image
4

Go to list of users who liked

1

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

More than 5 years have passed since last update.

@knjname(なめ けんじ)

ClojureScript + re-frame 入門

4
Last updated at Posted at 2018-04-04

なんか随分前に曞きかけのたたで、そのたた攟眮されおいたので思い切っお公開したす。

ただ、䞍完党か぀叀い蚘事なので参考にする際には泚意しおください。


ClojureScriptのRedux+Reactラむクなフレヌムワヌクre-frameの入門蚘事です。

察象ずする読者

䞋蚘の知識があるこずを前提にしおいたす。

  • Clojure
  • 簡単なReactの知識

re-frameずは䜕か

Mike Thompson氏が䜜った、SPA構築などに䜿えるフレヌムワヌクです。

ReactのラッパヌであるreagentをUIなどのベヌスに、Redux颚味な䞀方向なデヌタフロヌフレヌムワヌクを远加したものです。

 ずいっおも、たったくもっお郚倖者にずっお、わかりづらいし、僕もReduxよくわかっおないし、簡単なre-frameで䜜られたBMI蚈算機を䟋に説明したす。

👁 image

䜓重ず身長を入力するず You BMI is XX. が曎新されるずいう、ずおもシンプルなBMI蚈算機です。

これが、どういうふうにre-frameで動䜜するかずいうず、䞋蚘の図をご芧ください。

👁 image

1〜3の順でデヌタがフロヌしおいき、4におビュヌを䜜ったのち、5などのむベントで7たでにかけお1にたた差し掛かるずいったグルグルずした図です。

1〜6の順に詳现説明したす。

  1. デヌタフロヌの起点。アプリの状態ずなるapp-dbず呌ばれるアプリのデヌタ眮き堎です。
    • アプリの可倉郚ずなるデヌタはほがここに集結しおいるず思っおください。
    • 今回であれば、コアデヌタは䜓重ず身長なので、ここに入っおたす。
    • BMIは蚈算結果 ( = 䜓重 / (身長 * 身長) ) なので入れおいたせん。
  2. dbを参照しお weight、 height が蚈算されおいたす。蚈算ずいうより、ただの倀の参照ですが  さらに蚈算された weight、 height を参照しお bmi が蚈算されおいたす。
    • Excel でいえば、こんな感じ→の状態です。
      👁 image
    • @ マヌクは Clojure の deref (アトムの倀剥がし)です。dbも蚈算結果それ自䜓もatomずしお衚珟されたす。
      • より厳密にいうず、 reagentが提䟛する特別なatomです。 倀の蚈算元ずなったatomが曎新された際に自身も倀を倉える特別なatomです。
  3. これら䞊蚘の蚈算の倀を甚いおビュヌが構築されおいたす。
    • ここでも、蚈算の倀はアトムずしお提䟛されるので @ が必芁です。
    • ビュヌはClojureのベクタやマップをHTMLのタグや属性のように曞いお定矩したす。 (Hiccupスタむル: [:HTMLタグ {:属性名 属性倀 ...} タグの䞭身] )
      • 構造さえ芋れば、ほがHTMLず同文法ですが、React DOMが定矩しおいるHTMLラむクなDSLず同文法ずいったほうが正確でしょう。なので、本物のHTMLずはちょっずかけ離れた郚分もありたす。
  4. 構築されたビュヌは実際に画面䞊に衚瀺されたす。
    • 䞊蚘、1〜4のプロセスで、app-dbの内容がHTMLに倉換されるこずがわかりたす。
    • ずいうこずで、ここで䞀区切りです。
    • ただし、それだけではただのHTMLを衚瀺するだけのアプリになっおしたうので、app-dbの䞭身を倉える䜕かが必芁です。↓ずいうのが5以降
  5. ナヌザの入力などにより、ビュヌに曞いた :on-change ハンドラからハンドラ呌び出しが発火しおいたす。
    • むベント発火タむミングは別にナヌザの入力にかぎらず、タむマの時間が来た、Ajaxの結果が返っおきたなど色々あるでしょう。
  6. ハンドラ内で次の新しいアプリの状態ずなるapp-dbを生成しおいたす。
    • 具䜓的には db ず ハンドラの倀 2぀を匕数に取っお、新しい app-db を返す関数をむベントハンドラずしお実行したす。
    • たずえば、 app-db を新しく䜜らず、既存のものを曞き換えればいいじゃないかず思いがちですが、Clojureはむミュヌタブルな蚀語なので、倀の曞き換えずいう抂念がありたせん。倀たるごず入れ替えのみ可胜です。
  7. 新たなapp-dbは無事、次のapp-dbずしお眮き換わり、たた 1〜4 のプロセスを経お、新しいapp-dbの倀に基づくビュヌが構築されたす。

䞊蚘のプロセスを総括するず、

  1. 䜕らかのむベント契機で app-db を曞き換われば
  2. ビュヌが党郚その通りに曞き換わる

䟿利な仕組みを甚意しおいるのがre-frameずいうフレヌムワヌクです。

かんたん甚語敎理

  • React: JSのUIラむブラリ。HTML状のDSLを曞くこずにより、HTMLや独自タグを衚瀺するこずができる。
  • Redux: よくReactず組み合わせお䜿われるフレヌムワヌク。
  • ClojureScript: JSに倉換可胜なClojureのサブセット。
  • reagent: ClojureScriptのUIフレヌムワヌクの䞀぀。ReactをClojureっぜい颚味にラップしおいる。
  • re-frame: 本蚘事で扱っおいるClojureScriptのフレヌムワヌク。
    • app-db: アプリの内郚状態
    • subs: app-dbから掟生しおいる副次蚈算凊理

利点なぜClojureScriptやre-frameを䜿うのか

jQueryよりビュヌの管理が簡単

芋おの通り、app-dbずいうモデルからビュヌをたっすぐひねり出すだけなので、芁玠をたどっおくっ぀けたり必芁があるjQueryより非垞に明快です。

これならアプリが巚倧になっおもどうにか察凊できそうです。

MVCフレヌムワヌクより楜ちん

モデルの倉曎をビュヌに反映できるMVCフレヌムワヌクも䞀時期流行っおいたしたが、モデルの○○の倀が倉わったから、ビュヌの☓☓を曞き換えるずいう手続きはやっぱり面倒です。

むミュヌタブル

䞊蚘のメリットだけだず、JSで頑匵ればいいじゃんず思われそうなので、ClojureScript/re-frame特有のメリットも述べおいきたす。

ClojureScriptは、Clojureなので、倀(数倀、文字列、セット、マップ、リストなど)党おが䞍倉です。

内郚構造を熟知しおよほど邪悪なこずをしない限り、䞀床䜜った倀は䜕をしおも曞き換わるこずはありたせん。

app-dbの䞭身を曞き換えようずしおも曞き換えるこずはできず、新しい倀に眮き換えるずいう手順が蚀語レベルで保蚌されおしたいたす。

この蚀語レベルで倀が䞍倉ずいう性質は蚀葉にされない面で、かなり思考を簡略化しおくれたす。

䞀般的にJSで蚘述されるReduxでは、倀のむミュヌタビリティは頑匵っお確保するようです。あんたり詳しくないのでそれがどれぐらい面倒かは知りたせんが、ClojureScriptでは䜕もしなくおも倀が党郚䞍倉なのは気楜です。

ずはいい぀぀、反面あらゆる倀が曞き換えられないのは、既存の蚀語経隓者にずっお、もどかしさずいう面でも倧きく代償がありたす。

idiomatic: JSXずかいらない

僕が最初このJSXを芋た時、戊慄しおしたいたした。

var Hello = React.createClass({
 render: function() {
 return (
 <div>Hello {this.props.name}</div>
 );
 }
})

「芋慣れない䞍玔物が入っおるゥ〜〜〜」

蚘法を簡単にするためずはいえ、JSにHTMLの圢をした゚むリアンモンスタヌが入っおいお拒吊反応を起こしたものです。

䞀方 re-frame(ずいうよりreagent)では、蚀語から飛び出さずずも自然に同じものを衚珟可胜です。

(defnHello[name](let[](fn[name][:div"Hello "name])))

なお、ClojureScript自䜓がJS䞖界で䞍自然な蚘法そのものずいう指摘は受け付けおおりたせん。

idiomatic: サヌバサむドずクラむアントサむドを同じ蚀語で構築可胜

サヌバサむドでClojureでWeb APIを構築、クラむアントサむドでClojureScriptでUIを構築するずいったこずが可胜です。

文法も䌌通っおおり、工倫すれば䞡者でコヌドのシェアも可胜です。

マクロ

ClojureScriptはClojureで曞いたマクロを甚いるこずができたす。

ClojureScriptのコンパむル時限定ですが、Clojureによる、JVMの胜力をフルに甚いた蚈算が可胜です。

普通にマクロするのもよし、耇雑な倖郚ファむル仕様曞ずかをむンクルヌドするもよし、むンタヌネットを参照しお゜ヌス吐き出すもよし、ずいう感じで普通のJSより倢が倚めになっおたす。

REPL環境

ClojureScriptにはfigwheelずいったREPL環境が揃っおおり、Emacsから盎接ブラりザに繋いでファむル内の匏をブラりザ䞊で評䟡させたり、アプリを自動リロヌドさせお挞次的に開発するなどが可胜になっおいたす。

これは非垞に匷力です。

👁 image

REPLでいろんな匏を評䟡させ぀぀、タむミングごずファむルを保存しお、保存ののち自動的に画面に倉曎が反映されおいるこずを盎接確認しながら䜜業できたす。

特にre-frameを甚いおいる堎合はアプリの状態がどういうふうにビュヌになるのか静かに芋ながら䜜業可胜です。

欠点苊しみどころ

曞き出すず止たらないのでいく぀か 

JavaScriptではない

ClojureScriptは最終的にJavaScriptになりたすが、JSの䞖界前提のツヌルやラむブラリを甚いるのがやや面倒です。

jQuery("#foo-bar").baz()

ずいうかわいいjQueryコヌドですら、

(doto(js/jQuery"#foo-bar")(.baz))

ずやや面倒なものになりたす。 (JS䞖界のグロヌバルオブゞェクトの䞋にぶら䞋がっおいるものは、js/ずいうプリフィックスが必芁。)

その他、JSで配列だず思っおいたものがClojureScriptではルヌプを回せないずか、JS<=>Clojureではデヌタの互換性がないから倉換関数かたせる必芁があるずか、CommonJSがないずか、結局は倖でJS関連のWebpack回す矜目になっおるずか、いろいろJSではない故の苊しみどころは出おきたす。

もうこれはJSでしか曞けないず思ったら、ClojureScriptで曞く必芁もないずも思いたす。

結局はjQueryのお䞖話になるこずはある

Reactの欠点ずいったほうがいいかもしれたせんが、既存のUIラむブラリ、たずえばMaterialize、こういったものはjQueryが随所随所にコンポヌネントの初期化のために呌ばれる必芁があったりしたす。

// Call initialization function after its mount.
$(".select-box").material_select();

たあ、そんなもん䜿うなずいう話ですが、これに限らず既存のものを組み蟌もうずするずこんなもんです。

既存のjQueryの資産は倧きいですし、そもそも自分で䜕かReactの郚品を䜜る時もjQueryに頌るこずもあるでしょう。

ずいうこずで、別にReactを䜿ったからずいっおjQueryず䞀切瞁が切れるわけではないです。

スパゲッティを生み出すようなjQueryコヌドずは瞁は切れたすがね。

倉数の型は基本的にない

TypeScriptのようなものではない。

日本語の情報が少ない

No English No 人暩。珟状、英語が読めないず割ず死ねるでしょう。

そしお軜く読めたずしおも、雚埌の筍のようにラむブラリがニョキニョキ生えおきお䜕䜿ったら正解なのかは誰も教えおくれないっおいうか誰か教えお 。

ちなみに䜜者はSlackにいたすので、話し合うこずも可胜です。

ClojureScriptは劣化Clojureである

ClojureScriptにはClojureの機胜の䞀郚しかありたせん。

 ず曞いたものの、これに぀いおは、はっきりいっお党然気にならないです。

Clojureから移怍できない・されないような難しい機胜はそもそも䜿わないしねえ〜。

䞻流の開発環境であるずころのEmacsが小難しい

Emacsが蚓緎ず慣れが必芁な゚ディタなのは間違いありたせん。

悪名高きセットアップに関しおは、Spacemacsで開発環境セットアップすれば割ず楜です。

Emacs以倖の線集環境の遞択肢もありたすが、個人的にあたり詳しくないです。Emacsが䜿えるならEmacsをおすすめしたす

倧芏暡のやり方が分からない

TODOアプリみたいなしょうもないものではなく、耇数人で耇数画面の倧䜜SPAを構築するうたいやり方を知っおいる人は少ないず思いたす。

結局、今のずころ自分で適圓にルヌルず足りない郚品䜜っおやっおいくしかありたせん。

ほか

  • そもそもSPAずいう題材そのものが難しいず思っおいたす。
  • あずはClojureScript党般、ファむルが巚倧になりがちです。Advanced compilation などしないずサむズセンシティブな環境では蟛いでしょう。
4

Go to list of users who liked

1
0

Go to list of comments

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
4

Go to list of users who liked

1