Подтвердить что ты не робот

Что такое пространство имен для clojurescript при выходе из clojure?

Я пытаюсь понять модель namespacing в clojurescript. Я понимаю, что javascript не встроен с поддержкой пространства имен, поэтому он был добавлен через библиотеку закрытия google. Однако я не понимаю, как clojurescript справляется с этими различиями. Может кто-нибудь объяснить?

Предположим, например, что я хочу использовать диаграммы google и, по возможности, хотел бы использовать расширенную компиляцию. Что я использую в вызове closure/build, как бы выглядела форма ns и какой лучший способ ссылаться на api из кода? Я просмотрел https://github.com/sritchie/contour, но этот пример не использует расширенную компиляцию, и я не вижу параметров, относящихся к google api в project.clj файл.

4b9b3361

Ответ 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 

все обычное. варианты тоже работают.