Как получить переменную из другого сжатого файла с помощью закрывающего компилятора - PullRequest
0 голосов
/ 19 декабря 2018

Здравствуйте! Я хочу интегрировать компилятор Closure от Google, чтобы сжать мои файлы в режиме ADVANCED_OPTIMIZATIONS, но у меня есть 2 сжатых файла, и мне нужно совместно использовать переменные между ними.

Я читаю эту документацию https://developers.google.com/closure/compiler/docs/api-tutorial3

Проблема

Я получил эту ошибку:

ReferenceError: getValue не определено

, поэтому я попытался заменить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 голосов
/ 19 декабря 2018

Решение этой проблемы указано, если кратко, в подзаголовке Решение для вызова из скомпилированного кода во внешний код: Externs в документе, который вы связали.

Я полагаю, ваше замешательство происходит от слов «сторонний» и «внешний».В контексте этого документа можно предположить, что «сторонний» и «внешний» относятся как к коду, написанному другими, так и к и к любому коду, который приходит из любых файлов, скомпилированных отдельно (вами или другими лицами).

В этом случае можно либо добавить /** @export */ к переменным, которые вы не хотите переименовывать, либо определить файл externs для своих источников.

Alternate 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модули .Закрывающий компилятор поддерживает их с флагом module_resolution .

Общее чтение: Код инкапсуляции с модулями :

Альтернативный 3

Используйте модули библиотеки Google Closure (goog.module, goog.require и (не рекомендуется) goog.provide).

...