请在2024年Clojure状态调查!中分享您的想法。

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

0
ClojureScript

goog.module是一种定义Closure命名空间的新方法:https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide

它被用于例如https://github.com/google/incremental-dom

我没有对如何处理Closure库进行彻底检查,但是一个被{{cljs.closure}}肯定使用的函数是{{cljs.js-deps/find-classpath-lib}},它会调用{{cljs.js-deps/parse-js-ns}}来读取JS文件并从中解析模块信息。当前该函数读取第一个函数声明之前的行,并使用正则表达式查找{{goog.provide}}和{{goog.require}}调用。可能Closure Compiler有一些内置的解析文件的功能可以利用。

除了从文件中读取模块信息之外,另一个问题是如果对ClojureScript编译器生成的传统/遗留命名空间使用{{goog.module}}定义的命名空间是否需要特殊处理。当需要{{goog.module}}时,{{goog.require}}返回导出对象,但没有设置全局变量。然而,有一个函数可以创建全局变量:https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide#how-do-i-use-a-googmodule-from-a-traditional-closure-file

备注

  • 我们是否还可以假设所有的goog.require都发生在第一个函数声明之前?
    -- 使用可能的Closure Compiler功能可以解决这个问题
    -- 类<{{com.google.javascript.jscomp.deps.JsFileParser}}看上去很有希望
  • "GCL尚未切换到它,这可能是由一些用户推动的,而不是由Google更广泛使用的某些功能" (David在slack中)

1 答案

0
...