2017-04-27 22 views
8

我有一個很難搞清楚究竟怎麼了這個import語句作品(在寫的打字稿的角度應用程序):試圖瞭解RxJS進口

import 'rxjs/add/operator/toPromise'; 

我得到rxjs被映射到相應的node_modules SystemJS配置文件中的子文件夾,但然後我卡住了。我看到有一個index.js文件,但我看不到這是否或如何幫助解決add/operator/...部分。

同樣,我不明白這一個:

import {Observable} from 'rxjs/Observable'; 

同樣,沒有文件Observable.*文件在這個地方。我猜它通過index.js文件以某種方式工作,但我真的希望得到一個更徹底的理解,因爲我讀了很容易導入所有RxJS意外增加頁面加載時間。

我仔細看了一下Typescript模塊解析文檔,但我覺得這不足以解釋它。

更新:閱讀接受的答案下面我想通了,我一直在尋找的node_modules/rx目錄而不是node_modules/rxjs經過這麼import語句目錄結構完全匹配。

回答

5

這很簡單,因爲默認情況下TypeScript會查看node_modules目錄。

導入以下內容:

import {Observable} from 'rxjs/Observable'; 

解析爲node_modules/rxjs/Observable.d.ts這足以編譯代碼。

同樣導入rxjs/add/operator/toPromise解析爲node_modules/rxjs/add/operator/toPromise.ts。順便說一句,您可以使用--traceResolution編譯器選項來查看測試的TypeScript路徑。

當你有你的編譯JS(如在commonjs格式),你可以在node運行你的應用程序,因爲它會調用require('rxjs/Observable')將解析爲node_modules/rxjs/Observable.js。然後與rxjs/add/operator/toPromise類似。

請注意,RxJS github頁面的代碼結構與實際的npm包不同。基本上,只要在package.jsonsrc DIR編譯.js.d.ts文件上傳到故宮倉庫(原.ts源文件在node_modules/rxjs/src但你永遠不希望直接與他們一起工作)。

+0

哦,不,我在看錯誤的目錄......「rx」而不是「rxjs」。現在很清楚,謝謝! – lex82

+0

Martin,他們爲什麼使用'/ add'前綴?它沒有任何意義 –

+0

@羅伊什麼是沒有意義的? '/ add/...'目錄中的所有文件都用於將操作符添加到'Observable.prototype'(例如https://github.com/ReactiveX/rxjs/blob/master/src/add/operator/ buffer.ts)。這允許只使用我在項目中實際需要的那些操作符,因此具有樹狀結構的(例如rollup.js,webpack2或更多)JS捆綁器可以生成更小的捆綁包。 – martin