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

欢迎!请查看关于页面以获取更多信息。

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

1 答案

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