Awesome
Ramda
Практичная функциональная библиотека для JavaScript программистов.
Почему Ramda?
<img src="http://ramda.jcphillipps.com/logo/ramdaFilled_200x235.png" width="170" height="190" align="right" hspace="12" />
Уже есть несколько отличных библиотек с функциональным оттенком. Как правило, они предназначены для того, чтобы быть инструментами общего назначения, подходят для работы в нескольких парадигмах. У Ramda, в свою очередь, более конкретная цель. Мы хотели библиотеку, разработанную специально для программирования в функциональном стиле, библиотеку, с которой легко создавать функциональные источники информации, которая не изменяет данные пользователя.
В чем разница?
Основные отличительные особенности Ramda:
-
Ramda делает упор на чистый функциональный стиль. Неизменность (Immutable) данных и отсутствие побочных эффектов функций лежат в основе философии дизайна. Это помогает выполнять работу с помощью простого и элегантного кода.
-
Ramda функции имеют автоматический карринг. Это позволяет легко строить новые функции из старых просто не передавая конечный параметр.
-
Параметры в Ramda функциях расположены таким образом, чтобы сделать карринг как можно более удобным. Данные, которые должны быть обработанны, как правило, передаются в последнюю очередь.
Последние два пункта вместе, делают простым создание последовательностей функций, каждая из которых преобразует данные и передает их следующей. Ramda спроектирована для поддержки такого стиля написания кода.
Введение
- Введение в Ramda by Buzz de Cafe
- Почему Ramda? by Scott Sauyet на русском языке
- Содействие каррингу by Scott Sauyet
- Почему карринг помогает by Hugh Jackson
- Эй, Underscore, ты делаешь это неправильно! by Brian Lonsdorf
- Думать в Ramda by Randy Coulman на русском языке
Философия
Используя Ramda у вас должно появиться чувство как будто вы просто используете JavaScript. Это практичный, функциональный JavaScript. Мы не представляем лямбда выражения в строках, мы не заимствуем consed списки, мы не импортируем все функции с Clojure.
Наши базовые структуры данных - это простые JavaScript объекты, а наши обычные коллекции - это JavaScript массивы. Мы также сохраняем другие встроенные в JavaScript функции, такие как функции-объекты со свойствами.
Функциональное программирование в значительной степени связано с неизменными (immutable) объектами и Функциями без побочных эффектов. Хотя Ramda не применяет это, она позволяет использовать такой стиль с как можно меньшим "трением".
Мы стремимся к реализации как чистоты, так и элегантности кода, но АРI остается более важным. Частично мы приносим в жертву элегантность реализации ради более чистого АРI.
И последнее, но не менее важное: Ramda стремится к производительности. Надежная и быстрая реализация побеждают любые понятия функциональной чистоты.
Установка
Для использования с node:
$ npm install ramda
Затем в консоли:
const R = require('ramda');
Для прямого использования в браузере:
<script src="path/to/yourCopyOf/ramda.js"></script>
или минифицированная версия:
<script src="path/to/yourCopyOf/ramda.min.js"></script>
или с CDN, или cdnjs:
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
или с помощью одной из ссылок приведенных ниже jsDelivr:
<script src="//cdn.jsdelivr.net/npm/ramda@0.25.0/dist/ramda.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/ramda@0.25/dist/ramda.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/ramda@latest/dist/ramda.min.js"></script>
(заметьте, что использование latest
привносит огромный риск того, что при изменении Ramda API ваш код может сломаться.)
Эти теги script добавляют переменную R
в глобальной области видимости браузера.
Или вы можете вставить Ramda в любой ничего не подозревающий сайт с помощью bookmarklet.
Замечания к версиям > 0.25
Версии Rambda > 0.25 не имеют экспрота по умолчанию.
Поэтому вместо import R from 'ramda';
нужно использовать import * as R from 'ramda';
А еще лучше, импортировать только необходимые функции через import { functionName } from 'ramda';
Сборка
- на Unix-подобных платформах,
npm run build
обновляет dist/ramda.js и dist/ramda.min.js - на Windows, запишите результат
scripts / build --complete
до временного файла, после чего переименуйте временный файл на dist / ramda.js.
Частичная сборка
Возможно собрать Ramda с подмножеством функциональных возможностей ради уменьшения размера файла. Система сборки Ramda предоставляет эту возможность с помощью флажков в командной строке. Например, если вы используете R.compose
, R.reduce
и R.filter
, вы можете создать частичную сборку с помощью следующей строки:
./scripts/build -- src/compose.js src/reduce.js src/filter.js > dist/ramda.custom.js
Для этого нужно иметь установленный Node/io.js.
Документация
- Перевод API-документации русский язык.
- Переклад API-документації украинский язык.
- API Документация английский язык.
Имя
Хорошо, Итак, мы любим овец: ram:. Это все. Это короткое имя, никем пока не занято. Это с легкостью могло бы быть eweda
, но тогда мы бы были вынуждены говорить eweda lamb! (lamb - ягненок, прим.переводчика), а токого никто не хотел. Для тех, кто не является носителем английского языка, lambs - это детеныш овцы, ewes - это овца, а rams - бараны. Поэтому, возможно, ramda-это повзрослевшая lambda... Но, наверное, нет.
Запуск тестов
Консоль:
Для запуска тестов с консоли, вам необходимо установить mocha
:
npm install -g mocha
Тогда из корня вашего проекта вы можете просто вызвать
mocha
Или если вы установили зависимости через:
npm install
тогда вы можете запустить тесты (и получить вывод деталей в терминале) запустив команду:
npm test
Браузер:
Вы можете использовать testem для тестирования в разных браузерах (и даже в "безголовых" браузерах), с мгновенной перезагрузкой. Установите testem (npm install -g testem
) и выполните testem
. Откройте ссылку которую предоставит вам ваш браузер и вы увидите результаты в вашем терминале.
Если у вас установлен PhantomJS , вы можете выполнить testem -l phantomjs
для запуска тестов полностью в "безголовом" режиме.
Переводы
Благодарности
Спасибо J. C. Phillipps за Ramda logo. Ramda logo artwork © 2014 J. C. Phillipps. Creative Commons Licensed CC BY-NC-SA 3.0.