A / N: Я работаю в uSwitch. Эта статья была впервые опубликована в uSwitch Labs в соответствии с руководящими принципами uSwitch по содержанию и прошла рецензирование моими коллегами. Вступление к статье написано Александром Сумовским.

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

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

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

В целом, это был отличный опыт с многообещающими результатами.

Что такое ReasonML?

ReasonML - это альтернативный синтаксис для OCaml, который использует бэкэнд компилятора Bucklescript для вывода JS. Разработчики утверждают, что он поставляется с набором инструментов, ориентированных на отличное взаимодействие с разработчиками для написания типобезопасных программ с функциональным стилем, и что полученный код обеспечивает довольно быструю производительность и небольшие размеры пакетов.

Мы оценивали ReasonML как кандидата на статическую типизацию во внешнем интерфейсе. Мы хотели ответить на следующие основные вопросы:

  • Какие функции предоставит нам этот новый язык / платформа?
  • Насколько сложно интегрироваться в наш рабочий процесс?
  • Как выглядит экосистема?

Возможности ReasonML

При написании программы ReasonML вы можете рассчитывать на большинство функций OCaml: краткий синтаксис, вывод типов и функциональные возможности, такие как каррирование и сопоставление с образцом. Кроме того, любой модуль ReasonML экспортируется как CommonJS, поэтому вы можете использовать свой обычный сборщик пакетов и публиковать или использовать код из npm обычным способом.

Система типов ReasonML надежна, что означает, что система типов обеспечивает семантику, гарантирующую, что наш код не приведет к ошибке во время выполнения. Для сравнения, это более мощная система типов, чем Typescript, но она по-прежнему достаточно прагматична, чтобы сохранять простоту и помогать вам в работе.

Интеграция с нашим рабочим процессом

Компилятор ReasonML выведет любой файл .re в исходной папке, которую мы укажем, по тому же пути в каталоге lib / js / src. Мы можем либо потребовать эти файлы напрямую, как любой другой модуль CommonJS, либо связать их вместе с webpack или другим аналогичным инструментом.

Компиляция ReasonML в модули CommonJS означает, что мы можем заменять нашу кодовую базу по модулю и переносить ее партиями. Вызов функций ReasonML из внешнего мира просто требует модуля и вызывает функцию из JS.

Использование функций JS (или любого значения времени выполнения из среды) из ReasonML требует немного больше работы. Bucklescript предоставляет для этого внешний механизм объявления. Мы обнаружили, что его довольно просто использовать; вы можете ссылаться на глобальные объекты, методы и даже интерполировать необработанный вывод, чтобы компилятор знал, что делать при переводе определенного токена в JS. Рекомендуемый подход в официальной документации на удивление прагматичен: при переводе кодовой базы JS начните с правильного синтаксиса, затем добавьте минимальное количество привязок, чтобы заставить его скомпилировать, и, наконец, определите правильные типы.

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

Изучение экосистемы также дало нам представление о том, насколько здоровым является сообщество, насколько быстро развивается проект и в каком жизненном цикле находится платформа.

  • Библиотеки: полная стандартная библиотека OCaml, несколько портов на стадии альфа / бета из других библиотек.
  • Система сборки: инструменты сборки Bucklescript, bs-loader webpack.
  • Управление пакетами: npm
  • Stack Overflow: девять вопросов (по данным на май 2017 г.)
  • Сообщения об ошибках: стиль вяза, очень дружелюбный
  • Поддержка редактора: Atom, VIM, Emacs, VSCode.
  • Каналы поддержки: Discord ReasonML

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

Мы думали, что поддержка редактора очень хорошая. Он использует OCaml-merlin, поэтому вы можете рассчитывать на хорошие подсказки типа оверлея, автозавершение кода, исчерпывающее сопоставление с образцом и многое другое прямо в вашем редакторе.

Stack Overflow просто пуст, но сообщество Discord довольно активное и дружелюбное, в нем регулярно участвуют очень уважаемые и уважаемые члены сообществ JS и React.

Документация Beyond ReasonML

Документация ReasonML хорошо объясняет синтаксис и основные функции, но в ней отсутствует обзор того, как работает платформа в целом. Что-нибудь, кроме простых примеров, вам придется искать в Google или спрашивать в Discord.

Мы обнаружили, что источники информации фрагментированы. Для решения большинства наших проблем нам пришлось использовать комбинацию различных документов: официальную документацию ReasonML для синтаксиса и инструментов, Руководство Bucklescript для JS-взаимодействий (внешние, модули по умолчанию и некоторый синтаксис, не охваченный документами ReasonML) и Руководство OCaml для всего, что не описано в двух предыдущих источниках.

Это не очевидно при первом чтении документации ReasonML и может быть немного неприятно осознавать. Однако это было дополнено такими замечательными инструментами, как ReasonML Tools и Reasonably Typed, которые помогли нам перейти от синтаксиса OCaml к ReasonML и обратно, а также преобразовать объявления типов Flow в ReasonML.

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

Минимальная конфигурация ReasonML: инструмент для перебора новых концепций

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

Созданный нами проект состоит из небольшой среды для игры с языком, которую вы можете найти здесь:

Https://github.com/rlucha/reasonml-minimal-config

Перед использованием инструмента вам потребуется установить платформу ReasonML. Для этого просто следуйте инструкциям из официальных Документов.

Https://facebook.github.io/reason/jsWorkflow.html

Вот что вы можете ожидать:

  • Небольшой статический http-сервер с использованием Browsersync
  • Объединение с webpack, включая stats.json для проверки любым анализатором пакетов
  • Просмотр файлов исходного кода и перезагрузка как пакета, так и http-сервера
  • Готовый к производству мини-файл с удалением мертвого кода

Заключение

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

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

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

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