使用模块处理(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}]})
;; 或者以 "src/hello/core.cljs" 作为源和 :optimization :one
;; 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. required "hello.say" namespace never provided 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)