Создание кодовой базы Ahrefs с помощью Melange

В Ahrefs мы используем BuckleScript и ReasonML в производстве уже более двух лет. У нас уже есть кодовая база из десятков тысяч строк кода с несколькими веб-приложениями, интенсивно использующими данные, которые взаимодействуют с серверными службами, написанными на OKamlс помощью таких инструментов, как и т. д..

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

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

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

Интеграция ReScript с OCaml исторически была беспрепятственной, поскольку BuckleScript изначально начинался как новый бэкэнд для компилятора OCaml. Однако в последние месяцы появилось несколько признаков того, что ReScript хочет развиваться, чтобы стать отдельным языком:

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

Когда Антонио Монтейро Меланж анонсированфорк ReScript, но уделяя особое внимание сохранению совместимости с OCaml, мы решили попробовать его и посмотреть, как он может работать для нас.

ЧИТАТЬ   Для каких рынков стоит разработать мобильное приложение на iOS и Android?

В конце концов, эксперимент удался. Мы смогли создать все наши интерфейсные приложения с помощью 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”что хорошо для клиентского кода.
ЧИТАТЬ   Mailmodo: создавайте интерактивные электронные письма с помощью AMP, чтобы увеличить вовлеченность | Зона Мартех

Хотя в Melange есть что понравиться, есть и другие вещи, которые можно было бы улучшить.

  • Производительность сборки: мы уже знали, что производительность будет намного хуже, чем у ReScript, поскольку Melange использует Dune способами, для которых она не предназначена. В наших тестах сборки с Melange примерно на 1 порядок медленнее, чем ReScript.
  • Первоклассная поддержка Dune: если бы между Dune и Melange была более глубокая интеграция, мы могли бы исследовать такие функции, как общие библиотеки или общие правила между бэкэндом и интерфейсом. На сегодняшний день Dune ничего не знает о среде Melange, поэтому может выполнять базовые правила, но нет доступа к высокоуровневым, таким как library в Меланже.
  • Двойная цель: мы, наконец, видим стратегический риск в предложении Меланжа. Сейчас у него две цели: сохранить совместимость как с ReScript, так и с OCaml. Но мы не знаем, как долго эти цели будут достижимы. Если в какой-то момент ReScript решит полностью отказаться от компилятора OCaml, пользователи Melange больше не смогут использовать какие-либо обновления экосистемы ReScript.

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

Тем временем мы продолжим исследовать, насколько можно уменьшить ограничения Melange. Продолжение! 🚀

Source