如何使用闭包编译器从另一个压缩文件中获取变量

时间:2018-12-19 10:16:08

标签: javascript google-closure-compiler

您好,我想集成Google的Closure编译器,以ADVANCED_OPTIMIZATIONS模式压缩我的文件,但是我有2个压缩文件,我需要在两者之间共享变量。

我阅读了本文档https://developers.google.com/closure/compiler/docs/api-tutorial3

问题

我收到此错误:

  

ReferenceError:未定义getValue

所以我试图用window ['getValue']代替getValue,但是它不起作用。

基本代码

第一个JS文件:

var nb0 = 0;
var nb1 = 1;
var nb2 = 2;
var nb3 = 3;

function getValue( nb ) {
    return nb;
}

window['nb0']           = nb0;
window['nb1']           = nb1;
window['nb2']           = nb2;
window['nb3']           = nb3;
window['getValue']      = getValue;

第二个JS文件:

document.addEventListener("DOMContentLoaded", function() { 

    var val = getValue;

    document.querySelector( ".button" ).addEventListener( "click", upButton );

    function upButton() {

        val++;
        document.querySelector( ".show" ).innerText = val;

    }

} );

1 个答案:

答案 0 :(得分:0)

在子标题下简要说明了该问题的解决方案 Solution for Calling out from Compiled Code to External Code: Externs 在您链接的文档中。

我想您的困惑来自“第三方”和“外部”这两个词。在本文档的上下文中,您可以假定“第三方”和“外部”是指由他人编写的代码,均来自单独编译的文件(由您或他人编写)中的任何代码。

然后的解决方案是在/** @export */之前添加您不想重命名的var,或为您的源定义一个externs文件。

备用1

如果您希望以此方式继续使用window(这很丑陋,恕我直言,有时候这是适当的),则应更改

var val = getValue;

var val = window['getValue'];

例如:

document.addEventListener("DOMContentLoaded", function() { 

    var val = window['getValue'];

    document.querySelector( ".button" ).addEventListener( "click", upButton );

    function upButton() {

        val++;
        document.querySelector( ".show" ).innerText = val;

    }

} );

编译为

document.addEventListener("DOMContentLoaded", function() {
  var a = window.getValue;
  document.querySelector(".button").addEventListener("click", function() {
    a++;
    document.querySelector(".show").innerText = a;
  });
});

备用2

使用ES6 modules。闭包编译器supports these with the module_resolution flag

一般阅读:Encapsulating Code With Modules

备用3

使用Google Closure Library's modules(goog.module,goog.require和(不建议使用)goog.provide)。