ToolDeck

HTML to JSX

Конвертируй HTML в JSX для React — class→className, строки стилей→объекты

Попробовать пример

HTML

JSX

Работает локально · Безопасно вставлять секреты
Результат JSX появится здесь…

Что такое конвертация HTML в JSX?

Конвертация HTML в JSX — это процесс преобразования стандартной HTML-разметки в JSX-синтаксис, который React-компоненты могут использовать для рендеринга. JSX выглядит похоже на HTML, но следует соглашениям и правилам JavaScript. Атрибуты вроде class становятся className, for становится htmlFor, а строки инлайн-стилей заменяются объектами JavaScript. Эти изменения обязательны, потому что JSX компилируется в вызовы React.createElement(), где имена атрибутов должны совпадать с именами свойств DOM API, а не с именами HTML-атрибутов.

Соответствие между HTML-атрибутами и JSX-пропсами определено в документации React по DOM-элементам. React использует camelCase для составных атрибутов (tabindex становится tabIndex, maxlength становится maxLength), потому что идентификаторы JavaScript не могут содержать дефисы. Самозакрывающиеся теги вроде <img>, <br> и <input> должны включать завершающий слэш в JSX (<img />), поскольку JSX следует правилам XML, где каждый тег должен быть явно закрыт.

Помимо переименования атрибутов, конвертация HTML в JSX также затрагивает инлайн-стили и комментарии. Атрибуты стилей HTML используют синтаксис CSS в виде строки (style="color: red; font-size: 14px"), тогда как JSX ожидает объект JavaScript с camelCase-именами свойств (style={{ color: 'red', fontSize: '14px' }}). HTML-комментарии (<!-- -->) превращаются в JSX-комментарии выражений ({/* */}). Пропуск любого из этих преобразований приводит к ошибкам во время выполнения или незаметным ошибкам рендеринга в React-приложениях.

Зачем использовать конвертер HTML в JSX?

Переименовывать атрибуты и переписывать строки стилей вручную в десятках HTML-элементов — это долго и ненадёжно. Конвертер выполняет все преобразования за один раз: вставляешь HTML из любого источника и получаешь корректный JSX за секунды.

Мгновенная конвертация
Вставь любой HTML-фрагмент и сразу получи JSX. Конвертер за один проход обрабатывает class, for, style, обработчики событий, булевы атрибуты и самозакрывающиеся теги.
🔒
Обработка на стороне клиента
Вся конвертация выполняется локально в браузере. HTML никогда не покидает страницу, поэтому можно безопасно конвертировать разметку с внутренним кодом, API-эндпоинтами или чувствительными данными.
📋
Без аккаунта и настройки
Открой страницу и начинай конвертировать. Без входа в систему, без npm-пакетов для установки, без настройки шага сборки. Работает на любом устройстве с современным браузером.
🔧
Полное покрытие атрибутов
Конвертирует все стандартные соответствия атрибутов HTML→JSX: className, htmlFor, tabIndex, readOnly, autoComplete и более 20 других. Также переименовывает обработчики событий: onclick → onClick.

Примеры использования HTML в JSX

Фронтенд-разработчик: перенос шаблонов
При переносе существующей HTML-страницы или компонента в React-проект вставь разметку в конвертер вместо того, чтобы вручную искать атрибуты class и for в сотнях строк кода.
Бэкенд-разработчик: встраивание HTML-писем
Шаблоны писем пишутся на чистом HTML. При рендеринге внутри React-дашборда администратора или компонента предпросмотра конвертируй HTML в корректный JSX, чтобы избежать ошибок синтаксиса className и style.
DevOps: конвертация виджетов дашборда
В дашбордах мониторинга часто используются HTML-фрагменты для пользовательских виджетов. Конвертируй их в JSX при интеграции в React-платформу для внутренних инструментов — например, Retool или кастомную админ-панель.
QA-инженер: воспроизведение баг-репортов
Когда в баг-репорте содержится сырой HTML-вывод, конвертируй его в JSX, чтобы быстро отрендерить в React-тест-харнессе или Storybook-истории для визуальной инспекции и отладки.
Дизайнер: прототипирование из HTML-макетов
Инструменты дизайна вроде Figma экспортируют HTML/CSS. Конвертируй экспортированную разметку в JSX, чтобы сразу вставить её в React-прототип без ручной правки атрибутов.
Студент: изучение синтаксиса React
Сравнивай HTML-ввод и JSX-вывод рядом, чтобы понять, какие атрибуты меняются и почему. Наблюдение за преобразованием помогает запомнить соглашения об именовании React лучше, чем чтение документации в одиночку.

