2017-01-20 19 views
2

なぜ次のTypeScriptコードはコンパイルされますが、実行時にシステムが依存関係を正しくロードできないのはなぜですか?rxjs/Observableを構築する際のエラー

import { Observable } from 'rxjs'; 
let temp123 = new Observable<String>(); 

しかし、これは動作します。具体的

import { Observable } from 'rxjs/Observable'; 
let temp123 = new Observable<String>(); 

、コード含ま.jsファイル内の最初のコードの結果:

var Observable_1 = require('rxjs'); 
var temp123 = new Observable_1.Observable(); 

が、第2のコードは、この生成した:

var Observable_1 = require('rxjs/Observable'); 
var temp123 = new Observable_1.Observable(); 

l ine require( 'rxjs')はファイルが存在しないため404エラーで失敗します。 typescriptコンパイラがこれを解決できるのはなぜですか?しかし、システムjは実行時にそれをロードできません。

また注目に値する:この問題はObservableで特定のことを行う場合にのみ発生します。たとえば、次のコードは動作します:

import { Observable } from 'rxjs'; 
let temp123: Observable<String> = null; 
let xyz = temp123.first(); 

私はに観測を使用し、その上にメソッドを呼び出すことができ、活字体コンパイラなし必要(「rxjs」)を生成しました。しかし、私はそれを構築することはできませんし、私はそれを拡張することはできません。

バージョン:2.0.3活字体、Systemjs 0.19.27、5.0.0-beta.12をrxjs

答えて

7

はなぜこれを解決することができtypescriptですコンパイラですが、 は、実行時にロードすることはできませんsystemjs?

あなたが書くときimport { Observable } from 'rxjs'; typescriptですが

宣言 rxjs用のファイル、およびそのファイルを入力します
"typings": "Rx.d.ts" 

を有し、それにpackage.jsonnode_modulesrxjsフォルダを検索します。それが動作する方法だ

含まれている

export { Observable } from './Observable'; 

これは、typescriptがという別の型宣言ファイルを、Observableクラスのために宣言をエクスポートした同じフォルダ内で見つけることを可能にします。

これは、コードをエラーなしでコンパイルするのに十分です。

あなたのコードは、実際の値としてObservableを使用しようとしていない場合、それは動作します、typescriptですがunused reference elisionを行いますので、 - Observableのみ型チェックのために使用されている場合は、2番目の例のように、生成にはrequire('rxjs')コールは存在しませんjavascrpt。

今、SystemJSです。

SystemJSには、モジュールを探すためのデフォルトの場所がありません。mainプロパティを持つpackage.jsonファイルに関するnode_modulesの規則を認識しません。

ので、ほとんどの場合、あなたの例ではSystemJSは、このように構成されていますので、

SystemJS.config({ 
     paths: {'npm:': 'node_modules/'}, 
     map: {'rxjs': 'npm:rxjs'}, 
     packages: { 
      rxjs: { 
      } 
     } 
    }); 

、このライン

import { Observable } from 'rxjs/Observable'; 

によってインポートされたモジュールrxjs/Observable

node_modules/rxjs/Observable.js 
にマッピングされています接頭辞 rxjsmapと一致するため、

node_modules/rxjs

Observable部分にマップpathsと一緒にエントリがそのままrxjs systemjs configにパッケージ、および持つrxjs試合がパッケージに属しているすべてのモジュールに対して、SystemJSは.jsを追加するため

.js拡張子が追加されています拡張子は、defaultExtensionがそのパッケージのconfig内の他のものに設定されていない限り、自動的に拡張されます。

ファイルnode_modules/rxjs/Observable.jsが存在するため、動作します。

node_modules/rxjs/Observable.d.tsも存在するので、このインポートはtypescriptでも機能します。

最後に、それはnode_modules/rxjs URLにマッピングされているため、これは実行時

import { Observable } from 'rxjs'; 

では動作しませんし、そこには実際のファイルはありません。

あなたはSystemJSパッケージの設定でmainプロパティを使って、それを修正することができます:

 packages: { 
      rxjs: { 
       main: 'Rx.js' 
      } 
     } 

は、今ではnode_modules/rxjs/Rx.jsにマッピングされていますし、そのファイルが実際に存在してObservableという名前の何かをエクスポートし、それが動作するはずです。

SystemJS 0.19.43、rxjs 5.0.3、typescript 2.1.5でチェックされています。

+0

私のsystemjs.configについては正しいですか。そしてあなたの修正プログラムは動作します。 systemjs.package.configにaddin 'main'を追加した方がimport文を変更する方が良いか悪いと思いますか?驚くほど詳細な答えは、BTW。 –

+0

'main'を追加すると、systemjs builderを使ってアプリケーションをパッケージ化するとき(そしてif)作業を続けるチャンスが増えたと思いますが、自分自身でrxjsを使っていないので間違っている可能性があります。もしあれば、rxjsの作者の意見を知ることは興味深いでしょう。 – artem

+0

@artem。私はしばらくの間、 "rxjs/Observable"からのインポートを "rxjs" vs 'importから" import "することについて不思議でした。非常に明確な説明に感謝します。 – AngularChef

関連する問題