【发布时间】:2017-09-07 09:07:55
【问题描述】:
起点:许多 js 文件被 Closure Compiler(ADVANCED_OPTIMIZATIONS 级别)成功编译(无警告/错误)在单个库文件中。
在这些js文件中:
-
goog.require和goog.provide用于在它们之间导入/导出东西 -
/** @export */前面使用whatever(const/function/Class/var) 是库外需要的。
一些 HTML 文件包括该库和一些未编译的 js 成功访问该库中定义的所有 whatever。
我想要的:迁移到 es6 模块语法
我对每个 js 文件做了什么:
-
goog.require被import替换为 Class 列表,来自另一个 js 文件的函数 -
goog.provide被移除,export添加在另一个 js 文件所需的每个类、函数等前面 - 尝试 1:每次在库外都需要
whatever时,不要更改/** @export */。 - 尝试2:将所有
/** @export */ whatever替换为goog.exportSymbol('whatever', whatever)
这已成功编译(没有警告/错误,仍处于 ADVANCED_OPTIMIZATIONS 级别)。
问题:现在,对于相同的 HTML 文件,库中定义的所有 whatever 都被浏览器视为“未定义”。事实上,当我在控制台中输入 Object.keys( window ) 时,我可以看到编译器更改的所有符号名称(aa、ba、ca 等),但我导出的符号 whatever 一个都没有。
示例:demoVisitors 是在库中定义并在外部需要的 const array。
之前在库文件中,我可以看到 ... w("demoVisitors",[Oa,La,Ma,Na]); ... 并且内容在 HTML 页面中正确可见。在 es6 模块更改后,我可以看到 ... H("demoVisitors$$module$filemane",Oa); ...(filename 是定义 demoVisitors 的文件名)用于尝试 1,H("demoVisitors",[Na,Ka,La,Ma]); 用于尝试 2。demoVisitors 在浏览器中未定义相同页面。
【问题讨论】:
-
我不确定
@export是否在模块中工作。 -
根据您的评论,我将 @export 替换为 goog.exportSymbol。它在编译后的代码中看起来更好,但在浏览器中仍未定义。我相应地更新了我的帖子。
标签: javascript ecmascript-6 google-closure-compiler es6-modules