12

clojurescript の名前空間モデルを理解しようとしています。JavaScript には名前空間のサポートが組み込まれていないことを理解しているため、Google クロージャー ライブラリを介して追加されています。ただし、clojurescript がこれらの違いをどのように処理するかはわかりません。誰か説明してくれませんか?

たとえば、Google チャート API を使用したいのですが、可能な限り高度なコンパイルを使用したいとします。closure/build呼び出しで何を使用するか、nsフォームはどのように見えるか、コードから API を参照する最良の方法は何ですか? https://github.com/sritchie/contourを見てきましたが、その例では高度なコンパイルが使用されておらず、project.clj ファイルで Google API を参照するオプションが表示されません。

4

1 に答える 1

12

名前空間の宣言は、単純モードのコンパイルを使用しているか、拡張モードのコンパイルを使用しているかに関係なく同じです。違いは、Google の依存関係管理に参加せず、ファイルを介しgoog.require('')goog.provide('')明示的に参照する必要があるライブラリです。externs.jscljs コンパイラに渡すこのファイルは、すべての変数と関連するメソッドのスタブを提供します。典型的なexterns.jsものは次のようになります。

// contents of externs.js
var externalLibrary = {}
var externalLibrary.method = function() {}

したがって、Google クロージャ対応ライブラリを参照するには、名前空間宣言は次のようになります。

(ns my.namespace
  (:require  [goog.events.KeyCodes :as key-codes])

そして、それは次のjavascriptを発行します:

goog.provide("my.namespace");
goog.require("goog.events.keycodes");

クロージャ スクリプトを別の JavaScript ファイルから呼び出したい場合は、最適化コンパイラが名前を保持することを認識できるように、メソッドにエクスポート済みのタグを付ける必要があることに注意してください。(例えば、clojurescript から生成された JavaScript 関数を呼び出したいページに script タグがあるかもしれません)

それは次のようになります。

(defn ^:export externallyCalled [])

注意すべきもう 1 つのことは、clojurescript ではマクロを異なる方法で処理する必要があるということです。これは、リーダーでマクロを「その場で」処理する機能が、clojure と同じように存在しないためです。

次のようにします(この場合、マクロを :as でバインドする必要があることに注意してください)

(ns my.namespace
   (:require-macros [my.macros :as my]))

Google の依存関係管理に参加していないコードを呼び出している場合は、js名前空間と JavaScript 相互運用機能を介してアクセスします...

(. js/nonGoogle (method args)) ; a method access

(. js/nonGoogle -p)  ; a property access 

すべての通常。バリアントも機能します..

于 2012-03-15T17:12:34.473 に答える