2017-08-25 56 views
1

我跟着的https://clojurescript.org/guides/javascript-modules第一部分和部分在哪裏執行lein trampoline run -m clojure.main watch.clj顯示了這個爲什麼JavaScript模塊指南示例不起作用?

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 編譯器將根據條目的位置計算的。

我錯過了什麼嗎?

+0

該代碼看起來像是試圖從'hello-es6/src/js/hello.js'文件中讀取/查找/解析Google Closure命名空間。這對我來說沒有任何意義,因爲主要目的是能夠使用不是爲Google Closure編譯器編寫的JavaScript。 – kevincasey

回答

1

我認爲這都是關於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}) 

優化應該是:先進的

我認爲這有助於您從Guide中運行示例。

+0

是的,指南中顯示的版本'[org.clojure/clojurescript「1.9.854」]不起作用。我不必添加一個':optimizations'鍵來使其工作,但它很好,它仍然工作時優化。謝謝! – kevincasey