← На главную

Портировал DOCX: Java удобнее, но выбрал TypeScript ради MCPB, Bun сыроват

25.05.2026 18:49 · hackernews

Автор трижды собрал один и тот же плагин для DOCX — на Ruby, Java и TypeScript. DOCX в реальности это ZIP-архив с XML-файлами, поэтому код должен обрабатывать оба формата.

Первый прототип написали на Ruby: коллега знал язык, нужен был серверный вариант. Тут начались проблемы. Ruby — динамическая типизация, и ошибки вроде забытого .children в node.children[i] или пропущенного .each вылезали как «unexpected nil» в случайном месте. Библиотека rubyzip выдала редкий баг, из-за которого ломался DOCX-файл одного клиента — сообщить не могли, конфиденциальные данные. nokogiri криво форматировала XML: проблема была в нативной libxml2. Вдобавок интеграция статической типизации через Sorbet или RBS оказалась слишком геморройной.

Когда решили делать плагин для Claude Cowork, переписали всё на Java. Тот же код автор портировал за три дня с помощью ИИ. Java приятно удивила: стандартная библиотека без проблем жуёт ZIP и XML, никаких багов. Сборка через jpackage дала бинарник на 88 МБ — внутрь вшита JDK. Строгая типизация реально упрощала отладку.

Но потом автор узнал про MCPB — он даёт встроенный Node runtime в Claude Desktop. Приложение бы весило всего 1 МБ, только код. Переписали на TypeScript за полтора дня. Для ZIP взяли fflate — отработал нормально. C DOM-парсингом через xmldom тоже всё ок, кроме pretty-print: разработчики отказались его добавлять, мотивируя, что XML не для красоты. Засада: Claude plugin не поддерживает MCPB, только отдельный бинарник. Пришлось тащить Bun, который умеет упаковывать Node-приложения в один файл. Получилось ~70 МБ на Mac и ~120 МБ на Windows. Единственная проблема — Bun не даёт загрузить source maps в PostHog: платформа требует и минифицированный JS, и .js.map, а Bun выдаёт только бинарник и карту.

Плагин для Codex автор глянул, но там отставание. У Claude есть переменная CLAUDE_PLUGIN_ROOT, через которую легко запустить бинарник как MCP-сервер. У Codex такого нет — документация молчит, как выполнить бинарник из папки плагина.

Итог: Java победил по удобству работы с ZIP/XML и по типизации. Но автор остановился на TypeScript — если Claude или Codex начнут поддерживать MCPB в плагинах, размер бинарника упадёт на 99%. Bun пока сыроват, но работает стабильно на Mac и Windows.

Читать оригинал →