由于这四个原因,RsJs 的操作员从“点”抽象变为“管道”抽象。如果运算符使用符号别名,这些原因是否也会得到解决?因此,与其在原型中添加一个名为的属性'myOp'
,如果名称是一个类似的符号Symbol('myOp')
怎么办?然后它可以被调用为
var MyOp = require('my-op');
var o = getObservable();
var x = o[MyOp]();
逐一论证:
任何导入补丁操作符的库都会为该库的所有使用者增加 Observable.prototype,从而创建盲依赖。如果图书馆取消了它们的使用,它们会在不知不觉中破坏其他所有人。使用 pipeables,您必须将所需的运算符导入到您使用它们的每个文件中。
该符号只会在模块通过加载时附加到原型require('myOp')
并且不会发生冲突,因为它是一个符号并且不会被删除。
直接修补到原型上的算子不能被 rollup 或 webpack 等工具“摇树”。可管道运算符将是因为它们只是直接从模块中提取的函数。
添加到原型中的符号不需要动摇,因为它们是根据需要一一导入的;如果该符号出现在原型上,那么任何导入它的人都在使用它。
任何类型的构建工具或 lint 规则都无法可靠地检测到正在导入应用程序的未使用运算符。这意味着您可能会导入扫描,但停止使用它,它仍会被添加到您的输出包中。使用 pipeable 运算符,如果您不使用它,lint 规则可以为您提取它。
已加载但未使用的符号很容易检测到;如果var MyOp = require('my-op')
并且MyOp
不使用,则 linter 可能会要求删除包,因此永远不会附加操作,因为永远不会加载模块。
功能组合很棒。构建自己的自定义运算符变得非常容易,现在它们可以工作并且看起来就像 rxjs 中的所有其他运算符一样。您不再需要扩展 Observable 或覆盖提升。
该模块my-op
将像这样声明运算符:
var MyOp = Symbol('MyOp');
Observable.prototype[MyOp] = function() { ... }
module.exports = MyOp