Closure Compiler - JavaScript 库项目的最佳实践?

Posted

技术标签:

【中文标题】Closure Compiler - JavaScript 库项目的最佳实践?【英文标题】:Closure Compiler - best practice for JavaScript library projects? 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

有几个解决方案:

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

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

globalThis['myLib'] = myInternalName;

【讨论】:

以上是关于Closure Compiler - JavaScript 库项目的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Closure Compiler 编译的 jQuery

让 browserify 与 Google Closure Compiler 一起工作

Closure Compiler - JavaScript 库项目的最佳实践?

使用 Google Closure Compiler 时如何防止关键字被混淆?

如何使用 Google 的 Closure Compiler 将我的 javascript 拆分为模块?

动手写一个简单的编译器:在JavaScript中使用Swift的尾闭包语法