请分享您的想法,参加2024年Clojure调查:![2024 State of Clojure Survey!](https://www.surveymonkey.com/r/clojure2024)

欢迎!有关本站如何工作的更多信息,请参阅关于页面。

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}]})

;; 或者以 "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)

2 答案

0

评论人:deraen

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

0
参考:https://clojure.atlassian.net/browse/CLJS-2709(由 deraen 报告)
...