如何通过打补丁的方式正确导入RxJS?

How to properly import RxJS by patching?

我有一个 Angular 项目,我需要使用来自 RxJS 的 Observables 和一些选择的运算符。

文档是这么说的:

To import only what you need by patching (this is useful for size-sensitive bundling):

import { Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';

Observable.of(1,2,3).map(x => x + '!!!'); // etc

这就是我在我的应用程序组件中所做的:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {

  private testObservable: Observable<string> = Observable.of(1,2,3).map(x => x + '!!!');

  constructor() { }

  ngOnInit() {

    this.testObservable.subscribe((str: string) => {

      console.log(str);

    });

  }

}

这是我感到困惑的地方。当我删除第二个和第三个导入(ofmap)时,Observable 的运算符仍然有效!

我的印象是使用 import 'rxjs/add/operator/*'; 只会添加我需要的运算符,而不会导入其余运算符。但是,我可以看到所有运算符(静态和实例)都是 Observable class 的成员,并通过第一个 import 语句导入。

我的问题是:

  1. 如何正确地只导入我需要的部分而排除其余部分?
  2. 如果所有运算符都已经是 Observable 的成员,那么使用 import 'rxjs/add/operator/*'; 有什么意义 class?

您也在其他地方导入地图,而不仅仅是在您的组件中。尽量不要导入异国情调的东西,比如 bufferToggle。它会抛出错误。地图已全部导入和修补,甚至可能来自 Angular 本身。

因此,导入特定的运算符仍然有意义。 import * 会很糟糕,但是 import just map 会减少你的包大小。