研究长TypeScript编译时间

Ron*_*īts 25 typescript angular

我正在调查为什么我的Angular 2.0 TypeScript项目的编译时间在相对较短的时间内从大约4秒到大约15秒.

我遇到了非常有用但看似无记录的--diagnostics开关.

例如,这是我tsc --noEmit --diagnostics现在在项目上运行时得到的结果:

Files:             231
Lines:           50872
Nodes:          170067
Identifiers:     65994
Symbols:       7712123
Types:          407677
Memory used:   600554K
I/O read:        0.43s
I/O write:       0.00s
Parse time:      1.13s
Bind time:       0.34s
Check time:     10.17s
Emit time:       0.00s
Total time:     11.64s
Run Code Online (Sandbox Code Playgroud)

这是我在早期版本的项目上运行相同命令时得到的结果.

Files:             197
Lines:           30882
Nodes:          124208
Identifiers:     46201
Symbols:       5856945
Types:           10989
Memory used:    80412K
I/O read:        0.03s
I/O write:       0.00s
Parse time:      0.60s
Bind time:       0.27s
Check time:      0.93s
Emit time:       0.00s
Total time:      1.79s
Run Code Online (Sandbox Code Playgroud)

数量Types已经上升,而且也是如此Check time.

是否有可能从中获得更详细/更详细的输出--diagnostics

NodeJS v4.4.3,TypeScript v1.8.10.这是我的tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",

    "noImplicitAny": false,
    "noEmitOnError": false,

    "experimentalDecorators": true,

    "emitDecoratorMetadata": true,
    "removeComments": false
  },
  "exclude": [
    "node_modules",
    "wwwroot",
    "typings/main.d.ts",
    "typings/main"
  ]
}
Run Code Online (Sandbox Code Playgroud)

Ron*_*īts 22

似乎我在我的案子中找到了罪魁祸首.我这么做的很难; 我的过程:

  1. 找到使编译变慢的提交.完成历史提交提交并检查编译时间.
  2. 注释掉更改的代码,直到找到有问题的行.

在违规提交之前,我总是在提交后持续大约2-4秒的编译时间--13-17秒.

在我的例子中,我有一个带有accessTokenGetter字段的类,它在构造函数中初始化:

export class JwtConfig {
    //...
    accessTokenGetter: () => Observable<string>;
    //...
      constructor(private config?: IJwtConfig) {
          // ...
          this.accessTokenGetter = this.config.accessTokenGetter || (() => Observable.of(null));
      }
}
Run Code Online (Sandbox Code Playgroud)

初始化的第二部分|| (() => Observable.of(null));导致缓慢.将其注释掉或添加类型注释会使编译时间缩短.由于Observable是通用的,因此TypeScript编译器似乎需要一个提示来缩小它需要做的某些类型检查.我的初始化现在读作:

//...
this.accessTokenGetter = this.config.accessTokenGetter || (() => Observable.of(<string>null));
//...
Run Code Online (Sandbox Code Playgroud)

Observable.of(null as string))似乎也做了这个工作.还有其他几个地方添加了类型注释加速编译.

希望这有助于某人.

尽管如此,如果编译器中有一个设施可以更快地得到答案 - 我很乐意听到它.

  • 您可以从`git bisect` 中受益,并将编译时间作为枢轴/条件。将 1000 次提交一分为二只需要几分钟。设置可能不到一个小时,您可以将其重新用于未来的调查 (5认同)
  • 哇,这太疯狂了.如果有一种自动方式来跟踪这些慢速推理,那将会很棒. (3认同)

KGo*_*ang 5

我可以从15秒开始加快编译过程。至6-7秒。通过更改以下单行代码:

// slow:
// ...
.flatMap((receivedObj: MyType) => {
    let nextObservable: Observable<MySecondType> = this.dependingPut(receivedObj);
    return nextObservable || new Observable((observer) => {
            observer.next(undefined);
        });
});


// fast:
.flatMap((receivedObj: MyType) => {
    let nextObservable: Observable<MySecondType> = this.dependingPut(receivedObj);  
    return nextObservable || new Observable<MySecondType>((observer) => { // <--- use the generics!
            observer.next(undefined);
        });
});
Run Code Online (Sandbox Code Playgroud)

从打字稿手册(https://www.typescriptlang.org/docs/handbook/generics.html):

function identity<T>(arg: T): T {
    return arg;
}

// ...

let output = identity("myString");  // type of output will be 'string'
Run Code Online (Sandbox Code Playgroud)

“请注意,我们不必在尖括号(<>)中显式传递类型,编译器只是查看了值“ myString”,并将T设置为其类型。而类型参数推断可以是一个有用的工具,为了使代码更简短,更易读,您可能需要像在上一个示例中那样,当编译器无法推断类型时,像在更复杂的示例中那样,显式传递类型参数。”

就我而言,它并没有失败;类型推断只花了很长时间(顺便说一句,它也消耗了大量内存)。在开始构建解决方法之前,请返回您的修订历史记录,并尝试确定错误的修订。为确保编译器是罪魁祸首,请使用--diagnostics选项。如果返回的统计信息返回较高的“检查时间”值,请检查代码中是否缺少类型。


kem*_*sky 0

众所周知,编译器速度很慢,您可以在监视模式下使用编译器tsc -w或切换到webpackand ts-loaderwhich次公开transpileOnly选项(无需耗时的检查)。