2012-03-15 10 views
12

私はclojurescriptの名前空間モデルを理解しようとしています。私はjavascriptがネームスペースのサポートで組み込まれていないことを理解しています。そのため、Googleクロージャライブラリを介して追加されています。しかし、私はこれらの相違点をどのように扱うのか理解していません。誰かが説明できますか?clojureから来たときにclojurescriptの名前空間は何ですか?

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

答えて

12

シンプルモードコンパイルまたはアドバンストモードコンパイルのどちらを使用しているかにかかわらず、ネームスペース宣言は同じです。違いは、goog.require('')goog.provide('')でGoogleの依存関係管理に参加していないライブラリをexterns.jsファイルで明示的に参照する必要があることです。このファイルは、cljsコンパイラに渡し、すべてのvarsと関連するメソッドのスタブを提供します。あなたの名前空間宣言は次のようになりますので、Googleの閉鎖を認識ライブラリを参照する

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

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

そして、それは、次のJavaScript発する:

goog.provide("my.namespace"); 
goog.require("goog.events.keycodes"); 
を典型的な externs.jsは次のようになります

クロージャスクリプトを別のjavascriptファイルから呼び出す場合、最適化コンパイラが知るように、メソッドをエクスポートしたものとしてタグ付けする必要があります名前を保存する。に注意する

(defn ^:export externallyCalled []) 

他の事:このようになっていることを

を(例えば、あなたがclojurescriptから生成されたJavaScript関数を呼び出すしたい場所からページのスクリプトタグを持っているかもしれません)これは、読者の中でそれらを「オンザフライで」処理する能力が、それがクロージャーと同じ方法で存在しないためです。これは、クロージャスクリプトでマクロを別々に扱わなければならないということです。あなたは、Googleの依存関係の管理に参加しなかったコードを呼び出す場合

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

あなたがそれにアクセス:

あなたは次のように(この場合のように、あなたがして、マクロをバインドする義務があることに注意)があることを行いますjs名前空間とjavascriptの相互運用機能を使用しています。

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

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

すべての通常です。バリアントも効きます。

+0

は:オプションとしてサポートされていますか? :requre-macrosの例では、ベクタがあるはずですか?また、GoogleマップやチャートAPIの例を挙げることができますか? – bmillare

+0

@bmillare両方の良いキャッチです。私は答えを修正しました。ありがとう – sw1nn

関連する問題