Перейти к содержанию
Mercury
Русский
Дизайн книга
Меню
Русский

Философия: свои технологии, а не заимствованные

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

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.
  • Проверка примеров и генерируемый справочник пока запланированы. Они появятся на следующих этапах. На странице Стабильность перечислено то, что уже готово.