ClojureScript

JavaScriptツールの活用

2020年4月24日
ClojureScriptチーム

ClojureScript 1.10.741には、既存のJavaScriptエコシステムと統合するための新しい合理化された方法であるバンドル ターゲットが含まれています。このターゲットを使用すると、ClojureScriptコンパイラの出力をWebpackMetro、またはNode.jsの`require`を理解する他のビルドツールにすぐに渡すことができます。この新しいターゲットを使用するClojureScriptプロジェクトは、手書きのエクスターンや追加の構成なしで`node_modules`からライブラリを自由に統合できますが、アプリケーションの最適化可能な部分に対しては、REPL駆動開発と高度なコンパイルを sepenuhnya 活用できます。

ClojureScriptプロジェクトの開発容易性への影響は明らかに大きいですが、ClojureScriptエコシステムにとってのメリットはさらにエキサイティングなものになると考えています。JavaScriptエコシステムに直接依存するClojureScriptライブラリを追加の手順なしで公開できるようになり、他のJavaScriptおよびClojureScriptビルドツールが何を好むかに関係なく、コミュニティ全体が確実に恩恵を受けることができます。

チュートリアルを進めたい場合は、新しいガイドをご覧ください。歴史と背景については、以下をお読みください。

長年にわたり、JavaScriptエコシステムとの統合を支援するためにさまざまな機能を実装し、提供してきましたが、最終的な結果は、正直なところ、全体から切り取られたものというよりは、ソリューションのパッチワークのように感じられました。これは、JavaScriptの既存のツールを活用するのではなく、回避しようとしたことが原因の一部です。ClojureScriptは、10年前のGoogle Closure Compilerプロジェクトの高度なコンパイル機能に多額の投資を行ってきました。NodeモジュールをClosureを通じて処理するのが自然に思われました。

しかし、Closureを介したNodeモジュール処理を初めて提供してから3年近くが経過した現在、最も人気のあるライブラリのうち、高度な最適化の対象となるライブラリは少なすぎることは明らかです。私たちはまだここには可能性があると信じていますが、ClojureScriptコミュニティは、一般的なJavaScriptツールで容易に使用できる魅力的なJavaScriptライブラリを開発することで、世界の他の地域に道を示す必要があります。それでも、ClojureScriptでビルドする際には、Closureの驚異的なツリーシェーキングとコード分割を受けることができます。Rollup.jsなどのプロジェクトの成功は、大きなメリットにつながるのであれば、JavaScript開発者はより厳格なスタイルに固執することに反対しないことを示しています。その間、私たちはよりシンプルで、そして、はい、より簡単な方法で物事を成し遂げる必要があります。

António Nuno Monteiroのオリジナルの投稿では、Node.jsの下では、実際には`node_modules`から来ていることがわかっているライブラリに対してNode.jsの`require`ステートメントを生成する方法について、かなり短い段落があります。これはNode.jsと対話するときに非常に慣用的な体験をもたらす素晴らしいアイデアでした。その後数年間で、Node.jsにClojureScriptを使用する方がWeb開発よりも簡単なことが明らかになりました。もはや、バンドルターゲットアプローチは、ほぼすべての最新のJavaScript依存関係解決がNode.jsの`require`またはES6インポートのいずれかであるという事実を受け入れています。

それでも、これは問題の一部しか解決していません。ClojureScriptで生成されたJavaScriptに高度な最適化を適用する必要があります。これは、「エクスターン推論」と呼ばれるものに繋がります。Closureのコンパイルモデルのトレードオフの1つは、Closureの使用を意図していないライブラリを統合するには、エクスターンを手動で作成するというエラーが発生しやすいプロセスが必要になることです。エクスターンとは、Closureが実際に表示されないライブラリのプロパティと宣言の名前を変更することを防ぐファイルです。Rich HickeyがClojureScriptのグローバル変数をそのようにマークするという初期の決定と、ClojureがClojureScriptも実装するローカルスコープ全体でシンプルだが効果的な型伝播アルゴリズムを提供するという事実により、「外部」値の使用を追跡することはそれほど難しいことではありません。

Node.jsのアプローチとエクスターン推論を組み合わせることで、バンドルターゲットに直接つながります。もちろん、今ではすべてがかなり明白に思えるでしょうが、さまざまな設計目標を調整すると、簡単な答えが簡単に隠されてしまう可能性があります。一方ではClojureScript、他方ではJavaScriptツールという2つの異なるものを取り上げ、実際にそれらを別々のままにすることで、部分の合計以上のものに到達できます。同時に、これらの選択肢のいずれも、より多くのJavaScriptライブラリが積極的なデッドコードの削除に適したコードスタイルを採用し始めた場合に、すべてをClosure Compilerに渡すことを妨げるものではありません。

この機能は、ClojureScriptコミュニティ、特にre-natalshadow-cljsの素晴らしいプロジェクトからの多くの議論とインスピレーションの結果です。

ハッスル!