Что мне нравится в Elm (и то, что вы тоже должны)

Не секрет, что я большой поклонник Elm. Вот что делает его таким замечательным.

Практически полное отсутствие ошибок во время выполнения

В JavaScript TypeError: b is null — довольно обычная ошибка, которую трудно исправить. Наличие минимизированной сборки без исходной карты также не очень помогает. В некоторых случаях вы смотрите на дни потраченного впустую времени на поиск решения.

Но Elm избегает этого, быстро терпя неудачу. Другими словами, если что-то сломалось, вам не нужно ждать отзывов пользователей, чтобы узнать об этом. Если он успешно скомпилируется, то его можно смело отправлять в продакшн.

Легко учить

Если вы любите Redux так же, как и я, вам будет приятно узнать, что он был вдохновлен архитектурой Elm (TEA). Понять, как изменяется состояние и как изменения проходят через «компоненты», легко и просто.

Кроме того, в наши дни функциональность является большой тенденцией, и вы, возможно, уже понимаете многие концепции, из которых состоит Elm.

А для любых пробелов в знаниях Руководство по Elm — это фантастический ресурс для изучения таких концепций Elm, как декодирование/кодирование JSON, HTTP-запросы и многое другое.

Ресурсы:

Функциональный

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

Вот пример функции с побочным эффектом:

function hello(age) { 
    if(age > 21) { 
        return "hello, " + this.state.name; 
    } else { 
        return "Yo, " + this.state.nickname; 
    } 
}

В Elm все значения можно определить только один раз (что делает их неизменяемыми). Вот что происходит, когда вы пытаетесь скомпилировать:

У Elm есть побочные эффекты (взаимодействие с пользователем, отсчет времени, HTTP-запрос/ответ и т. д.), но он обрабатывает их за вас во время выполнения, прежде чем передать результат логике приложения. Вы можете прочитать это, чтобы узнать больше.

Стройте быстро и стройте мало

Я провел тест для сборки, используя приложение реального мира в React, а также в Elm. Результаты довольно убедительны:

Реакция 16.3.0:

  • Получение зависимостей: 20 с
  • Создание производственной сборки: 7,5 с.
  • Размер производственной сборки: 296 КБ

ELM 0.19:

  • Получение зависимостей: 12 с
  • Сборка производственной сборки: 2,4 с.
  • Размер производственной сборки: 92 КБ

Бенчмаркинг VDOM с использованием js-framework-benchmark[1]

Значимые ошибки

Когда приходит время компилировать, Elm предоставляет приятные, значимые ошибки, которые облегчают исправление вашего кода.

Посмотрите на эту ошибку JavaScript для сравнения (одна из самых распространенных ошибок):

Uncaught TypeError: Cannot read property

Включенный менеджер пакетов и компилятор

Хотите писать современный Javascript? Вам нужно скачать NodeJS, NPM и упаковщик. Затем у вас, скорее всего, будет несколько МБ узловых модулей (create-react-app загружает 293 МБ узловых модулей). Наконец, вам придется потратить несколько часов на выбор библиотеки AJAX и среды тестирования.

Но Elm поставляется в комплекте с менеджером пакетов и компилятором. Модули кэшируются и повторно используются в проектах, AJAX включен в ядро, и существует только одна среда тестирования.

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

Бесстрашный рефакторинг

Попытка реорганизовать кодовую базу JavaScript может превратиться в кошмар. Единственный способ быть уверенным, что код не выдаст ошибку, — протестировать все функции, связанные с этим изменением кода.

(Если у вас есть спагетти-код, вас может ждать долгая ночь.)

С Elm компилятор выдаст вам ошибки красного цвета и советы по их исправлению, что упростит перекомпиляцию. Повторив этот шаг несколько раз, вы увидите зеленую надпись «Успех! Скомпилирован 1 модуль» — что означает «Ваш рефакторинг выполнен, и в продакшене не будет закрадываться никаких ошибок».

Не уверены, что в ELM можно делать все, что нужно? Попробуйте порты и флаги

Если вам нужно использовать JS SDK или API браузера, вам может помочь система ELM interop. Вы можете отправлять данные в Elm во время загрузки с помощью flags и публиковать данные в ELM через ports.

Порты просты, они похожи на Pub/Sub как в Elm, так и в JavaScript (Elm может отправлять и получать данные из JavaScript). Вот пример использования ports

С ним также интересно программировать

С Elm очень весело разрабатывать, потому что вы можете сосредоточиться на том, что действительно важно, создавая что-то, что работает намного быстрее, чем с любой другой платформой JS.

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

Закрытие

Elm — это весело, интуитивно понятно, быстро и эффективно. Я был в восторге от его использования, и я действительно рекомендую вам подумать о том, чтобы попробовать его самостоятельно.

[1]