无论您使用的是简单模式还是高级模式编译,命名空间声明都是相同的。不同之处在于,不参与谷歌依赖管理的库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");
请注意,如果您想从另一个 javascript 文件中调用您的闭包脚本,那么您需要将该方法标记为已导出,以便优化编译器知道保留该名称。(例如,您可能在要调用从 clojurescript 生成的 javascript 函数的页面上有一个脚本标记)
看起来像这样:
(defn ^:export externallyCalled [])
要注意的另一件事是,您必须在 clojurescript 中以不同的方式处理宏,这是因为在阅读器中“即时”处理它们的能力与在 clojure 中不同。
您可以按如下方式执行此操作(请注意,您必须使用 :as 在这种情况下绑定宏)
(ns my.namespace
(:require-macros [my.macros :as my]))
如果你调用的代码没有参与谷歌的依赖管理,你可以通过js
命名空间和 javascript 互操作访问它...
(. js/nonGoogle (method args)) ; a method access
(. js/nonGoogle -p) ; a property access
一切如常。变体也有效..