やりたかったことを実現できたので、方法を共有します。
背景
前回はlumoを使って、nodejsのアプリをcojurescript(以下cljs)で作りました。lumo(javaに依存しないclojurescriptビルドツール)でnodejsアプリを作る方法
それはそれで嬉しいのですが、hiccupというhtmlの作成をサポートしてくれるclojureのライブラリを使えれば個人的にさらに嬉しいので、やり方を調べてみました。
lumoを内部で利用しているcalvinというツールを使うことで、hiccupを利用してnodejsのアプリが作れたので、その方法を共有します。
全体像
この流れで説明します。- 環境構築
- hiccupに依存したプロジェクトの作成
- replで動作確認
- プログラムの実行
- ビルドして実行
- まとめ
- 参考
環境構築
nodejsとnpmが使える環境を用意してください。$ node -v v8.4.0 $ npm -v 5.3.0
lumoをインストールします。
npm i -g lumo-cljs
calvinをインストールします。
npm i -g calvin-cljs
hiccupに依存したプロジェクトの作成
hiccupを使うためのプロジェクトを作ります。適当なディレクトリを作ります。
mkdir -p ~/gitprojects/bootstrapped-cljs-practice cd ~/gitprojects/bootstrapped-cljs-practice
ディレクトリを作れたら、下記のようなproject.cljを作成します。
project.clj
(defproject bootstrapped-cljs-practice "0.1.0-SNAPSHOT"
:description "A project for my practice how to use bootstrapped cljs."
:license {:name "MIT license"
:url "https://opensource.org/licenses/MIT"}
:dependencies [[hiccups "0.3.0"]]
:cljsbuild {:builds
[{:id "dev"
:source-paths ["src"]
:compiler {:output-to "out/main-express-sample.js"
:main express-sample.core
:optimizations :simple
:target :nodejs}}]})
上記のproject.cljでhiccupをcljsで使えるようにしてくれているhiccupsを依存関係(dependencies)に設定しています。
buildの記述がないとreplが起動しないため、後の手順で作る src/express_sample/core.cljs用のビルド設定も記述しています。
replで動作確認
下記のコマンドで、hiccupsなどの関連ライブラリがダウンロードされて、replが起動します。(「lein deps」に似た「calvin deps」コマンドはあるのですが、それは依存関係を表示してくれるだけで、関連ファイルのダウンロードはしてくれないようです。 2017.09.06 時点)
calvin repl
下記のようなコマンドで、hiccupsを通してhiccupの機能を利用できます。
(require '[hiccups.runtime :as h]) (h/render-html [:h1 "hoge"])
しかし、require-macrosはできないようでした。
(require-macros '[hiccups.core :as hiccups :refer [html]])
replでの動作確認により、hiccup(hiccups)を部分的に使えることが分かりました。
プログラムの実行
replで利用できることが分かったので、nodejsのアプリとして利用してみます。webアプリを作るためにexpressを利用しました。
プロジェクトディレクトリでnodejsプロジェクトを開始し、expressを読み込みます。
cd ~/gitprojects/bootstrapped-cljs-practice npm init npm install express --save
expressとhiccupを使ったプログラムを記述します。
src/express_sample/core.cljs
(ns express-sample.core
(:require [hiccups.runtime :as hiccupstr]))
(def express (js/require "express"))
(def app (express))
(.get app "/"
(fn [req res]
(.send res (hiccupstr/render-html
[:div
[:p "Hello world."]
[:a {:href "/sample"} "sample"]]))))
(.get app "/sample"
(fn [req res]
(.send res (hiccupstr/render-html
[:div
[:p "sample page"]
[:a {:href "/"} "home"]]))))
(.listen app 3000
(fn []
(js/console.log "started-express")))
下記のコマンドで実行できます。
calvin repl -c src -m express-sample.core
http://localhost:3000にアクセスすると、cljsで記述したページにアクセスできます。
ちなみに、上記のコマンドで実行中にcljsファイルを書き換えても、(記事執筆2017.09.06時点では)コマンドを再実行しなければ変更が反映されないようでした。
cljsで作ったプログラムを実行できました。
ビルドして実行
プログラム単体で実行できたので、cljsをjsに変換して、nodejsのアプリとして実行してみます。下記のコマンドでproject.cljに記述したdevのbuildを実施できます。
(project.cljに記述したbuildのoptimizationsがnoneだとエラーになるので、simpleにしています。)
calvin build dev
ビルドしたファイルの出力先としてout/main-express-sample.jsを指定したため、ビルドしたjsファイルは下記のコマンドで実行できます。
node out/main-express-sample.js
cljsのプログラムを実行した時と同様に、http://localhost:3000にアクセスすると、サンプルページを確認できます。
cljsをjsにビルドし、nodeコマンドで実行できました。
まとめ
nodejs上でlumoを動かし、cljsでhiccup(hiccups)を部分的に呼び出し、hiccupとexpressを利用したnocejsアプリを作成できました。個人的に感じた利点と欠点を上げるとすると、こうです。
利点
- nodejsを通してcljsの開発環境を作れる
- nodejsの環境でcljsに対応したライブラリを部分的に利用できる
欠点
- cljsに対応したライブラリでも使えない場合がある(usemacroとかは使えなさそうでした)
- cljsをjsにビルドするのに、まあまあ時間がかかる(今回の例だと数十秒かかりました)
cljs対応のライブラリの利用できる機能が部分的だったものの、個人的にやりたいと思っていたことが達成できて満足です。
共有する情報は以上です。





0 件のコメント :
コメントを投稿