ImmutableJS против Ramda или ImmutableJS + Ramda - могут ли они использоваться вместе - PullRequest
1 голос
/ 05 апреля 2019

Я исследую эти две библиотеки, и для меня ImmutableJS имеет (в основном) неизменяемые структуры данных, тогда как Ramda имеет набор швейцарских армейских ножей FP утилит.

Когда я гуглю, я вижу такие статьи, как Ramda против ImmutableJS, которые рекомендуют одну или другую, но на первый взгляд, по крайней мере для меня, они дополняют друг друга.

Я могу представить, чтобы все мои структуры данных в приложении React были ImmutableJS (List, Set, Map, Record), но используйте Ramda для составления функций, преобразования на ImmutableJS коллекций и т. Д. Или когда мне не хватает некоторых функций, таких как uniq.

Что ты думаешь? Это разумный подход?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

Могут ли они использоваться вместе; не гладко или без проблем.

Скорее всего, это подход, который, как сейчас обстоят дела, приведет вас, по крайней мере, к некоторым трудностям, и, скорее всего, к большим трудностям. Причина этого заключается в том, что неизменяемые структуры не совместимы с функциями ramda. Возможно, вам удастся создать оболочки или взаимодействие для исправления этой функциональности, но это выглядит как довольно большой проект.

Эта проблема углубляется в детали и включает некоторые потенциальные альтернативы неизменяемым файлам, такие как List.

Вот очень маленький пример того, почему проблема отсутствия взаимодействия является проблемой:

const { Map } = Immutable;
const { path } = R;

const standardObject = {a: 1, b: 2, c: 3};
const map1 = Immutable.Map(standardObject);

const getA = path(['a']);

const result = getA(map1);
const defaultResult = getA(standardObject);

console.dir(result);
console.dir(defaultResult);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>

Вы могли бы предположительно встроить преобразования в работу, которую вы выполняете в рамде; это кажется самым простым способом решения проблемы, хотя это означает, что вы будете привязывать свой код очень близко к неизменным структурам данных. Это может работать так:

const { Map } = Immutable;
const { path, pipe } = R;

const standardObject = {a: 1, b: 2, c: 3};
const map1 = Immutable.Map(standardObject);

const toStandard = map => map.toObject()

const getA = pipe(
  toStandard,
  path(['a'])
)

const result = getA(map1)

console.dir(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
0 голосов
/ 06 апреля 2019

Часть этой интеграции поставляется бесплатно с Ramda. Рамда делегирует многие свои вызовы объекту данных. В основном, если имя функции Ramda совпадает с именем неизменяемого метода, тогда Ramda выполнит интеграцию.

Это означает, что вы часто можете использовать неизменный список или карту с Рамдой, где вы обычно используете массив или объект.

const {Map, List} = immutable
const {map, filter, find} = ramda

const square = n => n * n
const isEven = n => n % 2 == 0

const xs = new List([1, 2, 3, 4, 5])

console.log(map(square, xs)) //=> List [1, 4, 9, 16, 25]
console.log(filter(isEven, xs)) //=> List [2, 4]
console.log(find(n => n > 3, xs)) //=> 3

const x = new Map({a: 1, b: 2, c: 3, d: 4, e: 5});

console.log(map(square, x))
//=> Map {"a" => 1, "b" => 4, "c" => 9, "d" => 16, "e" => 25}
console.log(filter(isEven, x)) //=> Map {"c" => 3, "d" => 4, "e" => 5}
<script src="https://bundle.run/ramda@0.26.1"></script>
<script src="https://bundle.run/immutable@4.0.0-rc.12"></script>

Это пока ограничено общими именами. И не все функции Рамды делегируют таким образом.

Как отмечает проблема , упомянутая Оливером Радини, я действительно заинтересован в том, чтобы в Ramda было проще сделать дальнейшую интеграцию с такими инструментами, как Immutable, но она никогда не поднималась в начало списка, и среди участников Рамды есть некоторый реальный отпор.

...