Компилятор закрытия — лучшая практика для проектов библиотеки JavaScript?

#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:

https://github.com/morisil/closure-compiler-lib-example

Ответ №1:

Внешние предоставляют определения для символов, которые компилятор должен считать уже существующими.

Есть несколько решений:

 /** @suppress {const,duplicate} */
const myLib = {}
  

или используйте отдельное имя внутри и назначьте его так, чтобы компилятор не проверял:

 globalThis['myLib'] = myInternalName;