ClojureScript

オプションの自己ホスティング

このページはcljs.js/eval-strやその他の自己ホスト機能を活用したい、または必要とするClojureScriptプロジェクトを作成したいユーザー向けのアドバイスを記載しています。

デプロイされたアーティファクトの最終サイズが重要なWebアプリケーションを構築している場合は、このページに記載されている機能を使用しないでください。

本番ビルド

cljs.jsの名前空間を含むビルドで:optimization :simpleまで活用できます。その他の推奨設定

:pretty-print false
:optimize-constants true
:static-fns true

:optimize-constantsはコードサイズに重要であり、ソースのすべてのリテラルキーワードと記号は単一のルックアップテーブルにコンパイルされます。

:static-fns trueは、特にSafari/JavaScriptCoreをターゲットにしている場合に重要です。(詳細はCLJS-1381を参照してください)。

使いやすさを優先して、デフォルトではcljs.js/empty-statecljs.coreの解析キャッシュをcljs.jsの名前空間に直接ダンプします。これにより、最終的なアーティファクトのサイズが2倍になります。コンパイラビルドオプションで:dump-core falseを設定することで、これを無効にできます。

つまり、自分でコアの解析をロードする必要があります。コア解析キャッシュをダンプするのは簡単です。ClojureScriptプロジェクトでClojure REPLをロードし、次のような操作を行います。

(require '[clojure.java.io :as io]
         '[cognitect.transit :as transit])
(import [java.io ByteArrayOutputStream])

(def out-path
  "../../assets/js/cljs/core.cljs.cache.aot.json")
(def out (ByteArrayOutputStream. 1000000))
(def writer (transit/writer out :json))

(def cache
  (read-string
    (slurp (io/resource "cljs/core.cljs.cache.aot.edn"))))

(transit/write writer cache)

(spit (io/file out-path) (.toString out))

その後、ClojureScriptソースでこのキャッシュをロードできます。たとえば、次のようなものになる可能性があります。

(def st (cljs.js/empty-state))

;; path to Transit encoded analysis cache
(def cache-url "/assets/js/cljs/core.cljs.cache.aot.json")

(defn main []
  (http/get cache-url
    (fn [json]
      (let [rdr   (transit/reader :json)
            cache (transit/read rdr json)]
        (cljs.js/load-analysis-cache! st 'cljs.core cache)
        ;; ...
        ))))

このシンプルな最適化により、約2.7MBの生成されたJavaScriptが削除されます。

執筆者: David Nolen