RsJ将these four reasons的运算符从“点”抽象为“管道”。如果运算符带有符号别名,这些原因是否也可以解决?因此,与其在原型中添加一个名为'myOp'
的属性,不如该名称是像Symbol('myOp')
这样的符号怎么办?然后可以将其作为
var MyOp = require('my-op');
var o = getObservable();
var x = o[MyOp]();
一对一地论证:
任何导入了补丁运算符的库都会为该库的所有使用者增加Observable.prototype,从而造成盲目依赖。如果库删除了它们的用法,它们将在不知不觉中破坏其他所有人。使用pipeable,必须将所需的运算符导入到每个使用它们的文件中。
仅当通过require('myOp')
加载模块时,该符号才会附加到原型上,并且不会碰撞,因为它是符号并且不会被删除。
直接修补到原型上的运算符不能通过汇总或webpack之类的工具“摇晃”。可管道运算符就像是直接从模块中引入的函数一样。
添加到原型中的符号无需摇晃,因为它们是根据需要逐一导入的;如果该符号出现在原型上,那么导入它的人就会使用它。
通过任何类型的构建工具或棉绒规则无法可靠地检测到正在应用程序中导入的未使用的运算符。这意味着您可以导入扫描,但是停止使用它,并且它仍被添加到输出包中。使用管道运算符,如果您不使用它,则可以使用皮棉规则为您选择。
已加载但未使用的符号易于检测;如果未使用var MyOp = require('my-op')
和MyOp
,则短绒棉机可能会要求删除软件包,因此由于永远不会加载模块,因此永远不会附加op。
功能组成很棒。建立自己的自定义运算符变得非常容易,现在它们可以正常工作,就像rxjs中的所有其他运算符一样。您无需再扩展Observable或覆盖提升。
my-op
模块将这样声明操作符:
var MyOp = Symbol('MyOp');
Observable.prototype[MyOp] = function() { ... }
module.exports = MyOp