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("我已成功懒加载!")
};


{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)
    在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 invoked(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投票
by

评论由:dnolen

我们能获得一个没有这些外部文件引用的最小版本吗?谢谢。

0投票
by

评论由:djebbz

这里是https://github.com/DjebbZ/bug-cljs-2820
最小的代码和错误发生。所有说明在README中。

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,使其不调用js命名空间,而是直接打印到控制台

{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_作出

很抱歉再次提出这个问题,可能是污染了追踪器,也可能浪费了您的宝贵时间。

看来初始问题已通过至今为止的主分支的最新提交得到解决。有一个看起来是合法的"target/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. 生成的合成main.js文件已损坏。以下是来自我的浏览器开发工具的main.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};
定义了一个名为 CLOSURE_NO_DEPS 的常量,其值为 true;通过 document.write() 方法向文档中插入一个脚本标签,指向 "target/js/goog/base.js"。
再次通过 document.write() 方法插入一个脚本标签,指向 "target/js/goog/deps.js"。
插入的脚本标签错误地指向 "/cljs_deps.js",注意这里的错误标志 !
再次通过 document.write() 方法插入一个脚本标签,指向 "target/js/brepl_deps.js",同时插入了一个脚本,使用 goog.require() 引入 "clojure.browser.repl.preload"。
 

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

第二个问题:在终端中无法启动 repl。这可能与第一个问题有关吗?

我应该为这个问题打开另一个问题吗?我没有足够深入地调查,以判断这个问题是否与特定的配置有关,还是 ClojureScript 的一般性问题。
0投票

评论由:djebbz

我还没有分析 git 历史(尚未,时间允许的话)来确定哪个提交似乎解决了原始问题,也没有识别新报告的问题发生的时间。

0投票

评论由:djebbz

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

所以我的帮助提议仍然有效。如果时间允许,我只需将我的重现项目指向一个本地的 CLJS 版本(:local/root),然后尝试理解这个问题。

0投票
_ 评论由:djebbz_作出

我设法绕过了 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(由 alex+import 报告)
...