2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。

0
ClojureScript
我想使用来自_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)

1 个答案

0
参考:https://clojure.atlassian.net/browse/CLJS-1485(由mavbozo报告)
...