2017-08-07 96 views
3
import { Injectable } from '@angular/core'; 
import { Headers, Http, Response } from '@angular/http'; 
import { Observable } from '@rxjs/Observable'; 
import 'rxjs/Rx'; 
import 'rxjs/add/observable/throw'; 
@Component({}); 
export shellModule{} 

这是我从某处复制的Angular应用程序的一段代码去除导出模块中的定义。我现在用它来作一个服务调用的API。我应该同时使用'import'rxjs/Rx'`和`import {Observable} from'@ rxjs/Observable'`

在这个特定的文件进口,为什么是可观察的是,即使在整个rxjs已导入分别进口。如果一个特定的模块被全部导入,为什么它的一个特定对象被单独导入?我试着在论坛上从这个地方提出这个问题,但是没有答案,我想知道这是否有帮助s优化代码。

+0

甚至不确定该行是否可用,包名是rxjs,所以它不应该找到类似于@rxjs的内容。您应该只分别导入Observable,Subject等类型,并根据需要导入单个运算符。 –

+0

此外,一个好的做法是将所有操作员导入组织到一个文件中,例如rxjs.imports.ts,并将它们仅存在那里。您只需导入一次即可工作。 –

回答

4

一般

在打字稿,途中modules are handled将要求您无论是在与import * as rx from 'rxjs/Rx',或在图书馆内特定的导出的模块,整个库加载到使用它,所以编译器负载在类型中。

将您的进口量减少到仅限您需要的特定模块,将您的应用程序设置为使用来自Angular's AOT compilation的树木摇晃。这不是由打字稿编译器完成的,而是由tool called rollup完成的。所以,它可以帮助以后优化代码,但它不会自动这样做。

就编译开销而言,引入整个库可能会减慢编译器的速度......但除了大量复杂的库之外,这不是一个非常强大的点。

我个人更喜欢导入特定的模块,因为它使调用代码更清洁一些,因为我不需要使用全局名称来获取特定名称。 rx.Observable vs Observable。这方面的一个很好的例子是lodash库(rxjs是一个有点复杂......)

老实说,进口欲行整个库必须有:import 'rxjs/Rx'没有道理给我。您只应导入特定的导出模块。尝试删除它,查看出现了什么错误,然后改为使用* as rx语法。

至于rxjs老话 - 当你想进口特定运营商this question does这是一个有点靠不住的 - 所以要得到具体的运营方式是:import 'rxjs/add/observable/from' - 但也需要与你的的WebPack一个修修补补按照the referenced question's answer中所述进行设置。

3

让我们来看看有什么rxjs/Rx模块出口:

export { Subject, AnonymousSubject } from './Subject'; 
export { Observable } from './Observable'; 
export { Operator } from './Operator'; 
export { Observer } from './Observer'; 
export { Subscription } from './Subscription'; 
export { Subscriber } from './Subscriber'; 
export { AsyncSubject } from './AsyncSubject'; 
export { ReplaySubject } from './ReplaySubject'; 
export { BehaviorSubject } from './BehaviorSubject'; 
... 

import './add/observable/bindCallback'; 
import './add/observable/bindNodeCallback'; 
import './add/observable/combineLatest'; 
... 

所以出口RxJs类和还从add文件夹进口经营者。所以你可以看到它会加载库中的所有东西。它不会导出任何全局对象。所以,你需要使用一个名为出口是这样的:

import * as Rx from 'rxjs/Rx' 

,以便能够使用导出类:

Rx.Observable.of(12, 3); 

这模拟,如果您加载使用捆绑的库,你会有什么 - 一个全球性的Rx对象:

<script src="rxjs/bundles/Rx.js"> 

如果你想使用ObservableRx全局对象,你需要单独导入:

import { Observable } from '@rxjs/Observable'; 
Observable.of(1); 

导入这两种

import { Observable } from '@rxjs/Observable'; 
import 'rxjs/Rx'; 

是不是一个好的做法,但也可以使用,如果你不想分别导入每个操作员。

另请参阅How to correctly import operators from the rxjs package

相关问题