闭包编译器 + 打字稿

Closure Compiler + Typescript

我想使用 Typescript,然后使用 Closure Compile(高级编译)来针对 ES5 并缩小输出。

我必须使用 tsickle 代替 tsc 吗?它缺乏对 tsc 拥有的所有选项的支持,并且雄心勃勃,因为它希望将 Typescript 类型转换为 Closure 类型(并非 100% 兼容)。我真的不需要使用闭包类型;我只需要 minification/property 重命名。

我可以使用 tsc 将 Typescript 编译为 ES6 模块并使用 Closure Compiler 缩小这些模块(没有类型检查或基于类型的优化)吗?

奖金:如果我想使用 Closure Library,这个答案会改变吗?

从技术上讲,您可以从 tsc 获取 ES6 输出并将其立即通过管道传输到 Closure 编译器,因为后者被指定为接受 JS 作为输入。我们已经在很多地方这样做了,例如。 Angular 使用闭包编译器编译的应用采用 rxjs 库分发并将其包含在闭包包中。参见 https://github.com/angular/closure-demo

在实践中,我们发现了一些在 Closure 看到它之前使用 tsickle 之类的东西来转换 JS 的原因。

  • enums emit 在闭包(或汇总 IIUC)中不起作用
  • Closure 对 ES6 有一些限制,例如它目前不支持 export * - tsickle 将其重写为 export {each, visible, symbol}
  • 添加 JSDoc 注释有助于闭包理解代码的结构,从而改进优化并减少它打印的警告数量。

我们目前的计划是将 tsickle 分解为多个 TS 2.3 emit 转换,然后我们可以更清楚哪些转换实际上需要在编译器中启用。

添加类型是可选的。如果您关闭 tsickle 的输入模式,我们将只打印 {?} 作为类型。但是,如果你想使用闭包 JS 代码的 TypeScript 输出,那么你会希望闭包类型检查器知道类型。

如果您喜欢新的构建工具,我们会在 https://github.com/bazelbuild/rules_typescript 的某个时候将 tsickle 构建到 Bazel 工具链中。同时,您可以为 Tsickle 的 main 提交功能请求以支持更多命令行标志。 (但我认为 Lucidchart 已经维护了 Tsickle 的一个分支?)

我意识到我迟到了,但关于 Closure 库: 现在有一个 active fork 的闭包库的最新版本

  • 打字稿定义 (.d.ts) 文件
  • 在内部使用 ES6 代码而不是自定义 goog.require、goog.define(因此不依赖于 Closure 编译器)