【问题标题】:Closure Compiler not Compiling ES6 library闭包编译器不编译 ES6 库
【发布时间】:2019-03-31 02:32:09
【问题描述】:

我正在使用 Closure Compiler 编写一个相当大的 JavaScript 库,但我制作了一个较小的模型以用作此问题的示例:

src/main.js

export function main(str) {
    console.log("From main: " + str);
}

命令:

google-closure-compiler --compilation_level ADVANCED_OPTIMIZATIONS --language_in ECMASCRIPT6 --language_out ECMASCRIPT6 --js_module_root src/ --module_resolution node --js src/main.js --js_output_file build/main.min.js

预期结果(大致):

export function main(str){console.log("From main: "+str)}

实际结果:

'use strict';

长话短说,我已经苦苦挣扎了好几个小时,我不知道如何让 Closure Compiler 尊重 ES6“导出”语句。我已经尝试了很多次谷歌搜索,但我只能得到 "goog.modules" 的结果,这不是我想要的。任何帮助将不胜感激。

【问题讨论】:

    标签: javascript google-closure-compiler


    【解决方案1】:

    Closure Compiler 目前不支持将模块作为输出(任何格式)。

    【讨论】:

    • 值得一提的是,通过一些简单的 externs hack,说服 Closure 生成 AMD 模块甚至是 CommonJS 模块(如果你足够专注的话)非常简单,但我还没有找到工作围绕 ES6 模块。也许我可以编写一个 grunt 脚本来操作 Closure 的输出,但这需要对我的构建系统进行大量修改。
    【解决方案2】:

    如果你只用 ADVANCED_OPTIMIZATIONS 编译下面的函数, 闭包编译器产生空输出:

    function displayNoteTitle(note) { alert(note['myTitle']); }

    因为在您传递的 JavaScript 中永远不会调用该函数 对于编译器,Closure Compiler 假定这段代码不是 需要!

    Ref

    你应该添加一个调用你的函数的部分

    function displayNoteTitle(note) {
      alert(note['myTitle']);
    }
    displayNoteTitle({'myTitle': 'Flowers'});
    

    或者你可以将它添加到窗口对象

    function displayNoteTitle(note) {
      alert(note['myTitle']);
    }
    // Store the function in a global property referenced by a string:
    window['displayNoteTitle'] = displayNoteTitle;
    

    Live example

    【讨论】:

    • 虽然这是一个好主意 1) 它是一个库,所以它只导出函数和类,但从不自己调用它们,并且 2) 它不是明确用于浏览器的,所以“窗口”选项不适用。尽管如此,还是非常感谢您如此迅速地回复!
    • @ChefCyanide 解决方案:导出您想要保留的符号如果您只想压缩一组函数定义以创建一个小型、可重用的库怎么办? 如何防止 Closure Compiler 删除所有函数?在这种情况下,最好的解决方案是导出您的函数,如下例所示:function displayNoteTitle(note) { alert(note['myTitle']); } // Store the function in a global property referenced by a string: window['displayNoteTitle'] = displayNoteTitle; 这是他们的文档所建议的
    • 是的,我也阅读了他们的文档,但正如我在评论中解释的那样,这不适用于我的用例。
    • @ChefCyanide 注意突出显示的行,在文档本身中,他们正在谈论一组函数定义和可重用库。
    • 这种方法在 Node 这样不存在“window”的环境中是行不通的。由于我试图同时支持浏览器和 Node,这种方法对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多