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
似乎我在我的案子中找到了罪魁祸首.我这么做的很难; 我的过程:
在违规提交之前,我总是在提交后持续大约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))似乎也做了这个工作.还有其他几个地方添加了类型注释加速编译.
希望这有助于某人.
尽管如此,如果编译器中有一个设施可以更快地得到答案 - 我很乐意听到它.
我可以从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选项。如果返回的统计信息返回较高的“检查时间”值,请检查代码中是否缺少类型。
众所周知,编译器速度很慢,您可以在监视模式下使用编译器tsc -w或切换到webpackand ts-loaderwhich次公开transpileOnly选项(无需耗时的检查)。
| 归档时间: |
|
| 查看次数: |
7617 次 |
| 最近记录: |