2012-03-15 25 views
12

Tôi đang cố gắng hiểu mô hình không gian tên trong clojurescript. Tôi hiểu rằng javascript không được xây dựng với sự hỗ trợ không gian tên, do đó, nó được thêm vào thông qua thư viện đóng cửa google. Tuy nhiên, tôi không hiểu cách clojurescript đề cập đến những khác biệt này. Ai đó có thể xin giải thích?Các không gian tên gotchas cho clojurescript khi đến từ clojure là gì?

Cho phép nói ví dụ: tôi muốn sử dụng api biểu đồ google và bất cứ khi nào có thể muốn sử dụng trình biên dịch nâng cao. Tôi phải làm gì trong cuộc gọi closure/build, biểu mẫu ns trông như thế nào và cách tốt nhất để tham khảo api từ mã là gì? Tôi đã xem https://github.com/sritchie/contour nhưng ví dụ đó không sử dụng trình biên dịch nâng cao và tôi không thấy các tùy chọn đề cập đến api của google trong tệp project.clj.

Trả lời

12

Khai báo không gian tên giống nhau bất kể bạn đang sử dụng trình biên dịch chế độ đơn giản hay nâng cao. Sự khác biệt là các thư viện không tham gia quản lý phụ thuộc của google qua số goog.require('')goog.provide('') cần được tham chiếu một cách dễ dàng thông qua tệp externs.js. Tệp này, mà bạn chuyển tới trình biên dịch cljs, cung cấp các nhánh của tất cả các vars và các phương thức liên quan. Một điển hình externs.js sẽ giống như thế:

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

Vì vậy, để tham khảo một google đóng cửa thư viện biết khai gian tên của bạn trông như thế này:

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

Và đó phát ra javascript sau:

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

Lưu ý rằng nếu bạn muốn gọi closurescript của mình từ một tệp javascript khác thì bạn cần phải gắn thẻ phương thức như đã xuất để trình biên dịch tối ưu hóa biết s để bảo tồn tên. (Ví dụ như bạn có thể có một thẻ script trên một trang từ nơi bạn muốn gọi một hàm javascript đã được tạo ra từ clojurescript)

Đó trông như thế này:

(defn ^:export externallyCalled []) 

Điều khác phải nhận thức được là bạn phải đối xử với các macro khác nhau trong clojurescript, điều này là do khả năng xử lý chúng 'khi đang di chuyển' trong trình đọc không có mặt theo cách giống như trong clojure.

bạn làm điều đó như sau (lưu ý rằng bạn có nghĩa vụ ràng buộc các macro với: như trong trường hợp này)

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

Nếu bạn đang gọi mã mà không tham gia quản lý phụ thuộc google của bạn truy cập vào nó thông qua không gian tên js và javascript interop ...

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

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

tất cả các thông thường. các biến thể cũng hoạt động ..

+0

là: tùy chọn được hỗ trợ cho: sử dụng? cũng có nghĩa vụ phải là một vectơ trong ví dụ: requre-macros? Ngoài ra, bạn có thể đưa ra một ví dụ với các bản đồ google hoặc biểu đồ api? – bmillare

+0

@bmillare cả hai sản phẩm khai thác tốt. Tôi đã sửa câu trả lời. Cảm ơn (nhiều trì hoãn) – sw1nn

Các vấn đề liên quan