命名空间在运行时加载的顺序与用户代码中命名空间被require的顺序无关。这似乎影响所有优化级。这意味着开发者不能依赖于在特定命名空间中运行副作用代码,在依赖于副作用的其他命名空间加载之前。
复制步骤
运行以下命令:
clj --main cljs.main --compile-opts '{:target :nodejs :main a}' --compile a
将会编译在
在编译后,请注意以下内容:
输出文件out/cljs_deps.js中,针对a.js的goog.addDependency调用包含其依赖项的任意顺序。例如,在我的机器上运行的结果是:
goog.addDependency("../a.js", ['a'], ['cljs.core', 'e', 'c', 'g', 'b', 'd', 'f']);
用{{node out/main.js}}运行编译后的代码时给出的控制台输出表明,运行时的加载顺序与out/cljs_deps.js中反映的顺序相同
e的主体
c的主体
g的主体
b的主体
d的主体
f的主体
分析
看起来[CLJS-1453](
https://dev.clojure.org/jira/browse/CLJS-1453)中做了一些工作来确保编译时保持顺序,但似乎到Rio greedy time被emit时,顺序可能会出现问题。
似乎给定ClojureScript文件的输出最终由cljs.compiler/emit-source的输出确定。那里删除了与CLJS-1453前Ana的方法中'ns'解析方法相同的依赖项。
附加的补丁解决了我的狭义用例中的问题,但我认为基函数传递了`:uses`和`:requires`作为映射,因此可能需要更多工作才能完全解决。