RsJs переместились из абстракции "точка" в "трубу" для своих операторов по по этим четырем причинам . Будут ли эти причины устранены, если операторы будут иметь псевдонимы с символами? Таким образом, вместо добавления свойства с именем 'myOp'
к прототипу, что если имя было бы символом, подобным Symbol('myOp')
? Тогда это может быть вызвано как
var MyOp = require('my-op');
var o = getObservable();
var x = o[MyOp]();
Принимая оправдания по одному:
Любая библиотека, которая импортирует оператор исправления, будет увеличивать прототип Observable.pro для всех потребителей этой библиотеки, создавая слепые зависимости. Если библиотека удаляет их использование, они неосознанно ломают всех остальных. С помощью pipeables вы должны импортировать нужные операторы в каждый файл, в котором вы их используете.
Символ будет прикреплен к прототипу только тогда, когда модуль загружен через require('myOp')
и не столкнется, потому что это символ и не будет удален.
Операторы, исправленные непосредственно в прототипе, не могут быть «потрясены деревом» такими инструментами, как свертка или веб-пакет. Трубные операторы будут просто функциями, извлекаемыми непосредственно из модулей.
Символы, добавленные к прототипу, не должны быть встряхнуты, поскольку они импортируются один за другим по мере необходимости; Если символ присутствует в прототипе, он используется тем, кто его импортировал.
Неиспользуемые операторы, которые импортируются в приложения, не могут быть надежно обнаружены с помощью каких-либо инструментов сборки или правила lint. Это означает, что вы можете импортировать сканирование, но прекратить его использование, и оно все равно будет добавлено в ваш выходной комплект. Если вы не пользуетесь конвейерными операторами, правило за вас может воспользоваться этим правилом.
Символы, которые загружены, но не используются, легко обнаружить; Если var MyOp = require('my-op')
и MyOp
не используются, то линтер может попросить удалить пакет, и операция никогда не будет присоединена, поскольку модуль никогда не загружается.
Функциональная композиция потрясающая. Создание собственных пользовательских операторов становится намного, намного проще, и теперь они работают и выглядят так же, как и все другие операторы из rxjs. Вам больше не нужно расширять Observable или отменять лифт.
Модуль my-op
объявит оператор следующим образом:
var MyOp = Symbol('MyOp');
Observable.prototype[MyOp] = function() { ... }
module.exports = MyOp