升级angular-cli@1.6.3后Observable.of等RxJS方法报错咨询
解决RxJS 5.5+中Observable.of/fromEvent等静态方法报错的最优方案
你遇到的这个问题本质是RxJS 5.5+为了优化树摇和模块化,对静态创建方法的导入方式做了重大调整,你的临时解决方案虽然能运行,但确实有更标准、更符合官方推荐的最优方案,而且完全兼容AOT编译要求:
核心原因
RxJS 5.5+不再默认将of、fromEvent这类静态创建方法挂载到Observable类上,而是将它们作为独立的函数放在RxJS的顶层模块中。之前通过Observable.of()调用的方式,只有在引入rxjs-compat兼容包时才会生效,但兼容包不推荐在新代码中使用(尤其是AOT场景)。
最优解决方案:直接导入独立创建函数
你不需要使用ArrayObservable、FromEventObservable这类内部实现类,直接从rxjs顶层导入对应的创建函数即可,代码更简洁且符合官方规范:
1. 替换导入语句
把原来的:
import { of } from 'rxjs/observable/of'; import { fromEvent } from 'rxjs/observable/fromEvent';
改成:
import { of, fromEvent, combineLatest } from 'rxjs';
2. 直接调用函数,而非通过Observable类
把原来的:
const x = Observable.of(true, false); const y = Observable.fromEvent(target, 'click'); const combined = Observable.combineLatest(obs1, obs2);
改成:
const x = of(true, false); const y = fromEvent(target, 'click'); const combined = combineLatest(obs1, obs2);
为什么这个方案更好?
- 符合官方规范:这是RxJS 5.5+官方推荐的用法,也是RxJS 6+的标准写法,能平滑过渡到更高版本的RxJS
- 避免依赖内部类:
ArrayObservable、FromEventObservable属于RxJS的内部实现细节,官方不保证这些类的稳定性,后续版本可能会被修改或移除 - 完美兼容AOT:直接导入独立函数的方式,AOT编译器能正确识别并处理,不会出现注入器失败的问题
- 优化打包体积:这种模块化导入方式有助于webpack等打包工具进行树摇,剔除未使用的代码,减小最终打包体积
补充说明:关于操作符的pipe写法
你提到操作符转为pipe形式后没问题,这和静态创建方法的调整是一致的——RxJS 5.5+的lettable操作符也是通过独立导入+pipe调用的方式,这整套变更都是为了提升RxJS的模块化和可摇树性。
内容的提问来源于stack exchange,提问作者Readren
相关产品推荐
相关产品推荐

