使用模块处理(CJS/ES6)的JavaScript代码可以使用例如{{goog.require("name.space")}}或{{import * from "goog:name.space";}}的方式引入ClojureScript命名空间。但当前如果该命名空间仅由JS模块使用,而没有其他Cljs命名空间,则Closure优化将失败。
当{{build}} {{source}}是单文件时,或者当{{:optimization}}和{{:main}}被设置时(在这种情况下,构建入口点是{{:main}}文件),会发生这种情况。
问题在于,在构建管道中,添加了来自{{:libs}}的JS文件(包括来自模块处理的文件)后,不再向构建中添加新的Cljs源:
https://github.com/clojure/clojurescript/blob/master/src/main/clojure/cljs/closure.clj#L2809-L2819
使用{{:optimization :none}}时,构建期间不会显示错误,但在运行时会因缺少模块而出现错误。具有优化时,Closure会抛出关于缺少模块的错误。
;; build.clj
(require 'cljs.build.api)
(cljs.build.api/build
"src"
{:main 'hello.core
:output-to "target/main.js"
:output-dir "target/main.out"
:asset-path "main.out"
:optimizations :simple
:foreign-libs [{:file "src"
:module-type :es6}]})
;;或者作为源文件和使用:optimization :one的"src/hello/core.cljs"
;; src/hello/core.cljs
(ns hello.core (:require [hello.es-module :refer [greet]]))
(greet "test")
;; src/hello/say.cljs
(ns hello.say)
(defn ^:export it [m]
(str "Hello, " m))
;; src/hello/es_module.js
import it from "goog:hello.say";
export var greet = function(m) {
document.write(hello.say.it(m));
};
Closure错误
Mar 27, 2018 7:02:07 PM com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING: 1 error(s), 0 warning(s)
ERROR: JSC_MISSING_PROVIDE_ERROR. Never provided required "hello.say" namespace at /home/juho/tmp/cljs-in-js-in-cljs/target/main.out/src/hello/es_module.js line 2 : 0
Exception in thread "main" java.lang.Exception: Closure compilation failed, compiling:(/home/juho/tmp/cljs-in-js-in-cljs/build.clj:3:1)