Clojureでマルチプラットフォーム開発

この記事はeureka Native Advent Calendar 23日目の記事です。
前回は長坂Interface Builderに依存しないiOS開発のススメでした!

はじめに

こんにちは!Pairs事業部の竹内です:)

普段はPairsのサーバーサイドをGoやTypeScriptで書いていたりする私ですが、
休日や退勤後にはLispファミリーの一つであるClojureをメインに、複数のプラットフォームでアプリケーションを作っています。

今回はeureka “Native” Advent Calendarということで、私が普段行っている開発スタイルをベースに、
JVM, JavaScript環境上で動作するClojureを使って爆速にマルチプラットフォーム開発をする方法について書きます。

Clojureでマルチプラットフォーム開発をする一つの理由

iOS, Android, サーバーサイド, フロントエンドなど、マルチプラットフォームに開発出来る環境は無数にあり、当然Clojureだけが達成出来ることではありません。

あえてClojureで開発する理由はどこにあるのでしょうか。

REPL+nREPLを使った爆速開発がどのプラットフォームでも行える

Clojureはプラットフォームに関わらず、プロジェクトの再ビルドをする事なくREPLに軸を置いて開発を行う “REPL駆動開発” で開発を行います。

REPLというと、playground的な使い方のイメージを持たれる事も多いと思うのですが、
Clojureでは以下の形でREPLをフルに活かした開発を行います。

  1. 開発中はアプリケーションの起動・終了などもREPL上で行い、アプリケーションの変更はREPLに再評価させる事で行う
  2. REPLと開発環境の連携を可能にする “nREPL” を使用して、開発環境上から直接再評価を行う

この二点によって、開発者は以下の要領でコンパイルの時間を待たされる事無く開発環境とアプリケーションの画面を確認しながら素早く開発を行う事が出来ます。

  1. 開発するプロジェクトでREPLを立ち上げる
  2. エディタ/IDEを立ち上げて自動でREPLへ接続される
  3. エディタ/IDEからコードを編集し、設定したキーバインドを使ってコードを直接REPLで評価させる
  4. アプリケーションを再起動させる(数秒~十数秒程度)
  5. 動作を確認し、また3番へ戻る

実際に開発している様子が↓の動画になります。

https://www.youtube.com/watch?v=BF-W1Icfa68&w=560&h=315

これはサーバーサイドでの開発の様子ですが、Clojureを採用しているのであれば同様の開発がネイティブアプリの開発でも出来るようになります。

続いてClojureによるネイティブアプリの開発方法を見ていきます。

Clojureによるネイティブアプリ開発

よく知られるClojureを使ったネイティブアプリ開発のアプローチは二種類存在します。

うち一つはJavaの代わりとしてAndroidのAPIを使ってAndroidアプリケーションを開発するClojure/Androidなのですが、こちらのアプローチは

  • 一年程前から開発が止まってしまっている
  • アプリ起動時にClojureのランタイムを立ち上げる仕組み上、アプリの起動時間が10秒以上に伸びてしまう

と言った理由から今はほとんど使われていません。

もう一つはClojureからJavaScriptへトランスパイルする事でReactNativeのアプリケーションを作る方法で、こちらは活発に開発が続けられているre-natalを用いて開発します。

よって、基本的には後者が扱われるためこちらについて見ていきます。

re-natalによるネイティブアプリ開発

re-natalはClojureScript(ClojureからJSへのトランスパイラ)で使用されるfigwheelによって、

  • ClojureのソースコードやCSSファイル等の静的ファイルの自動リロード(Live code reloading)
  • REPL+nREPLの立ち上げ

この2つが実現されるため、サーバーサイドと同様のREPLを主軸にした開発が出来る上で、さらに画面の再描画を自動で行う事が出来ます。

実際にre-natalを使用して開発している様子が以下の動画になります。

まとめ

以上、早足ですがClojureでのマルチプラットフォーム開発について書きました。

ネイティブアプリの開発ではReactNativeに依存する形となるClojureでのマルチプラットフォーム開発ですが、REPL駆動開発を使った高速な開発サイクルに少しでも興味を持って頂けたら幸いです。

それでは、またお会いいたしましょう!

次は24日目、JohnのNativeエンジニアでも理解できるMachine Learningのイントロです。お楽しみに!