RxJS "точка" против "трубы" абстракция - PullRequest
0 голосов
/ 22 марта 2019

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
...