В Ahrefs мы используем BuckleScript и ReasonML в производстве уже более двух лет. У нас уже есть кодовая база из десятков тысяч строк кода с несколькими веб-приложениями, интенсивно использующими данные, которые взаимодействуют с серверными службами, написанными на OKamlс помощью таких инструментов, как и т. д..
Учитывая наши инвестиции в эту технологию, мы внимательно следим за последними изменениями в Перескриптс его переименованием и переименованием, а также разделением с помощью проекта ReasonML, как описано в проекте Сообщение блога.
Мы в восторге от того, как ReScript объединяет возможности и облегчает начинающим разработчикам поиск документации в одном месте, продолжая при этом уделять большое внимание производительности и удобочитаемому выводу JavaScript.
С другой стороны, мы пытаемся понять среднесрочные и долгосрочные последствия этого изменения, особенно в отношении интеграции с экосистемой OCaml. И, что более важно, что эта разработка будет означать для производственных пользователей, таких как мы, которые полагаются на эту интеграцию.
Интеграция ReScript с OCaml исторически была беспрепятственной, поскольку BuckleScript изначально начинался как новый бэкэнд для компилятора OCaml. Однако в последние месяцы появилось несколько признаков того, что ReScript хочет развиваться, чтобы стать отдельным языком:
Таким образом, хотя ReScript официально не объявил, что они нарушат обратную совместимость с OCaml, сам факт того, что он работает со старой версией компилятора OCaml, создает для нас некоторые проблемы с точки зрения инструментов. Неопределенность будущего и скорость изменений увеличивают риск достижения высоких целей, которые мы ставим перед нашими командами и кодовой базой: мы хотим поделиться более кода между интерфейсом и сервером, не меньше.
Когда Антонио Монтейро Меланж анонсированфорк ReScript, но уделяя особое внимание сохранению совместимости с OCaml, мы решили попробовать его и посмотреть, как он может работать для нас.
В конце концов, эксперимент удался. Мы смогли создать все наши интерфейсные приложения с помощью Melange, сохранив при этом нашу существующую настройку сборки, которая теперь использует Webpack.
В ходе этого процесса нам пришлось изменить некоторые части кода. Теперь мы рассмотрим наиболее важные части процесса:
- Обновление в OCaml 4.12: самая важная часть — устаревание
Pervasives
модуль для использованияStdlib
. - Используйте ppxlib в наших ppx: нам нужно было обновить два ppx, которые мы используем во внешнем коде, до последней версии компилятора, bs-чувство-ppx и в помещении ppx для интернационализации.
- Регулировать
esy
: мы уже использовалиesy
чтобы перенести инструмент редактора в область среды разработки, поэтому нам просто нужно было убедиться,melange
также будет включен в настройки json. - Обновление до Reason 3.7.0: тоже довольно простое изменение, так как весь процесс автоматизирован с помощью
refmt
. В стороне мы столкнулись с рекой небольшой дефект с некоторыми аннотациями типов, которые мы смогли обойти. - «Поднимите» рабочую область dune в корень нашего синглтона: это, пожалуй, самое навязчивое изменение. Поскольку у нас есть общий код между бэкендом и внешним интерфейсом, а Dune нужен доступ ко всем разрешениям в своей рабочей области, нам пришлось «поднять» рабочую область Dune с
backend
файл в корне монорепозитория.
Этот эксперимент позволил нам испытать, что такой проект, как Melange, может предложить для нашего варианта использования. Вот некоторые вещи, которые мы могли бы использовать в кодовой базе, созданной с помощью Melange:
- Недавняя версия компилятора OCaml: в какой-то момент мы можем закрепить версию компилятора между бэкенд- и фронтенд-командами, что упростит обновления, поскольку они будут происходить на атомарном уровне.
- Общий инструмент редактора: общедоступный OCaml Плагин vscode отлично работает с Melange, а также со всеми другими интеграциями редактора OCaml. Наличие у серверной и клиентской команд одинаковой настройки редактора избавляет нас от большого объема работ по обслуживанию.
- Использование ppx из исходного кода: Melange позволяет использовать ppx из исходного кода, что также устраняет проблемы с предварительно скомпилированным ppx (например, эта проблема с недавним Компьютеры M1 Mac).
- Melange позволяет запускать все ppxs из одного исполняемого файлакоторый имеет некоторые хорошие преимущества производительности.
- Используйте Dune для генераторов файлов atd: извините, генераторы ReScript больше не задокументировано, но мы часто используем их для создания файлов atd. Возможность совместного использования правил Dune в бэкэнде и во внешнем интерфейсе облегчила бы нашу настройку.
- Доступ к инструментам документирования OCaml: Melange позволяет использовать существующие инструменты документирования, такие как одок.
- Асинхронный синтаксис: последняя версия Reason поддерживает синтаксис “let op”что хорошо для клиентского кода.
Хотя в Melange есть что понравиться, есть и другие вещи, которые можно было бы улучшить.
- Производительность сборки: мы уже знали, что производительность будет намного хуже, чем у ReScript, поскольку Melange использует Dune способами, для которых она не предназначена. В наших тестах сборки с Melange примерно на 1 порядок медленнее, чем ReScript.
- Первоклассная поддержка Dune: если бы между Dune и Melange была более глубокая интеграция, мы могли бы исследовать такие функции, как общие библиотеки или общие правила между бэкэндом и интерфейсом. На сегодняшний день Dune ничего не знает о среде Melange, поэтому может выполнять базовые правила, но нет доступа к высокоуровневым, таким как
library
в Меланже. - Двойная цель: мы, наконец, видим стратегический риск в предложении Меланжа. Сейчас у него две цели: сохранить совместимость как с ReScript, так и с OCaml. Но мы не знаем, как долго эти цели будут достижимы. Если в какой-то момент ReScript решит полностью отказаться от компилятора OCaml, пользователи Melange больше не смогут использовать какие-либо обновления экосистемы ReScript.
Со всей доступной информацией ответ таков: мы еще не знаем. 😄 Мы хотим продолжить изучение всех доступных вариантов и получить как можно больше информации, прежде чем совершать дальнейшие действия. Поэтому на данный момент мы обновляем кодовую базу до последних версий ReScript, но сохраняем функции, которые работают только в одном направлении. Например, мы еще не перевели нашу кодовую базу на синтаксис ReScript, что нет возможности перевести обратно в синтаксис Reason.
Тем временем мы продолжим исследовать, насколько можно уменьшить ограничения Melange. Продолжение! 🚀