Конвертація 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, де кожен тег має бути явно закритий.
htmlToJsxContent.whatBody3
Навіщо використовувати конвертер HTML у JSX?
Ручне перейменування атрибутів та переписування рядків стилів у десятках HTML-елементів — це повільно та схильно до помилок. Конвертер виконує всі перетворення одночасно: вставте HTML з будь-якого джерела та отримайте валідний JSX за секунди.
⚡
Миттєва конвертація
Вставте будь-який HTML-фрагмент і отримайте JSX-вихід негайно. Конвертер обробляє class, for, style, обробники подій, булеві атрибути та самозакривні теги за один прохід.
🔒
Обробка з пріоритетом конфіденційності
Вся конвертація виконується локально у вашому браузері. Ваш HTML ніколи не покидає сторінку, тому ви можете безпечно конвертувати розмітку, що містить внутрішній код, API-ендпоінти або конфіденційний вміст.
📋
Без акаунту та налаштувань
Відкрийте сторінку та починайте конвертувати. Реєстрація не потрібна, npm-пакети встановлювати не потрібно, кроки збірки налаштовувати не потрібно. Працює на будь-якому пристрої з сучасним браузером.
🔧
Повне покриття атрибутів
Конвертує всі стандартні відповідності атрибутів HTML→JSX, включно з className, htmlFor, tabIndex, readOnly, autoComplete та понад 20 іншими. Також обробляє перейменування обробників подій з onclick на onClick.
Сценарії використання HTML to JSX
Frontend-розробник: міграція шаблонів
При перенесенні існуючої HTML-сторінки або компонента у React-проект вставте розмітку у конвертер замість того, щоб вручну шукати атрибути class та for у сотнях рядків коду.
Backend-інженер: вбудовування 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-пропс
Примітки
class
className
Reserved word in JavaScript
for
htmlFor
Reserved word in JavaScript
tabindex
tabIndex
camelCase convention
readonly
readOnly
camelCase convention
maxlength
maxLength
camelCase convention
minlength
minLength
camelCase convention
cellpadding
cellPadding
camelCase convention
cellspacing
cellSpacing
camelCase convention
rowspan
rowSpan
camelCase convention
colspan
colSpan
camelCase convention
enctype
encType
camelCase convention
autocomplete
autoComplete
camelCase convention
autofocus
autoFocus
camelCase convention
autoplay
autoPlay
camelCase convention
contenteditable
contentEditable
camelCase convention
crossorigin
crossOrigin
camelCase convention
novalidate
noValidate
camelCase convention
allowfullscreen
allowFullScreen
camelCase convention
spellcheck
spellCheck
camelCase convention
http-equiv
httpEquiv
Hyphen removed, camelCase
onclick
onClick
Event handler camelCase
onchange
onChange
Event handler camelCase
onsubmit
onSubmit
Event handler camelCase
Конвертація вбудованих стилів: HTML vs JSX
Вбудовані стилі — найбільш схильна до помилок частина конвертації HTML у JSX, оскільки змінюються і формат значення, і назви властивостей:
HTML-атрибут style
Рядок CSS-оголошень, розділених крапкою з комою. Назви властивостей використовують kebab-case (background-color, font-size, border-radius). Значення завжди є рядками, включно з числовими значеннями з одиницями виміру.
JavaScript-об'єкт із назвами властивостей у camelCase (backgroundColor, fontSize, borderRadius). Рядкові значення беруться у лапки. Числові значення без одиниць (lineHeight, opacity, zIndex, flexGrow) можуть бути звичайними числами.
Ці приклади показують, як конвертувати HTML у JSX програмно на різних мовах та у різних середовищах. Кожен охоплює перейменування атрибутів, конвертацію стилів та обробку самозакривних тегів.
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-коментарі (<!-- коментар -->) не є валідними у JSX. Натомість використовуйте блокові коментарі JavaScript у фігурних дужках: {/* коментар */}. Цей конвертер виконує перетворення автоматично. Коментарі 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.