Ответ 1
Объявление пространства имен одинаково независимо от того, используете ли вы компиляцию простого или расширенного режима. Разница в том, что библиотеки, которые не участвуют в управлении зависимостями google через goog.require('')
и goog.provide('')
, должны быть явно указаны через файл externs.js
. Этот файл, который вы передаете компилятору cljs, предоставляет заглушки всех варов и связанных с ними методов. Типичный 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");
Обратите внимание, что если вы хотите вызвать ваш closurescript из другого файла javascript, вам нужно пометить метод как экспортированный, чтобы оптимизационный компилятор знал, чтобы сохранить имя. (например, на странице может быть тег script, из которого вы хотите вызвать функцию javascript, созданную из clojurescript)
Это выглядит так:
(defn ^:export externallyCalled [])
Другая вещь, о которой нужно помнить, заключается в том, что вы должны обрабатывать макросы по-разному в clojurescript, это связано с тем, что способность обрабатывать их "на лету" в читателе отсутствует в том же виде, что и в clojure.
вы делаете это следующим образом (обратите внимание, что вы обязаны связывать макросы с: как в этом случае)
(ns my.namespace
(:require-macros [my.macros :as my]))
Если вы вызываете код, который не участвовал в управлении зависимостями google, вы обращаетесь к нему через пространство имен js
и javascript interop...
(. js/nonGoogle (method args)) ; a method access
(. js/nonGoogle -p) ; a property access
все обычное. варианты тоже работают.