【问题标题】:How to properly import RxJS by patching?如何通过补丁正确导入 RxJS?
【发布时间】:2018-05-20 01:09:32
【问题描述】:

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

文档是这样说的:

通过修补仅导入您需要的内容(这对于大小敏感的捆绑很有用):

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 类的成员,并通过第一个 import 语句导入。

我的问题是:

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

【问题讨论】:

标签: angular typescript rxjs rxjs5 angular2-observables


【解决方案1】:

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

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

【讨论】:

  • 那么如果地图算子已经被Angular导入了,还需要单独导入吗?或者我可以只在我的组件中导入 Observable 并在其上使用已经导入的 map 运算符而不直接在组件中导入它?
  • 这不是一个好习惯。看,地图很常见,所以它很可能是在某个地方导入的。但如果不是,或者即使是,你的函数可能会在定义和全局 Observable 修补之前调用 .map() ,你会得到一个错误。而这种加载取决于 webpack 如何整理你的模块。假设您导入了一个 flatMap 运算符,但在一个惰性模块中。您在主模块中使用它,无需导入。您的主要组件会损坏。我选择的一个模式是在我导入所有运算符的地方拥有全局“operators.ts”文件,然后在我的主应用程序模块中导入这个“operators.ts”。
  • 知道了! operators.ts这个东西真的很有用,谢谢分享。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2011-04-16
相关资源
最近更新 更多