影响:1.9.1033+
这里有一个最小重现库:
https://github.com/au-phiware/cljs-2818
h2. 问题描述
在 CLJS-2389 中更新 Closure 编译器之前,使用 {{export { x as y } from './x'}} 或 {{export { default as y } from './x'}} 语法的 ES6 模块可以正确编译。其他形式的此语法,例如 {{export { default } from './x'}},则不行。
自 1.9.1033 以来,编译器不再发出 {{goog.require}} 语句,也不再在 {{cljs_deps.js}} 中发出一套完整的 {{goog.addDependency}} 语句。
h2. 重现问题的步骤
考虑以下源文件
{code:title=src/foo/core.cljs|language=clojure}
(ns foo.core (:require [hello :refer [helloGreet]]))
(def ^:export sayHello
(helloGreet "World"))
(sayHello)
{code:title=es6/hello.js|language=javascript}
export {
default as helloGreet
} from "./greet";
{code:title=es6/greet.js|language=javascript}
export default function greet(m) {
document.write("\nHello, " + m);
};
{code:title=build.clj|language=clojure}
(require 'cljs.build.api)
(cljs.build.api/build
"src"
{:main 'foo.core
:output-to "target/main.js"
:output-dir "target/main.out"
:asset-path "main.out"
:foreign-libs [{:file "es6/hello.js"
:provides ['hello]
:module-type :es6}]
:verbose true
:npm-deps {"@cljs-oss/module-deps" "*"}
:install-deps true})
执行 {{cljs}}
java -cp cljs.jar:src clojure.main build.clj
h2. 预期结果
{{cljs}} 应该正常退出并生成以下文件(大约如此)。
{code:title=target/main.out/cljs_deps.js|language=javascript}
goog.addDependency("base.js", ['goog'], []);
goog.addDependency("../cljs/core.js", ['cljs.core'], ['goog.string', 'goog Uri', 'goog.object', 'goog.math.Integer', 'goog.string.StringBuffer', 'goog.array', 'goog.math.Long']);
goog.addDependency("../process/env.js", ['process.env'], ['cljs.core']);
goog.addDependency("../es6/greet.js", ['module$usr$src$es6$greet'], []);
goog.addDependency("../es6/hello.js", ['module$usr$src$es6$hello'], ['module$usr$src$es6$greet']);
goog.addDependency("../foo/core.js", ['foo.core'], ['cljs.core', 'module$usr$src$es6$hello']);
{code:title=target/main.out/es6/hello.js|language=javascript}
goog.provide("module$usr$src$es6$hello");
goog.require("module$usr$src$es6$greet");
module$usr$src$es6$hello.helloGreet=module$usr$src$es6$greet["default"]
h2. 实际结果
{{cljs_deps.js}} 缺少 {{es6/greet.js}} 依赖项
{code:title=target/main.out/cljs_deps.js|language=javascript}
goog.addDependency("base.js", ['goog'], []);
goog.addDependency("../cljs/core.js", ['cljs.core'], ['goog.string', 'goog Uri', 'goog.object', 'goog.math.Integer', 'goog.string.StringBuffer', 'goog.array', 'goog.math.Long']);
goog.addDependency("../process/env.js", ['process.env'], ['cljs.core']);
goog.addDependency("../es6/hello.js", ['module$usr$src$es6$hello'], []);
goog.addDependency("../foo/core.js", ['foo.core'], ['cljs.core', 'module$usr$src$es6$hello']);
{{es6/hello.js}} 文件缺少 {{goog.requires}} 语句
{code:title=target/main.out/es6/hello.js|language=javascript}
goog.provide("module$usr$src$es6$hello");
定义模块 module$usr$src$es6$hello,包含属性 helloGreet,该属性使用 getter 语法返回 module$usr$src$es6$greet 模块的默认值。
此外,浏览器控制台显示以下信息:
>>> module$usr$src$es6$hello.helloGreet
hello.js:2 Uncaught ReferenceError: module$usr$src$es6$greet 没有定义
在 hello.js:2 的 Object.get helloGreet [as helloGreet] 处出错
在 <anonymous>:1:65 处出错
h2. 尝试解决的问题
明确定义 {{:requires}} 选项到 {{es6/hello.js}} 中的 {{:foreign-libs}} 条目并没有解决这个问题(也不是使用整个 {{es6}} 目录的条目或使用 npm 模块,例如 d3-scale)。将 {{[greet]}} 添加到 {{foo.core}} 的 requires 中同样没有解决问题。