ClojureScript

JavaScript モジュールサポート (アルファ版)

このページでは、JavaScript モジュールを ClojureScript プロジェクトに含める方法について説明します。このガイドで説明されている機能はまだアルファ版であることに注意してください。

動機

コードの最適化と依存関係の管理に加えて、Google Closure コンパイラは一般的な JavaScript モジュールを Google Closure モジュールに変換することもできます。 JavaScript モジュールの代わりに Google Closure モジュールを使用すると、次の利点があります。

  • Google Closure モジュールはソースコードの最適化に含まれます

  • externs を指定する必要がありません

JavaScript モジュールのインクルード

次に、次の単純な CommonJS モジュールを ClojureScript プロジェクトに含める方法を見ていきます。

// calculator.js
var calculator = {
    add: function (a, b) {
        return a + b;
    },
    subtract: function (a, b) {
        return a - b;
    }
};

module.exports = calculator;

プロジェクト設定への JavaScript モジュールの追加

JavaScript モジュールをプロジェクトに含める場合は、外部ライブラリとして追加し、:module-type コンパイラオプションを使用してモジュールタイプを指定する必要があります。現在サポートされているモジュールタイプは、**CommonJS**、**AMD**、**ECMAScript 6** です。それぞれ、:module-type コンパイラオプションに指定できる値は、:commonjs:amd:es6 です。たとえば、上記の CommonJS モジュールのコンパイラオプションは次のとおりです。

:foreign-libs [{:file "resources/libs/calculator.js"
                :provides ["calculator"]
                :module-type :commonjs}]

コードでの JavaScript モジュールの使用

:provides コンパイラオプションでモジュールに指定した名前を使用して、JavaScript モジュールを ClojureScript 名前空間に含めることができます。上記の CommonJS モジュールでは、名前 calculator を指定しました。 Google Closure Library のモジュールを使用するのと同じ方法で、ClojureScript コードでモジュールを使用できるようになりました。

(ns my-project.core
  (:require [calculator :as calc]))

(enable-console-print!)

(println (calc/add 4 5))

制限事項

Google Closure コンパイラによる制限

Google Closure コンパイラは、最適化レベル :simple または :advanced を使用する場合、JavaScript 入力がいくつかの制限に準拠していることを期待します。つまり、これらの最適化レベルのいずれかを使用する場合は、JavaScript モジュールが Google Closure コンパイラによって課せられた制限に準拠する必要があります。制限の詳細については、https://developers.google.com/closure/compiler/docs/limitations を参照してください。

モジュール依存関係の指定

JavaScript モジュールが他のモジュールに依存している場合は、それらのモジュールもプロジェクト設定に追加する必要があります。これは、多くの異なるモジュールを持つ大規模なプロジェクトでは実行不可能な場合があります。この場合、最初にプロジェクトをバンドルしてから、単一のモジュールとして含めることを試みることができます。

Node.js モジュール

Node.js モジュール仕様 は、require() に渡されるモジュール識別子が常に絶対パスまたは相対パスである必要がないという点で、CommonJS 仕様 とわずかに異なります。コンパイラは標準の CommonJS 仕様に従って実装されているため、これにより、Google Closure コンパイラがノードモジュールの依存関係を解決することが困難になります。したがって、ノードモジュールを Google Closure モジュールに変換できない場合があります。