ToolDeck

HTML to JSX

Конвертуйте HTML у JSX для React — class→className, style рядки→об'єкти

Спробувати приклад

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, де кожен тег має бути явно закритий.

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-пропсПримітки
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, оскільки змінюються і формат значення, і назви властивостей:

HTML-атрибут style
Рядок CSS-оголошень, розділених крапкою з комою. Назви властивостей використовують kebab-case (background-color, font-size, border-radius). Значення завжди є рядками, включно з числовими значеннями з одиницями виміру.
<div style="background-color: #fff;
  font-size: 14px;
  margin-top: 10px;">
JSX-пропс style
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-коментарі (<!-- коментар -->) не є валідними у 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.