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

欢迎!请参阅 关于 页面了解该工作方式的相关信息。

+1 表扬
ClojureScript
{code:title=deps.edn}
{:deps {org.clojure/clojurescript {:mvn/version "1.10.339"}}
 :aliases {:bug {:main-opts ["-m" "cljs.main" "-co" "bug.cljs.edn" "--repl"]}}}


{code:title=bug.cljs.edn}
{:main          bug.core
 :output-dir    "target/js"
 :optimizations :none
 :libs          ["bug/jslib.js"]
 :modules       {:cljs-base {:output-to "target/js/bug.js"}
                 :lazy-loaded {:entries #{bug.wrapper}
                                     :output-to "target/js/bug-wrapper.js"}}}


{code:title=src/bug/core.cljs}
(ns bug.core
  (:require [bug.loader :as bug]))

(enable-console-print!)

(bug/load)


{code:title=src/bug/jslib.js}
goog.provide("bug.jslib");

bug.jslib.start = function() {
    console.log("I've been lazy-loaded successfully!")
};


{code:title=src/bug/loader.cljs}
(ns bug.loader
  (:require [cljs.loader :as loader]))

(defn load []
      (loader/load :lazy-loaded
                   (fn []
                       ((resolve 'bug.wrapper/start)))))


{code:title=src/bug/wrapper.cljs}
(ns bug.wrapper
  (:require [bug.jslib :as jslib]
            [cljs.loader :as loader]))

(enable-console-print!)

(defn start []
      (jslib/start))

(loader/set-loaded! :lazy-loaded)


重现


$ clj -A:bug
java.io.FileNotFoundException: /private/tmp/cljs-2820/target/js/cljs/loader.js (没有找到文件或目录)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at clojure.java.io$fn__10972.invokeStatic(io.clj:238)
    at clojure.java.io$fn__10972.invoke(io.clj:235)
    at clojure.java.io$fn__10881$G__10874__10888.invoke(io.clj:69)
    at clojure.java.io$fn__10942.invokeStatic(io.clj:165)
    at clojure.java.io$fn__10942.invoke(io.clj:165)
    at clojure.java.io$fn__10894$G__10870__10901.invoke(io.clj:69)
    at clojure.java.io$reader.invokeStatic(io.clj:102)
    at clojure.java.io$reader.doInvoke(io.clj:86)
    at clojure.lang.RestFn.invoke(RestFn.java:410)
    at cljs.repl$load_sources.invokeStatic(repl.cljc:217)
    at cljs.repl$load_sources.invoke(repl.cljc:209)
    at cljs.repl$load_namespace.invokeStatic(repl.cljc:251)
    at cljs.repl$load_namespace.invoke(repl.cljc:233)
    at cljs.repl$load_dependencies$fn__6358.invoke(repl.cljc:259)
    at clojure.core$map$fn__5587.invoke(core.clj:2747)
    at clojure.lang.LazySeq.sval(LazySeq.java:40)
    在 clojure.lang.LazySeq.seq(LazySeq.java:49) 处
    在 clojure.lang.RT.seq(RT.java:528) 处
    在 clojure.core$seq__5124.invokeStatic(core.clj:137) 处
    在 clojure.core$apply.invokeStatic(core.clj:652) 处
    在 clojure.core$mapcat.invokeStatic(core.clj:2775) 处
    在 clojure.core$mapcat.doInvoke(core.clj:2775) 处
    在 clojure.lang.RestFn.invoke(RestFn.java:423) 处
    在 cljs.repl$load_dependencies.invokeStatic(repl.cljc:259) 处
    在 cljs.repl$load_dependencies.invoke(repl.cljc:254) 处
    在 cljs.repl$evaluate_form.invokeStatic(repl.cljc:561) 处
    在 cljs.repl$evaluate_form.invoke(repl.cljc:498) 处
    在 cljs.repl$repl_STAR_$fn__6610.invoke(repl.cljc:950) 处
    在 cljs.repl$repl_STAR_$fn__6621$fn__6622.invoke(repl.cljc:987) 处
    在 cljs.repl$repl_STAR_$fn__6621.invoke(repl.cljc:982) 处
    在 cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1289) 处
    在 cljs.compiler$with_core_cljs.invoke(compiler.cljc:1278) 处
    在 cljs.repl$repl_STAR_.invokeStatic(repl.cljc:979) 处
    在 cljs.repl$repl_STAR_.invoke(repl.cljc:855) 处
    在 cljs.cli$repl_opt.invokeStatic(cli.clj:305) 处
    在 cljs.cli$repl_opt.invoke(cli.clj:292) 处
    在 cljs.cli$main.invokeStatic(cli.clj:636) 处
    在 cljs.cli$main.doInvoke(cli.clj:625) 处
    在 clojure.lang.RestFn.applyTo(RestFn.java:139) 处
    在 clojure.core$apply.invokeStatic(core.clj:659) 处
    在 clojure.core$apply.invoke(core.clj:652) 处
    在 cljs.main$_main.invokeStatic(main.clj:61) 处
    在 cljs.main$_main.doInvoke(main.clj:52) 处
    在 clojure.lang.RestFn.applyTo(RestFn.java:137) 处
    在 clojure.lang.Var.applyTo(Var.java:702) 处
    在 clojure.core$apply.invokeStatic(core.clj:657) 处
    在 clojure.main$main_opt.invokeStatic(main.clj:317) 处
    在 clojure.main$main_opt.invoke(main.clj:313) 处
    在 clojure.main$main.invokeStatic(main.clj:424) 处
    在 clojure.main$main.doInvoke(main.clj:387) 处
    在 clojure.lang.RestFn.applyTo(RestFn.java:137) 处
    在 clojure.lang.Var.applyTo(Var.java:702) 处
    在 clojure.main.main(main.java:37) 处
ClojureScript 1.10.339
cljs.user=>


确实,当我进入 {{target/js/cljs}} 时,我看到的是 loader.cljs 而不是 loader.js。它似乎是因为我无法理解的原因而没有编译成 js。

在 REPL 中,当我尝试 (require '[trackers.core :as t]) 时,我会得到完全相同的错误。

11 个答案

0

评论者:dnolen

我们能否得到一个完全不依赖于外部文件的最小示例?谢谢。

0

评论者:djebbz

链接在此 https://github.com/DjebbZ/bug-cljs-2820
最小示例和错误都会出现。所有说明都在 README.md 中。

0

评论者:mfikes

更新描述并附上最小化复现案例的副本(因此无需GitHub引用)。

0

评论者:djebbz

谢谢Mike,很抱歉一开始没有包含所有必要的内容。

0
_评论者:djebbz_

看起来这与 {{:libs}} 选项根本没有关系,因为我也试了另一种没有JavaScript文件的变体。上述复现案例所需变更仅包括

1. 从 bug.cljs.edn 中移除 {{:libs}} 选项

{code:title=bug.cljs.edn}
{:main          bug.core
 :output-dir    "target/js"
 :optimizations :none
 :modules       {:cljs-base {:output-to "target/js/bug.js"}
                 :lazy-loaded {:entries #{bug.wrapper}
                                     :output-to "target/js/bug-wrapper.js"}}}


2. 修改 bug.wrapper.cljs,使其不调用JavaScript命名空间,而是直接打印到控制台

{code:title=bug.wrapper.cljs}
(ns bug.wrapper
  (:require [cljs.loader :as loader]))

(enable-console-print!)

(defn start []
      (println "I, cljs, have been lazy-loaded successfully"))

(loader/set-loaded! :lazy-loaded)


我在重新运行 {{clj -A:bug}} 之前运行了 {{rm -rf target/ .cpcache/}}。因此,除非我误解了什么,我认为代码拆分已经损坏了?
0

评论者:djebbz

对不起,我没有指定更改后的输出:它与以前完全相同(没有 loader.js 文件)

0
_评论者:djebbz_

很抱歉重新提出这个问题,也许会污染问题跟踪器,也许会浪费您的时间。

似乎最新的master提交解决了初始问题。有一个看起来很合理的目标(js/cljs/loader.js)文件。要复现,请使用以下deps.edn文件(只有cljs坐标发生了变化)

{code:title=deps.edn}
{:deps {org.clojure/clojurescript {:git/url "https://github.com/clojure/clojurescript :sha "6eedd0a08c49f7b0d4dcb30977b2fb38c90577bd"}}
 :aliases {:bug {:main-opts ["-m" "cljs.main" "-co" "bug.cljs.edn" "--repl"]}}}
 

但现在有两个其他问题。

1. 生成的合成主.js文件已损坏。以下是主.js文件的浏览器开发者工具的内容

{code:title=main.js}
var CLOSURE_UNCOMPILED_DEFINES = {"clojure.browser.repl.PORT":9000,"clojure.browser.repl.HOST":"localhost","goog.json.USE_NATIVE_JSON":true};
var CLOSURE_NO_DEPS = true; document.write('<script src="target/js/goog/base.js"></script>');
document.write('<script src="target/js/goog/deps.js"></script>');
/cljs_deps.js"></script>'); // <--- 错误!
document.write('<script src="target/js/brepl_deps.js"></script>'); document.write('<script>goog.require("clojure.browser.repl.preload");</script>');
 

所以浏览器会抛出“Uncaught SyntaxError: Invalid regular expression flags”错误(当然)。

2. 在终端中无法启动repl。这或许与第一个问题有关?

我应该为此问题开启另一个问题单吗?我对这个特定配置或Cljs通用问题了解得还不够深入。
0

评论者:djebbz

我还没有对git历史进行分解(还没有时间做),以识别哪个提交修复了原始问题,也没有识别新报告问题发生的时间。

0

评论者:djebbz

很抱歉,你可以忽略我之前的两个评论。使用最新版ClojureScript master (:sha "6eedd0a08c49f7b0d4dcb30977b2fb38c90577bd") 时,loader.js文件未找到的原始问题仍然存在。我不知道我是如何绕过这个问题的。我意识到我之前在尝试时没有删除 target/ 和 .cpcache/ 目录。

所以,我的帮助提议仍然有效。如果时间允许,我会将我的重现项目指向CLJS的本地版本,并尝试理解这个问题。

0
_评论者:djebbz_

我设法绕过了missing loader.js文件的问题,并重现了broken main.js的问题。这发生在添加了"--compile"选项时。以下是重现问题的完整 deps.edn 文件,其余部分都没有任何变化。

{code:title=deps.edn}
{:deps {org.clojure/clojurescript {:local/root "/home/djebbz/code/etc/clojurescript"}}
 :aliases {:bug {:main-opts ["-m" "cljs.main" "-co" "bug.cljs.edn" "--compile" "--repl"]}}}


是否需要添加"--compile"标志,因为我已经用"-co"标志添加了一些编译选项?bug.cljs.edn文件已经提到了:main命名空间。
0
参考:[https://clojure.atlassian.net/browse/CLJS-2820](https://clojure.atlassian.net/browse/CLJS-2820)(由 alex+import 报告)
...