【问题标题】:Closure Compiler + Typescript闭包编译器 + 打字稿
【发布时间】:2017-12-16 04:53:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 只有 Angular 核心开发人员才能正确回答这个问题。
  • @ChadKillingsworth,虽然这不是 Angular 应用程序。
  • 我知道 - 但他们是我所知道的唯一能够理解这种情况的开发人员。 typescript 编译器、tsickle 和closure-compiler - 这是一个非常具体的知识集。这是一个非常重要的问题。
  • 有道理。 ://

标签: typescript google-closure-compiler es6-modules tsickle


【解决方案1】:

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

在实践中,我们找到了一些理由使用 tsickle 之类的东西在 Closure 看到之前转换 JS。

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

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

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

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

【讨论】:

  • 我们这样做 :) 此外,bazel 看起来很棒,虽然我们还没有使用它。自路线图首次公布以来,我一直在关注它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2012-11-09
    • 2013-08-19
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多