網站搜尋

angular - 如何在 RxJS 6 中僅導入使用到的運算符,就像舊版 RxJS 一樣,而不需要 rxjs-compat?


之前我只能用這段程式碼匯入已使用的操作符:

import 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/finally';
import 'rxjs/add/observable/empty';
import 'rxjs/add/observable/throw';

這會生成一個小的捆綁包(vendor.ts)。
如何在不需要 rxjs-compat 的情況下使用 RxJS 完成這個操作?
將上述代碼更改為 import 'rxjs'; 則會生成更大的捆綁包。

更新:

我按照你發佈的所有答案操作了,但都不太管用。這是我更新過的 vendor.ts:

import 'rxjs/Observable';
import 'rxjs/Subscription';
import 'rxjs/Subject';
import 'rxjs/observable/throw';
import 'rxjs/operators/map';
import 'rxjs/operators/mergeMap';
import 'rxjs/operators/catchError';
import 'rxjs/operators/finalize';

我也試過使用 'rxjs/add/operator/*'。

這就是我導入 rxjs 的方式:

import {Observable} from 'rxjs/Observable';
import {Subscription} from 'rxjs/Subscription';
import {Subject} from 'rxjs/Subject';
import {_throw} from 'rxjs/observable/throw';
import {map} from 'rxjs/operators/map';
import {mergeMap} from 'rxjs/operators/mergeMap';
import {catchError} from 'rxjs/operators/catchError';
import {finalize} from 'rxjs/operators/finalize';   

我根據這份文件 (https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md#build-and-treeshaking) 修改了我的 Webpack 3 配置,但什麼都不起作用。

最後,看看 Webpack Bundle Analyzer 的結果:

這個套件包含所有運算子。我找到這個相關問題: https://github.com/angular/angular-cli/issues/9069

答案#1

rxjs-compat 應該與 rxjs 一起安裝,它提供對舊式導入的支援。

可以用與 RxJS 5 相同的方式來使用 RxJS 6:

import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

這個相容層預計會在 RxJS 7 中移除。

答案#2

對我來說的問題是,我在 tsconfig.json 中將 module 設置為 commonjs。它需要設置為 es6,因為 webpack 需要 es6 模塊才能進行樹搖(tree shaking)。

更多資訊請見: https://webpack.js.org/guides/tree-shaking/

Tree shaking 是一個常用於 JavaScript 環境中指代消除死程式碼的術語。它依賴於 ES2015 模組語法的靜態結構,即 import 和 export...

...

  • 使用 ES2015 模塊語法(即 import 和 export)。
  • 確保沒有編譯器將你的 ES2015 模組語法轉換成 CommonJS 模組