我想使用来自_goog_命名空间中的函数,虽然—正如我后来发现的,我并不需要这样做,因为_goog_已经存在于我的命名空间中。所以,我在ns声明中加入了 (:require [goog]) 。然后,当我尝试通过在cljs repl中执行{{:require}} {{:reload}}来重新加载该特定命名空间时,我得到了
bq.错误:命名空间"x.x.x"已声明。
再次在cljs repl中执行 :require :reload 使repl抛出
错误:命名空间"cljs.user"已声明。
(NO_SOURCE_FILE)
(out/goog/base.js:273:40)
我使用clojurescript *1.7.145* 和 *1.7.170* 测试了以下步骤。
以下是重现问题的步骤,这些步骤来自clojurescript quickstart-browser repl部分
1. 下载独立的clojurescript 1.7.170 jar
https://github.com/clojure/clojurescript/releases/download/r1.7.170/cljs.jar
2. 创建目录hello_world并将JAR文件复制到该目录,然后从hello_world目录内部
mkdir -p src/hello_world;touch repl.clj;touch index.html;touch src/hello_world/core.cljs
3. repl.clj内容
(require 'cljs.repl)
(require 'cljs.build.api)
(require 'cljs.repl.browser)
(cljs.build.api/build "src"
{:main 'hello-world.core
:output-to "out/main.js"
:verbose true})
(cljs.repl/repl (cljs.repl.browser/repl-env)
:watch "src"
:output-dir "out")
4. index.html内容
<html>
<body>
<script type="text/javascript" src="out/main.js"></script>
</body>
</html>
5. src/hello_world/core.cljs内容
(ns hello-world.core
(:require [clojure.browser.repl :as repl]))
(defonce conn
(repl/connect "https://127.0.0.1:9000/repl"))
(enable-console-print!)
(println "Hello world!")
(defn foo [a b]
(+ a b))
6. 运行clojurescript repl
java -cp cljs.jar:src clojure.main repl.clj
7. 在浏览器中打开https://127.0.0.1:9000(我使用的是谷歌浏览器)。打开javascript控制台。
8. 在clojurescript repl中输入以下表达式
(require '[hello-world.core :as hello] :reload)
10. 在浏览器javascript控制台中查看。没有新内容显示。
11. 使用{{:cljs/quit}}从repl退出
12. 将[goog]添加到{{src/hello_world/core.cljs}}中的ns声明,使文件内容变为
(ns hello-world.core
(:require [clojure.browser.repl :as repl]
[goog]))
(defonce conn
(repl/connect "https://127.0.0.1:9000/repl"))
(enable-console-print!)
(println "Hello world!")
(defn foo [a b]
(+ a b))
13. 再次运行clojurescript repl
java -cp cljs.jar:src clojure.main repl.clj
14. 现在,在浏览器中刷新https://127.0.0.1:9000。确保javascript控制台保持打开。
13. 在ClojureScript REPL下方输入以下表达式
(require '[hello-world.core :as hello] :reload)
;;=> nil
它只会返回nil
15. 查看JavaScript控制台,它会显示
未捕获的Error: 命名空间 "hello_world.core" 已经声明。
16. 再次执行此表达式(require '[hello-world.core :as hello] :reload)时,在浏览器JavaScript控制台中没有任何新内容,而ClojureScript REPL会抛出
错误:命名空间"cljs.user"已声明。
(NO_SOURCE_FILE)
(out/goog/base.js:273:40)