2017年7月20日
Juho Teperi
これはプレビューシリーズの4番目の投稿です。
ClosureコンパイラはAMD、CommonJS、ES6モジュールを処理できるため、Nodeエコシステムを幅広くサポートしています。それでも、Closureが直接サポートしていない一般的なケースがあります。例えば、ReactのJSXなどです。[1] Maria GellerによるGoogle Summer of Codeの取り組みも、David Nolenによって概説された設計に基づいてこれを解決し、バージョン1.7.48以降、プリプロセッシングフックが存在しています。しかし、元の設計では他のビルドツールとの統合が困難であるため、そのアプローチを見直して、統合を簡素化しました。
JSXやその他の構文拡張を使用するJavaScriptライブラリは、通常、既に処理されたコードでパッケージ化されているため、特別な手順なしで使用できます。それでも、そのようなコードをプロジェクトに直接含めたいという実際的なケースがあります。例えば、JavaScriptプロジェクトをClojureScriptに変換する場合、すべてを一度に書き直すよりも、既存のコードを再利用する方がはるかに簡単です。また、洗練されたユーザーインターフェースの構築はチームの努力であり、JSXのようなツールは、デザイナーに使い慣れたツールを提供することで、そのプロセスをはるかに容易にすることができます。ClojureScriptでJSXやその他の一般的な構文機能を利用できるようにすることで、ClojureScriptの開発プロセスをより包括的なものにすることができます。
元の設計では、foreign-libマップに:preprocessを提供することでプリプロセッシングが有効になります。その値は、cljs.closure/js-transformsマルチメソッドのキーワードディスパッチです。ユーザーは新しいマルチメソッドケースを実装し、例えば、Javaの組み込みNashorn JavaScriptエンジンを使用してBabelのようなJavaScriptコンパイラを実行できます。
しかし、このアプローチは、一般的なClojureとClojureScriptのビルドツールに複雑さを生じさせます。プリプロセスマルチメソッドを提供するClojure名前空間は、ClojureScriptコンパイラを実行する前にユーザーによってロードする必要があります。これは明示的なビルドスクリプトでは実行可能かもしれませんが、LeiningenとBootの両方がビルドを独自のクラスパスに隔離する方法により、この要件は実際には不可能です。
元の設計を回避するにはいくつかの方法があります。
コンパイラを実行する前にrequireする名前空間を列挙する新しい構成オプションを提供します。
マルチメソッドディスパッチキーワードと、実装を提供する名前空間との間に関係を作成します。例えば、キーワードに名前空間が含まれている場合、キーワードの名前空間部分を活用して、オンデマンドでその名前空間をrequireできます。
これらの解決策は両方とも、ビルドツールまたはClojureScriptコンパイラで直接実装できます。最初のオプションはエンドユーザーの観点からは遠回りのように見えます。2番目のオプションは根本的な問題を浮き彫りにしていますが、このパターンにキーワードを使用するのは慣例に合致しません。キーワードからシンボルに切り替えるだけで、既存の慣例に合わせることができます。
次のバージョンのClojureScriptでは、:preprocessオプションの値としてシンボルがサポートされます。完全修飾シンボルを使用すると、値が関数を参照していることが明らかになり、シンボルの名前空間部分を使用して、ユーザーに代わって名前空間を自動的にロードできます。
cljsjs/babel-standaloneは更新されており、この新しいパターンに従ってBabelをClojureScriptツールで使用するための簡単な方法を提供しています。
Clojureの哲学に精通しているユーザーは、私たちが他のほとんどの特性よりもシンプルさを優先していることを知っています。しかし、シンプルさは常に容易さとは矛盾するものではなく、実際、ホストとの相互運用性に関しては、長年にわたって言語の優先事項となっています。
Clojureは長年にわたりJavaとの優れた統合を誇ってきましたが、ClojureScriptでは、Google Closureと主流のJavaScriptプラクティスとの間の摩擦により、この約束を果たすことがより困難になっています。
私たちは、そのギャップを埋めつつあり、膨大なJavaScriptライブラリエコシステムがついに身近なものになるだろうと考えています。