如何无需手动列举即可将所有RxJS操作符重导出为类成员
问题背景
以下为开源项目Thingsboard中的代码片段:
import { forkJoin, of } from 'rxjs'; ... import { catchError, map, mergeMap, switchMap } from 'rxjs/operators'; ... export class WidgetContext { ... rxjs = { forkJoin, of, map, mergeMap, switchMap, catchError }; ... }
上述代码的设计目标是为开发者提供在自定义widget代码中调用所列RxJS操作符的途径,调用示例如下:
self.ctx.rxjs.switchMap(...);
咨询核心问题:是否可以无需手动逐一列举,即可将所有可用的RxJS操作符全部重导出至单个类成员中供调用?
解答
完全可以实现,不需要手动逐一枚举API,有两种常用的落地方式:
- 直接导入模块整包合并
把rxjs核心库、operators操作符库以模块对象的形式整体导入,再通过对象展开运算符合并后挂载到类成员上即可,代码示例:
这种写法会自动包含RxJS导出的所有静态方法(比如import * as RxjsCore from 'rxjs'; import * as RxjsOperators from 'rxjs/operators'; export class WidgetContext { // 其他成员省略 rxjs = { ...RxjsCore, ...RxjsOperators }; }of、forkJoin、from)和所有操作符(比如map、switchMap、catchError),调用方式和原有手动枚举的写法完全一致,后续升级RxJS版本时,新增的API也会自动暴露,不需要手动修改这个类的代码。 - 聚合导出配合Tree Shaking优化
如果在意包体积,担心整包导入把没用到的RxJS代码打进来,可以先在项目里建一个单独的聚合文件统一转导出RxJS内容,构建时的Tree Shaking机制会自动剔除没被引用的API:
之后在WidgetContext类里直接导入这个聚合模块的整体对象赋值即可:// 公共聚合文件 src/common/rxjs-exports.ts export * from 'rxjs'; export * from 'rxjs/operators';import * as RxjsExports from 'src/common/rxjs-exports'; export class WidgetContext { // 其他成员省略 rxjs = RxjsExports; }
注意:两种方案的最终调用逻辑和原有手动枚举的逻辑完全一致,不会影响现有自定义widget的代码运行,不需要修改已有的
self.ctx.rxjs.xxx()调用写法。
内容的提问来源于stack exchange,提问作者devaskim
相关产品推荐
相关产品推荐