Справочник по соответствию атрибутов HTML и JSX

В таблице ниже перечислены HTML-атрибуты, которые изменяются при конвертации в JSX. Атрибуты, не указанные здесь (id, src, href, alt, placeholder и др.), остаются без изменений, поскольку их HTML-имена уже совпадают с соответствующими именами свойств DOM API.

HTML-атрибутJSX-пропПримечания
classclassNameReserved word in JavaScript
forhtmlForReserved word in JavaScript
tabindextabIndexcamelCase convention
readonlyreadOnlycamelCase convention
maxlengthmaxLengthcamelCase convention
minlengthminLengthcamelCase convention
cellpaddingcellPaddingcamelCase convention
cellspacingcellSpacingcamelCase convention
rowspanrowSpancamelCase convention
colspancolSpancamelCase convention
enctypeencTypecamelCase convention
autocompleteautoCompletecamelCase convention
autofocusautoFocuscamelCase convention
autoplayautoPlaycamelCase convention
contenteditablecontentEditablecamelCase convention
crossorigincrossOrigincamelCase convention
novalidatenoValidatecamelCase convention
allowfullscreenallowFullScreencamelCase convention
spellcheckspellCheckcamelCase convention
http-equivhttpEquivHyphen removed, camelCase
onclickonClickEvent handler camelCase
onchangeonChangeEvent handler camelCase
onsubmitonSubmitEvent handler camelCase

Конвертация инлайн-стилей: HTML vs JSX

Инлайн-стили — наиболее сложная для конвертации часть HTML в JSX, поскольку меняются и формат значения, и имена свойств:

Атрибут style в HTML
Строка CSS-объявлений, разделённых точкой с запятой. Имена свойств используют kebab-case (background-color, font-size, border-radius). Значения всегда являются строками, включая числовые значения с единицами измерения.
<div style="background-color: #fff;
  font-size: 14px;
  margin-top: 10px;">
Проп style в JSX
Объект JavaScript с camelCase-именами свойств (backgroundColor, fontSize, borderRadius). Строковые значения берутся в кавычки. Безразмерные числовые значения (lineHeight, opacity, zIndex, flexGrow) могут быть обычными числами.
<div style={{
  backgroundColor: '#fff',
  fontSize: '14px',
  marginTop: 10
}}>

Примеры кода

Приведённые примеры демонстрируют программную конвертацию HTML в JSX на разных языках и в разных окружениях. Каждый пример охватывает переименование атрибутов, конвертацию стилей и обработку самозакрывающихся тегов.

JavaScript (DOM API)
// Simple attribute conversion using string replacement
function htmlToJsx(html) {
  return html
    .replace(/\bclass=/g, 'className=')
    .replace(/\bfor=/g, 'htmlFor=')
    .replace(/\btabindex=/g, 'tabIndex=')
    .replace(/<!--([\s\S]*?)-->/g, '{/*$1*/}')
}

htmlToJsx('<div class="box" tabindex="0"><!-- note --></div>')
// → '<div className="box" tabIndex="0">{/* note */}</div>'
JavaScript (html-react-parser)
import parse from 'html-react-parser'

// Parse HTML string into React elements (handles all JSX rules)
const element = parse('<div class="card"><img src="photo.jpg" alt="Photo"></div>')
// Returns: React.createElement('div', { className: 'card' },
//   React.createElement('img', { src: 'photo.jpg', alt: 'Photo' }))

// With custom element replacement
const options = {
  replace(domNode) {
    if (domNode.name === 'img') {
      return <OptimizedImage src={domNode.attribs.src} alt={domNode.attribs.alt} />
    }
  }
}
const custom = parse('<img src="photo.jpg" alt="Photo">', options)
Python (BeautifulSoup)
from bs4 import BeautifulSoup
import re

ATTR_MAP = {
    'class': 'className', 'for': 'htmlFor',
    'tabindex': 'tabIndex', 'readonly': 'readOnly',
    'maxlength': 'maxLength', 'autocomplete': 'autoComplete',
}

