Mercury использует Hyperscript в браузере и mx для нативной сборки. Самостоятельная браузерная страница может работать на обычном JavaScript без сборки. Phoenix/LiveView — необязательная серверная интеграция, которую использует этот сайт документации.
Нативный набор инструментов без Node
mx — программа на Rust. Она устанавливает пакеты Mercury из статических зеркал, проверяет sha512 каждого пакета, записывает его в mx.sum и заново вычисляет хеши содержимого хранилища при вызове mx verify. Для этого не нужны npm и Node. Она запускает сервер приложения (mx dev) и выполняет сборку (mx build). Языковой сервер Mercury, Hyperscript LSAP, тоже написан на Rust и оформлен как крейт.
Причина выбора: нативный набор инструментов — это один исполняемый файл, который потребитель закрепляет контрольной суммой, и одно место вычисления каждого факта. Сообщение об отказе объясняет, в чём отказано: mx завершается с кодом 0 при успехе, 1 при отказе и 2 при ошибке использования. Нативный файл выполняет сборку без Node; архивный путь и образ запускают его напрямую. Планируемый корневой npm-пакет использует обёртку на Node для поиска и запуска платформенного файла, поэтому установленный через npm mx требует Node при каждом вызове. postinstall и загрузки бинарных файлов с GitHub в этом пути нет. См. готовность установки.
Без React
Mercury Hyperscript — собственный виртуальный DOM Mercury. Он следует семантике DOM, а не React. В коде используются class и for. Обработчик onInput срабатывает при каждом нажатии клавиши, а onChange — при событии change самого DOM. Атрибуты SVG сохраняют свои имена из SVG. Точки входа для совместимости нет: её удалили.
Причина выбора: компонент должен означать в браузере то же, что написано в исходном коде. Ни один опубликованный пакет Mercury не содержит сторонних зависимостей времени выполнения, а проверка отклоняет любой пакет, импорт, тип или peer-зависимость React до включения изменения в основную ветку.
На BEAM
Этот сайт документации работает на Phoenix и BEAM. В его серверной модели HEEx формирует читаемый HTML до выполнения клиентского JavaScript. Правило относится к сайту документации и интеграции Phoenix, а не к любой самостоятельной странице Mercury. Остров Mercury монтируется только там, где нужна интерактивность. Страница, которая лишь показывает содержимое, не открывает соединение с LiveView. Live Mercury связывает Mercury Hyperscript с LiveView: MercuryHook монтирует остров, а обновления LiveView поступают в него как props.
Причина выбора: на BEAM у каждого сайта своя конечная точка, поэтому этот сайт и другой сайт на том же узле могут отказывать независимо друг от друга. Страницу, уже сформированную сервером, человек или агент может читать без предварительного рендеринга на клиенте.
Каждый факт — из кода, который его вычисляет
Факт вычисляется один раз — кодом, который за него отвечает. Все остальные потребители читают его оттуда. На этом сайте:
- справочник генерируется из исходников каждого пакета;
- курс по mx цитирует вывод
--helpи--jsonсамого mx, а не воспроизводит его вручную; - каждый пример должен быть собран в бандл, выполнен или отклонён сборкой; ни один не остаётся без проверки.
Незавершённое прямо называется незавершённым. Поэтому на каждой странице указано, что уже опубликовано (Shipped), что доступно как предварительная версия (Preview), а что только запланировано (Planned).
Что реализовано сегодня
Это цели, и пока они достигнуты не полностью:
- Node ещё используется в инструментах. Модули
@fiberfx/*собираются и тестируются с помощью mx; pnpm остаётся только для приложений и инструментов вnode/. Скрипт, запускаемый черезmx run, всё ещё может вызывать Node, поэтому ключ его кеша включаетnode --version. - Проверка не допускает Node в серверную часть этого сайта. Команда
mix mercury.lms.scrubзавершается ошибкой при импорте выведенного из использования пакета в любом уроке или раздаваемом ресурсе; проверка приложения также завершается ошибкой, если оно вызываетnode,npm,npx,pnpmилиyarn. - Проверка примеров и генерируемый справочник пока запланированы. Они появятся на следующих этапах. На странице Стабильность перечислено то, что уже готово.