为什么javascript-modules指南示例不起作用?

时间:2017-08-25 16:59:09

标签: clojurescript

我跟随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文件不声明名称空间,因此ClojureScript   编译器将根据条目的位置计算一个。

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

我认为这完全是关于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})

优化应:高级

我认为这有助于您从指南中运行示例。