def html_to_jsx(html: str) -> str:
    """Convert HTML attribute names to JSX equivalents."""
    for html_attr, jsx_attr in ATTR_MAP.items():
        html = re.sub(rf'\b{html_attr}=', f'{jsx_attr}=', html)
    # Convert HTML comments to JSX comments
    html = re.sub(r'<!--(.*?)-->', r'{/*\1*/}', html)
    return html

print(html_to_jsx('<label for="email" class="field">Email</label>'))
# → '<label htmlFor="email" className="field">Email</label>'
Go
package main

import (
    "fmt"
    "strings"
)

var attrMap = map[string]string{
    "class=":    "className=",
    "for=":      "htmlFor=",
    "tabindex=": "tabIndex=",
    "readonly":  "readOnly",
}

func htmlToJSX(html string) string {
    result := html
    for old, new := range attrMap {
        result = strings.ReplaceAll(result, old, new)
    }
    // Convert comments
    result = strings.ReplaceAll(result, "<!--", "{/*")
    result = strings.ReplaceAll(result, "-->", "*/}")
    return result
}

func main() {
    html := `<div class="wrapper"><input readonly tabindex="1"></div>`
    fmt.Println(htmlToJSX(html))
    // → <div className="wrapper"><input readOnly tabIndex="1"></div>
}

Часто задаваемые вопросы

В чём разница между HTML и JSX?
JSX — это расширение синтаксиса JavaScript, используемое в React. Он выглядит как HTML, но компилируется в вызовы React.createElement(). Основные отличия: class становится className, for становится htmlFor, инлайн-стили используют объекты JavaScript вместо CSS-строк, и все теги должны быть явно закрыты (включая пустые элементы вроде <img />). JSX также позволяет встраивать JavaScript-выражения внутри фигурных скобок.
Почему React использует className вместо class?
Слово «class» является зарезервированным ключевым словом в JavaScript. Поскольку JSX компилируется в вызовы JavaScript-функций, использование «class» в качестве имени пропа вызовет синтаксическую ошибку. React выбрал «className», потому что это имя совпадает с именем свойства DOM API (element.className), которое JavaScript уже использует для чтения и установки CSS-классов на DOM-элементах.
Нужно ли конвертировать HTML в JSX вручную?
Нет. Можно использовать онлайн-конвертер вроде этого инструмента или автоматизировать процесс с помощью библиотек htmltojsx (npm) или html-react-parser. Для масштабных миграций такие инструменты, как codemod или jscodeshift, могут трансформировать целые кодовые базы. Ручная конвертация оправдана только для небольших фрагментов в несколько строк.
Как обрабатываются инлайн-стили в JSX?
В JSX атрибут style принимает объект JavaScript, а не CSS-строку. Имена свойств используют camelCase (backgroundColor вместо background-color). Значения по умолчанию являются строками, но определённые числовые свойства вроде lineHeight, opacity и zIndex принимают обычные числа без единиц измерения. Двойные фигурные скобки в style={{ color: 'red' }} — не особый синтаксис: внешние скобки — это JSX-выражение, а внутренние — литерал объекта JavaScript.
Можно ли использовать HTML-комментарии в JSX?
Нет. HTML-комментарии (<!-- comment -->) недопустимы в JSX. Используй вместо них блочные комментарии JavaScript, обёрнутые в фигурные скобки: {/* comment */}. Этот конвертер выполняет преобразование автоматически. Комментарии JSX должны находиться внутри родительского элемента, а не на верхнем уровне возврата компонента.
Какие HTML-атрибуты остаются без изменений в JSX?
Большинство HTML-атрибутов сохраняют свои оригинальные имена в JSX. Распространённые примеры: id, src, href, alt, type, name, value, placeholder, disabled, hidden, и все атрибуты data-* и aria-*. Изменяются только те атрибуты, HTML-имя которых отличается от имени свойства DOM API: class → className, for → htmlFor, и составные атрибуты, переходящие из нижнего регистра в camelCase.
Одно ли и то же dangerouslySetInnerHTML и конвертация HTML в JSX?
Нет. dangerouslySetInnerHTML обходит рендеринг React и внедряет сырой HTML непосредственно в DOM, что создаёт риск XSS-уязвимостей. Конвертация HTML в JSX создаёт настоящие React-элементы, которые проходят через виртуальный DOM React и безопасны по умолчанию. Используй конвертацию HTML в JSX для статической разметки, которую ты контролируешь. Используй dangerouslySetInnerHTML только тогда, когда необходимо отрендерить доверенный HTML из внешнего источника, который невозможно конвертировать в JSX.