* Документация в стадии разработки
JavaScript TypeScript Xml — загрузчик .jsx и .tsx файлов для Node.js
Позволяет писать JTSX код и компилировать в нативный HTML
Цель разработки данного загрузчика в том, чтобы решить проблему комфортного использования JSX как шаблонизатора, без привязки к React
Транспиляция JTSX файлов происходит с помощью esbuild - надежный и очень быстрый транспайлер
Всего одна зависимость — esbuild
Для конвертации используется jsxFactory функция, которая преобразует теги, аттрибуты и дочерние элементы в стандартный HTML
Загрузчик позволяет расширить преобразования JTSX файлов через конфигурации и самостоятельно написанные функции
Так же загрузчик позволяет предотвратить кеширование при импорте компонентов, что дает возможность комфортно использовать перезагрузку страницы при изменениях и не перезапускать сервер, которые рендерит компонент
Если вы нашли ошибку или хотите предложить улучшения для загрузчика, создайте issue на github
О документации
Данная документация это проект внутри модуля, который можно запустить локально для изучения его работы. Исходники расположены в папке example
Вы можете запустить ее локально с помощью npm i и npm run start или с помощью nodemon для разработки npm run dev
ВАЖНО: Данный загрузчик это НЕ замена React, Vue и их производных. Если вам нужна реактивность и толстые клиенты, то лучше использовать соответствующие инструменты
Установка, использование, требования
Установка
npm install jtsx-loader
Использование
Проекты необходимо запускать через команду --import
node --import jtsx-loader ./server.js
Как отрендерить файл
Напишем простой компонент страницы index.jsx:
export default async ({ title }) => <html lang="ru">
<head>
<title>{title}</title>
</head>
<body>
<h1>{title}</h1>
<p>
Body content with array:
{[0, 1, 2].map(n => <code>{n}</code>)}
</p>
</body>
</html>;
Импортировать компонент через import(), ?reload параметр опционален, используется для предотвращения кеширования
const JSXComp = (await import('./index.jsx?reload')).default;Вызвать импортированный компонент как функцию передав объект данных и вывести результат в консоль
const rendered = await JSXComp({ data: renderCount });
console.log(rendered);Подробный пример с сохранением результат в файл здесь
Требования
Минимальная версия Node.js - 20.16.0
Базовые примеры
Нативные HTML аттрибуты
Допускается использование только нативных HTML аттрибутов
React аттрибуты и инлайн функции в тегах не поддерживаются по дизайну и никогда не должны использоваться
В случае использования React аттрибутов, как например className,
в консоль будет выведено предупреждение, а аттрибут отрендерится как есть
Другие отличия от стандартного JSX:
- Аттрибут
__escape: используется для вывода любого экранированного контента - Аттрибут
__raw: рендерит строку в содержимое тега как есть, например полезно для теговscriptиstyle - В JTSX файл передается объект
_jsxUtils, которая содержит в себе полезные утилиты. Вместо данного объекта можно передать свою любую функцию и использовать ее для расширения стандартного преобразования
Доступны все возможности JavaScript, которые используются в обычном JSX
ВАЖНО: весь код выполняется в среде Node.js, поэтому здесь нет браузерного DOM
Вычисления
{(1 + 1 + 2 * 2) / 3}Результат: 2
Стандартная библиотека Node.js
{Math.pow(9, 2)}Результат: 81
Тернарные выражения
1 > 2 ? <strong>Больше</strong> : 'Меньше'
Результат: Меньше
2 > 1 ? <strong>Больше</strong> : 'Меньше'
Результат: Больше
Манипуляции c массивами и рендеринг компонентов
Рендерит компоненты/теги с данными из массива
[0, 1, 2].map(num => <code>{num}</code>)Результат: 0 1 2
__escape
Вывод любого экранированного контента
<code __escape={'<div>escaped</div>'}></code>Результат: <div>escaped</div>
Запрос внутри компонента через fetch
const inlineRequest = await fetch(process.env.URL + '/api/200.json').then(r => r.json()).catch(e => e.message);
Вызывается при каждом рендеринге
Если вызывается внутренний сервер, то он должен быть запущен до запуска рендеринга
Ответ: {
"code": 200,
"message": "Success"
}Импортированный компонент
Импортированный на страницу Фрагмент components/Inner.tsx
Сколько раз был отрендерен компонент после рестарта сервера: 8
В этом блоке используется className, который преобразуется в class
Дочерние компоненты перереданные из родительского:
Дочерний компонент 0
Дочерний компонент 1
Пользовательские аттрибуты и их обработка
<input type="text" ac:custom="input" /> трансформируется в data-ac-custom="input"
Обработчик пишется в jtsx.config.js
Авторы
Референсы
https://esbuild.github.io/api/#jsx-factory