Как загрузить RxJS в минимальное приложение Angular 2, используя systemjs?

Я не могу получить минимальное приложение Angular 2, используя RxJS с земли. Я использую Typescript (tsc 1.6.2) и systemjs для загрузки модуля. Как получить правильную загрузку модуля Rj? У меня не хватало идей, чтобы попробовать, и я был бы признателен за любой указатель на то, что я делаю неправильно. Загрузка модуля для меня немного волшебна. Очень расстраивает.

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Title</title>
    <script src="../node_modules/es6-shim/es6-shim.js"></script>
    <script src="../node_modules/systemjs/dist/system.src.js"></script>
    <script src="../node_modules/rx/dist/rx.lite.js"></script>
    <script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
</head>

<body>
    <app>App loading...</app>
    <script>
        System.config({
            packages: { 'app': { defaultExtension: 'js' } }
        });
        System.import('app/app');
    </script>
</body>
</html>

app.ts

/// <reference path="../../node_modules/rx/ts/rx.all.d.ts" />
import { bootstrap, Component, View } from 'angular2/angular2';
import * as Rx from 'rx';

@Component({
    selector: 'app'
})
@View({
        template: `Rx Test`
})
export class App {
    subject: Rx.Subject<any> = new Rx.Subject<any>();
}
bootstrap(App);

SystemJS пытается загрузить файл, который не существует:

введите описание изображения здесь

Как только я прокомментирую тему в приведенном выше коде, все работает нормально, так как не будет попытки загрузить несуществующий файл (и никакой rx не загружен).

Ответ 1

Обновление angular2 beta 0

Angular2 больше не связывает RxJS внутри самого angular2. Теперь вы должны импортировать операторы отдельно. Это было важное изменение, которое я ответил здесь. Поэтому, пожалуйста, обратитесь к этому ответу, поскольку он устарел и больше не применяется.

Обновление 12/11/2015

Alpha46 использует RxJS альфа 0.0.7 (скоро будет 0.0.8). Начиная с этой версии ng2 alpha вам больше не нужно решение ниже, теперь вы можете импортировать Observable, Subject среди других непосредственно из angular2/angular, поэтому исходный ответ можно отбросить

import {Observable, Subject} from 'angular2/angular2';

=====================================

Angular2 больше не использует старый RxJS, они переместились в новый RxJS 5 (иначе RxJS Next), поэтому он столкнется с Http и EventEmitter.

Итак, сначала удалите импорт и script в rx.lite.js.

Вместо этого вам нужно сделать (вам не нужны никакие сценарии или сопоставление в вашей конфигурации)

Edit

Эта строка предназначена для работы в plnkr, но в моих проектах мне просто нужно добавить что-то еще

Версия Plnkr

import Subject from '@reactivex/rxjs/dist/cjs/Subject';

Автономная версия

import * as Subject from '@reactivex/rxjs/dist/cjs/Subject';

Примечание о автономной версии

Если вы попробуете первый подход для plnkr в своих локальных проектах, вы, вероятно, получите сообщение об ошибке

TypeError: Subject_1.default is not a function

Итак, для вашей локальной (автономной) версии вы должны использовать второй подход (со звездочкой).

Примечание

В Subject нет скобки и это объясняется в этот разговор (у меня была та же проблема, lol)

Здесь plnkr не работает.

Надеюсь, это поможет. Если я пропустил что-то, просто скажи мне;)

Ответ 2

Для angular2 alpha52 использует rxjs 5alpha.14

<script>
System.config({
  map: { rxjs: 'node_modules/rxjs' },
  packages: {
    rxjs: { defaultExtension: 'js' },
    'app': {defaultExtension: 'js'}
  }
});
System.import('app/app');
</script>

но вы должны импортировать каждый оператор отдельно, как в этом примере

import { Subject } from 'rxjs/Subject';
import { Observable } from 'rxjs/Observable';

require('rxjs/add/operator/map');
require('rxjs/add/operator/scan');
require('rxjs/add/operator/mergemap');  //for flatmap
require('rxjs/add/operator/share');
require('rxjs/add/operator/combinelatest-static'); //for combinelatest

Ответ 3

Публикация этого ответа после выпуска Angular 4. Попробуйте загрузить минимальный минимум из Rxjs, так как Angular prod build даже с AOT собирается 300kb

Надеюсь, что это поможет.

import { Injectable } from '@angular/core';
import {Http} from "@angular/http";
import {Observable} from "rxjs/Observable";
import 'rxjs/add/operator/map';// load this in main.ts

import {AllUserData} from "../../../shared/to/all-user-data";

@Injectable()
export class ThreadsService {

  constructor(private _http: Http) { }

  loadAllUserData(): Observable<AllUserData> {
    return this._http.get('/api/threads')
      .map(res => res.json());
  }

}