2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面以了解有关如何使用本站的更多信息。

0
ClojureScript
使用模块处理(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)

2 答案

0
by

评论由:deraen 发布

我想我知道需要做什么。构建管道({{build}} 和 {{compile-inputs}} 函数)需要进行重构,以调用 {{add-dependency-sources}},这是 {{handle-js-modules}} 和 {{add-js-sources}} 的一部分,直到没有找到新的资源。JavaScript 模块的处理需要分为两部分:一部分用于查找所需 JS 模块及其依赖项的信息,另一部分用于稍后处理所有 JS 模块。

0
by
参考:[https://clojure.atlassian.net/browse/CLJS-2709](https://clojure.atlassian.net/browse/CLJS-2709)(由 deraen 提出)
...