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 模組
