我想使用_from_goog_命名空间中的函数,尽管后来我发现我并不需要这样做,因为 goog_已经存在于我的命名空间中。 所以,我在ns声明中放入了 (:require [goog]) 。 然后,当我尝试通过在cljs repl中执行 {{:require}} {{:reload}} 来重新加载该特定命名空间时,我得到了
bq. 错误:命名空间 "x.x.x" 已声明。
在cljs repl中再次执行 :require :reload 会使repl抛出
Error: 命名空间 "cljs.user" 已声明。
(NO_SOURCE_FILE)
(out/goog/base.js:273:40)
我使用 clojurescript *1.7.145* 和 *1.7.170* 测试了以下步骤。
以下步骤来自 clojurescript 快速入门浏览器 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(我使用 google chrome)。打开 JavaScript 控制台。
8. 在 clojurescript repl 中输入以下表达式
(require '[hello-world.core :as hello] :reload)
10. 在浏览器 JavaScript 控制台中查看。没有显示新内容。
11. 使用 {{:cljs/quit}} 命令退出 repl
12. 在 {{src/hello_world/core.cljs}} 中的 ns 声明中添加 [goog] ,使文件内容变为
(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控制台,它显示
未捕获错误:命名空间 "hello_world.core" 已声明。
16. 再次执行此表达式(require '[hello-world.core :as hello] :reload),在浏览器JavaScript控制台中没有任何新内容,而ClojureScript repl抛出
Error: 命名空间 "cljs.user" 已声明。
(NO_SOURCE_FILE)
(out/goog/base.js:273:40)