#javascript #google-closure-compiler #transpiler
#javascript #google-closure-compiler #transpiler
Вопрос:
Я пытаюсь использовать компилятор закрытия для минимизации и проверки моей библиотеки JavaScript, и я борюсь с одной проблемой. Я создал небольшой проект, чтобы выделить проблему. Вот внешний файл с общедоступным API моей библиотеки. Я определил его в соответствии с:
https://developers.google.com/closure/compiler/docs/externs-and-exports
/**
* @fileoverview Public API of my-lib.js
*
* @externs
*/
const myLib = {};
myLib.foo = function() {};
И вот реализация:
// const myLib = {};
myLib.foo = function() {
console.log("foo");
};
Итак, проблема в том, что если я раскомментирую первую строку, я получаю эту ошибку:
my-lib.js:1:6: ERROR - [JSC_REDECLARED_VARIABLE_ERROR] Illegal redeclared variable: myLib
1| const myLib = {};
^^^^^^^^^^
Если я этого не сделаю, результат будет выглядеть так:
(function(){myLib.foo=function(){console.log("foo")};})()
Что хорошо, потому myLib.foo
что не было переименовано, поэтому внешние компоненты работают, но в то же время myLib
пространство имен не было создано.
Какова была бы наилучшая практика для решения такой проблемы, или, если ее нет, может быть, есть какое-то обходное решение?
Я перенес этот пример на github:
Ответ №1:
Внешние предоставляют определения для символов, которые компилятор должен считать уже существующими.
Есть несколько решений:
/** @suppress {const,duplicate} */
const myLib = {}
или используйте отдельное имя внутри и назначьте его так, чтобы компилятор не проверял:
globalThis['myLib'] = myInternalName;