为什么 javascript-modules 指南示例不起作用?
Why does the javascript-modules guide example not work?
我遵循了 https://clojurescript.org/guides/javascript-modules 的第一部分,我执行 lein trampoline run -m clojure.main watch.clj
的部分显示了这个
Building ...
WARNING: JavaScript file found on classpath for library `js.hello`, but does not contain a corresponding `goog.provide` declaration: file:/Users/kcase/projects/hello-es6/src/js/hello.js
Copying jar:file:/Users/kcase/.m2/repository/org/clojure/clojurescript/1.9.854/clojurescript-1.9.854.jar!/cljs/core.cljs to out/cljs/core.cljs
Reading analysis cache for jar:file:/Users/kcase/.m2/repository/org/clojure/clojurescript/1.9.854/clojurescript-1.9.854.jar!/cljs/core.cljs
Compiling out/cljs/core.cljs
Using cached cljs.core out/cljs/core.cljs
Copying jar:file:/Users/kcase/.m2/repository/org/clojure/clojurescript/1.9.854/clojurescript-1.9.854.jar!/cljs/nodejs.cljs to out/cljs/nodejs.cljs
Compiling out/cljs/nodejs.cljs
Compiling src/hello_es6/core.cljs
WARNING: JavaScript file found on classpath for library `js.hello`, but does not contain a corresponding `goog.provide` declaration: file:/Users/kcase/projects/hello-es6/src/js/hello.js
clojure.lang.ExceptionInfo: failed compiling file:src/hello_es6/core.cljs {:file #object[java.io.File 0x14ecd835 "src/hello_es6/core.cljs"]}
at clojure.core$ex_info.invokeStatic(core.clj:4725)
at clojure.core$ex_info.invoke(core.clj:4725)
at cljs.compiler$compile_file$fn__4440.invoke(compiler.cljc:1521)
at cljs.compiler$compile_file.invokeStatic(compiler.cljc:1482)
at cljs.compiler$compile_file.invoke(compiler.cljc:1458)
at cljs.closure$compile_file.invokeStatic(closure.clj:533)
at cljs.closure$compile_file.invoke(closure.clj:524)
at cljs.closure$eval6681$fn__6682.invoke(closure.clj:602)
at cljs.closure$eval6617$fn__6618$G__6606__6625.invoke(closure.clj:486)
at cljs.closure$compile_sources$iter__6805__6809$fn__6810.invoke(closure.clj:947)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.next(RT.java:703)
at clojure.core$next__6406.invokeStatic(core.clj:64)
at clojure.core$dorun.invokeStatic(core.clj:3115)
at clojure.core$doall.invokeStatic(core.clj:3121)
at clojure.core$doall.invoke(core.clj:3121)
at cljs.closure$compile_sources.invokeStatic(closure.clj:943)
at cljs.closure$compile_sources.invoke(closure.clj:932)
at cljs.closure$build.invokeStatic(closure.clj:2528)
at cljs.closure$build.invoke(closure.clj:2444)
at cljs.closure$watch$buildf__7486.invoke(closure.clj:2647)
at cljs.closure$watch.invokeStatic(closure.clj:2679)
at cljs.closure$watch.invoke(closure.clj:2623)
at cljs.build.api$watch.invokeStatic(api.clj:219)
at cljs.build.api$watch.invoke(api.clj:207)
at cljs.build.api$watch.invokeStatic(api.clj:216)
at cljs.build.api$watch.invoke(api.clj:207)
at cljs.build.api$watch.invokeStatic(api.clj:210)
at cljs.build.api$watch.invoke(api.clj:207)
at user$eval7609.invokeStatic(watch.clj:3)
at user$eval7609.invoke(watch.clj:3)
at clojure.lang.Compiler.eval(Compiler.java:6978)
at clojure.lang.Compiler.load(Compiler.java:7430)
at clojure.lang.Compiler.loadFile(Compiler.java:7368)
at clojure.main$load_script.invokeStatic(main.clj:277)
at clojure.main$script_opt.invokeStatic(main.clj:337)
at clojure.main$script_opt.invoke(main.clj:332)
at clojure.main$main.invokeStatic(main.clj:423)
at clojure.main$main.doInvoke(main.clj:386)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)
at user$eval15.invokeStatic(form-init5230861038763741865.clj:1)
at user$eval15.invoke(form-init5230861038763741865.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6978)
at clojure.lang.Compiler.eval(Compiler.java:6968)
at clojure.lang.Compiler.load(Compiler.java:7430)
at clojure.lang.Compiler.loadFile(Compiler.java:7368)
at clojure.main$load_script.invokeStatic(main.clj:277)
at clojure.main$init_opt.invokeStatic(main.clj:279)
at clojure.main$init_opt.invoke(main.clj:279)
at clojure.main$initialize.invokeStatic(main.clj:310)
at clojure.main$null_opt.invokeStatic(main.clj:344)
at clojure.main$null_opt.invoke(main.clj:341)
at clojure.main$main.invokeStatic(main.clj:423)
at clojure.main$main.doInvoke(main.clj:386)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
Caused by: clojure.lang.ExceptionInfo: No such namespace: js.hello, could not locate js/hello.cljs, js/hello.cljc, or JavaScript source providing "js.hello" in file src/hello_es6/core.cljs {:tag :cljs/analysis-error}
at clojure.core$ex_info.invokeStatic(core.clj:4725)
at clojure.core$ex_info.invoke(core.clj:4725)
at cljs.analyzer$error.invokeStatic(analyzer.cljc:694)
at cljs.analyzer$error.invoke(analyzer.cljc:690)
at cljs.analyzer$error.invokeStatic(analyzer.cljc:692)
at cljs.analyzer$error.invoke(analyzer.cljc:690)
at cljs.analyzer$analyze_deps.invokeStatic(analyzer.cljc:2111)
at cljs.analyzer$analyze_deps.invoke(analyzer.cljc:2085)
at cljs.analyzer$ns_side_effects.invokeStatic(analyzer.cljc:3430)
at cljs.analyzer$ns_side_effects.invoke(analyzer.cljc:3425)
at cljs.analyzer$analyze_STAR_$fn__3152.invoke(analyzer.cljc:3547)
at clojure.lang.PersistentVector.reduce(PersistentVector.java:341)
at clojure.core$reduce.invokeStatic(core.clj:6703)
at clojure.core$reduce.invoke(core.clj:6686)
at cljs.analyzer$analyze_STAR_.invokeStatic(analyzer.cljc:3547)
at cljs.analyzer$analyze_STAR_.invoke(analyzer.cljc:3537)
at cljs.analyzer$analyze.invokeStatic(analyzer.cljc:3571)
at cljs.analyzer$analyze.invoke(analyzer.cljc:3554)
at cljs.compiler$emit_source.invokeStatic(compiler.cljc:1340)
at cljs.compiler$emit_source.invoke(compiler.cljc:1319)
at cljs.compiler$compile_file_STAR_$fn__4409.invoke(compiler.cljc:1425)
at cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1226)
at cljs.compiler$with_core_cljs.invoke(compiler.cljc:1215)
at cljs.compiler$compile_file_STAR_.invokeStatic(compiler.cljc:1410)
at cljs.compiler$compile_file_STAR_.invoke(compiler.cljc:1403)
at cljs.compiler$compile_file$fn__4440.invoke(compiler.cljc:1507)
... 70 more
听起来像是在抱怨 js.hello
命名空间还没有被 goog.provide()
创建。我希望 ClojureScript 编译器能够做到这一点,因为指南说
JavaScript files do not declare namespaces, so the ClojureScript
compiler will compute one based on the location of the entry.
我是不是漏掉了什么?
我认为这都是关于 CLJS 版本的。
试试这个:
project.clj
(defproject hello-es6 "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.9.0-alpha14"]
[org.clojure/clojurescript "1.9.908"]]
:jvm-opts ^:replace ["-Xmx1g" "-server"])
watch.clj
(require '[cljs.build.api :as b])
(b/watch "src"
{:output-to "main.js"
:output-dir "out"
:main 'hello-es6.core
:optimizations :advanced
:target :nodejs
:foreign-libs [{:file "src"
:module-type :es6}] ;; or :commonjs / :amd
:verbose true})
优化应该是 :advanced
我认为这可以帮助您 运行 指南中的示例。
我遵循了 https://clojurescript.org/guides/javascript-modules 的第一部分,我执行 lein trampoline run -m clojure.main watch.clj
的部分显示了这个
Building ...
WARNING: JavaScript file found on classpath for library `js.hello`, but does not contain a corresponding `goog.provide` declaration: file:/Users/kcase/projects/hello-es6/src/js/hello.js
Copying jar:file:/Users/kcase/.m2/repository/org/clojure/clojurescript/1.9.854/clojurescript-1.9.854.jar!/cljs/core.cljs to out/cljs/core.cljs
Reading analysis cache for jar:file:/Users/kcase/.m2/repository/org/clojure/clojurescript/1.9.854/clojurescript-1.9.854.jar!/cljs/core.cljs
Compiling out/cljs/core.cljs
Using cached cljs.core out/cljs/core.cljs
Copying jar:file:/Users/kcase/.m2/repository/org/clojure/clojurescript/1.9.854/clojurescript-1.9.854.jar!/cljs/nodejs.cljs to out/cljs/nodejs.cljs
Compiling out/cljs/nodejs.cljs
Compiling src/hello_es6/core.cljs
WARNING: JavaScript file found on classpath for library `js.hello`, but does not contain a corresponding `goog.provide` declaration: file:/Users/kcase/projects/hello-es6/src/js/hello.js
clojure.lang.ExceptionInfo: failed compiling file:src/hello_es6/core.cljs {:file #object[java.io.File 0x14ecd835 "src/hello_es6/core.cljs"]}
at clojure.core$ex_info.invokeStatic(core.clj:4725)
at clojure.core$ex_info.invoke(core.clj:4725)
at cljs.compiler$compile_file$fn__4440.invoke(compiler.cljc:1521)
at cljs.compiler$compile_file.invokeStatic(compiler.cljc:1482)
at cljs.compiler$compile_file.invoke(compiler.cljc:1458)
at cljs.closure$compile_file.invokeStatic(closure.clj:533)
at cljs.closure$compile_file.invoke(closure.clj:524)
at cljs.closure$eval6681$fn__6682.invoke(closure.clj:602)
at cljs.closure$eval6617$fn__6618$G__6606__6625.invoke(closure.clj:486)
at cljs.closure$compile_sources$iter__6805__6809$fn__6810.invoke(closure.clj:947)
at clojure.lang.LazySeq.sval(LazySeq.java:40)
at clojure.lang.LazySeq.seq(LazySeq.java:49)
at clojure.lang.Cons.next(Cons.java:39)
at clojure.lang.RT.next(RT.java:703)
at clojure.core$next__6406.invokeStatic(core.clj:64)
at clojure.core$dorun.invokeStatic(core.clj:3115)
at clojure.core$doall.invokeStatic(core.clj:3121)
at clojure.core$doall.invoke(core.clj:3121)
at cljs.closure$compile_sources.invokeStatic(closure.clj:943)
at cljs.closure$compile_sources.invoke(closure.clj:932)
at cljs.closure$build.invokeStatic(closure.clj:2528)
at cljs.closure$build.invoke(closure.clj:2444)
at cljs.closure$watch$buildf__7486.invoke(closure.clj:2647)
at cljs.closure$watch.invokeStatic(closure.clj:2679)
at cljs.closure$watch.invoke(closure.clj:2623)
at cljs.build.api$watch.invokeStatic(api.clj:219)
at cljs.build.api$watch.invoke(api.clj:207)
at cljs.build.api$watch.invokeStatic(api.clj:216)
at cljs.build.api$watch.invoke(api.clj:207)
at cljs.build.api$watch.invokeStatic(api.clj:210)
at cljs.build.api$watch.invoke(api.clj:207)
at user$eval7609.invokeStatic(watch.clj:3)
at user$eval7609.invoke(watch.clj:3)
at clojure.lang.Compiler.eval(Compiler.java:6978)
at clojure.lang.Compiler.load(Compiler.java:7430)
at clojure.lang.Compiler.loadFile(Compiler.java:7368)
at clojure.main$load_script.invokeStatic(main.clj:277)
at clojure.main$script_opt.invokeStatic(main.clj:337)
at clojure.main$script_opt.invoke(main.clj:332)
at clojure.main$main.invokeStatic(main.clj:423)
at clojure.main$main.doInvoke(main.clj:386)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
at clojure.lang.Reflector.invokeStaticMethod(Reflector.java:207)
at user$eval15.invokeStatic(form-init5230861038763741865.clj:1)
at user$eval15.invoke(form-init5230861038763741865.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6978)
at clojure.lang.Compiler.eval(Compiler.java:6968)
at clojure.lang.Compiler.load(Compiler.java:7430)
at clojure.lang.Compiler.loadFile(Compiler.java:7368)
at clojure.main$load_script.invokeStatic(main.clj:277)
at clojure.main$init_opt.invokeStatic(main.clj:279)
at clojure.main$init_opt.invoke(main.clj:279)
at clojure.main$initialize.invokeStatic(main.clj:310)
at clojure.main$null_opt.invokeStatic(main.clj:344)
at clojure.main$null_opt.invoke(main.clj:341)
at clojure.main$main.invokeStatic(main.clj:423)
at clojure.main$main.doInvoke(main.clj:386)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:700)
at clojure.main.main(main.java:37)
Caused by: clojure.lang.ExceptionInfo: No such namespace: js.hello, could not locate js/hello.cljs, js/hello.cljc, or JavaScript source providing "js.hello" in file src/hello_es6/core.cljs {:tag :cljs/analysis-error}
at clojure.core$ex_info.invokeStatic(core.clj:4725)
at clojure.core$ex_info.invoke(core.clj:4725)
at cljs.analyzer$error.invokeStatic(analyzer.cljc:694)
at cljs.analyzer$error.invoke(analyzer.cljc:690)
at cljs.analyzer$error.invokeStatic(analyzer.cljc:692)
at cljs.analyzer$error.invoke(analyzer.cljc:690)
at cljs.analyzer$analyze_deps.invokeStatic(analyzer.cljc:2111)
at cljs.analyzer$analyze_deps.invoke(analyzer.cljc:2085)
at cljs.analyzer$ns_side_effects.invokeStatic(analyzer.cljc:3430)
at cljs.analyzer$ns_side_effects.invoke(analyzer.cljc:3425)
at cljs.analyzer$analyze_STAR_$fn__3152.invoke(analyzer.cljc:3547)
at clojure.lang.PersistentVector.reduce(PersistentVector.java:341)
at clojure.core$reduce.invokeStatic(core.clj:6703)
at clojure.core$reduce.invoke(core.clj:6686)
at cljs.analyzer$analyze_STAR_.invokeStatic(analyzer.cljc:3547)
at cljs.analyzer$analyze_STAR_.invoke(analyzer.cljc:3537)
at cljs.analyzer$analyze.invokeStatic(analyzer.cljc:3571)
at cljs.analyzer$analyze.invoke(analyzer.cljc:3554)
at cljs.compiler$emit_source.invokeStatic(compiler.cljc:1340)
at cljs.compiler$emit_source.invoke(compiler.cljc:1319)
at cljs.compiler$compile_file_STAR_$fn__4409.invoke(compiler.cljc:1425)
at cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1226)
at cljs.compiler$with_core_cljs.invoke(compiler.cljc:1215)
at cljs.compiler$compile_file_STAR_.invokeStatic(compiler.cljc:1410)
at cljs.compiler$compile_file_STAR_.invoke(compiler.cljc:1403)
at cljs.compiler$compile_file$fn__4440.invoke(compiler.cljc:1507)
... 70 more
听起来像是在抱怨 js.hello
命名空间还没有被 goog.provide()
创建。我希望 ClojureScript 编译器能够做到这一点,因为指南说
JavaScript files do not declare namespaces, so the ClojureScript compiler will compute one based on the location of the entry.
我是不是漏掉了什么?
我认为这都是关于 CLJS 版本的。
试试这个:
project.clj
(defproject hello-es6 "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.9.0-alpha14"]
[org.clojure/clojurescript "1.9.908"]]
:jvm-opts ^:replace ["-Xmx1g" "-server"])
watch.clj
(require '[cljs.build.api :as b])
(b/watch "src"
{:output-to "main.js"
:output-dir "out"
:main 'hello-es6.core
:optimizations :advanced
:target :nodejs
:foreign-libs [{:file "src"
:module-type :es6}] ;; or :commonjs / :amd
:verbose true})
优化应该是 :advanced
我认为这可以帮助您 运行 指南中的示例。