【问题标题】:Closure Compiler - best practice for JavaScript library projects?Closure Compiler - JavaScript 库项目的最佳实践?
【发布时间】:2020-10-25 08:13:36
【问题描述】:

我正在尝试使用 Closure Compiler 来最小化和验证我的 JavaScript 库,但我正在努力解决一个问题。我创建了一个小项目来突出这个问题。这是我的库的带有公共 API 的 externs 文件。我是这样定义的:

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

【问题讨论】:

    标签: javascript google-closure-compiler transpiler


    【解决方案1】:

    Externs 为编译器应该认为已经存在的符号提供定义。

    有几个解决方案:

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

    或在内部使用单独的名称并以编译器不会检查的方式分配它:

    globalThis['myLib'] = myInternalName;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多