ToolDeck

HTML to JSX

HTML を React JSX に変換 — class→className、スタイル文字列→オブジェクト

サンプルを試す

HTML 入力

JSX 出力

ローカルで実行 · シークレットの貼り付けも安全
JSX 出力がここに表示されます…

HTMLからJSXへの変換とは?

HTMLからJSXへの変換は、標準的なHTMLマークアップをReactコンポーネントがレンダリングできるJSX構文に変換するプロセスです。JSXはHTMLに似ていますが、JavaScriptの命名規則とルールに従います。classはclassNameに、forはhtmlForに変換され、インラインスタイル文字列はJavaScriptオブジェクトに置き換えられます。これらの変更が必要なのは、JSXがReact.createElement()の呼び出しにコンパイルされるためで、属性名はHTML属性名ではなくDOM APIのプロパティ名と一致する必要があります。

HTML属性とJSX propsのマッピングは、ReactのDOM要素ドキュメントで定義されています。Reactは複数単語の属性にcamelCaseを使用します(tabindexはtabIndex、maxlengthはmaxLengthになります)。これはJavaScriptの識別子にハイフンを含めることができないためです。<img>、<br>、<input>などの自己閉じタグはJSXでは末尾のスラッシュが必要です(<img />)。JSXはすべてのタグを明示的に閉じる必要があるXMLのルールに従うためです。

属性名の変換に加え、HTMLからJSXへの変換はインラインスタイルとコメントも処理します。HTMLのstyle属性はCSS構文を文字列として使用します(style="color: red; font-size: 14px")が、JSXはcamelCaseのプロパティ名を持つJavaScriptオブジェクトを必要とします(style={{ color: 'red', fontSize: '14px' }})。HTMLコメント(<!-- -->)はJSXの式コメント({/* */})になります。これらの変換を見落とすと、Reactアプリケーションで実行時エラーまたは予期しないレンダリングバグが発生します。

HTML to JSXコンバーターを使う理由

数十のHTML要素にわたって属性を手動で書き換え、スタイル文字列を変換するのは時間がかかりミスが起きやすい作業です。コンバーターはすべての変換を一度に処理し、任意のソースからHTMLを貼り付けて数秒で有効なJSXを取得できます。

即時変換
任意のHTMLスニペットを貼り付けるとJSX出力が即座に得られます。コンバーターはclass、for、style、イベントハンドラー、ブール属性、自己閉じタグを一括処理します。
🔒
プライバシー優先の処理
すべての変換はブラウザ内でローカルに実行されます。HTMLがページ外に送信されることはないため、内部コード、APIエンドポイント、機密コンテンツを含むマークアップも安全に変換できます。
📋
アカウント不要・設定不要
ページを開いてすぐに変換を開始できます。ログイン不要、npmパッケージのインストール不要、ビルドステップの設定不要。モダンブラウザを搭載した任意のデバイスで動作します。
🔧
属性の完全なカバレッジ
className、htmlFor、tabIndex、readOnly、autoCompleteを含む20以上の標準的なHTML→JSX属性マッピングをすべて変換します。onclickをonClickへのイベントハンドラーの名前変換にも対応しています。

HTML to JSXの活用例

フロントエンド開発者:テンプレートの移行
既存のHTMLページやコンポーネントをReactプロジェクトに移行する際、何百行ものコードからclassやfor属性を手動で探す代わりに、マークアップをコンバーターに貼り付けるだけで済みます。
バックエンドエンジニア:HTMLメールの埋め込み
メールテンプレートはプレーンHTMLで作成されます。ReactのAdmin画面やプレビューコンポーネント内でレンダリングする際、HTMLを有効なJSXに変換することでclassNameやstyleの構文エラーを回避できます。
DevOps:ダッシュボードウィジェットの変換
監視ダッシュボードではカスタムウィジェット用にHTMLスニペットがよく使われます。RetoolやカスタムAdmin画面のようなReactベースの社内ツールプラットフォームに統合する際、JSXに変換します。
QAエンジニア:バグ報告の再現
バグ報告に生のHTML出力が含まれている場合、JSXに変換することでReactのテストハーネスやStorybookのストーリーに素早くレンダリングし、視覚的な検査とデバッグが可能になります。
デザイナー:HTMLモックアップからのプロトタイピング
FigmaなどのデザインツールはHTML/CSSをエクスポートします。エクスポートされたマークアップをJSXに変換することで、属性を手動でクリーンアップせずにReactプロトタイプに直接組み込めます。
学習者:Reactの構文を学ぶ
HTML入力とJSX出力を並べて比較することで、どの属性がどのように変わるかを理解できます。変換を見ることで、ドキュメントを読むだけよりもReactの命名規則を覚えやすくなります。

HTML→JSX属性マッピングリファレンス

下の表はJSXに変換したときに変わるHTML属性の一覧です。ここに記載されていない属性(id、src、href、alt、placeholderなど)は、HTMLの名前がDOM APIのプロパティ名と既に一致しているため変更されません。

HTML属性JSX Prop備考
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 prop
camelCaseのプロパティ名(backgroundColor、fontSize、borderRadius)を持つJavaScriptオブジェクト。文字列値はクォートで囲みます。単位なしの数値(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はReactが使用するJavaScriptの構文拡張です。HTMLに似ていますが、React.createElement()の呼び出しにコンパイルされます。主な違いは、classがclassNameに、forがhtmlForになること、インラインスタイルにCSS文字列ではなくJavaScriptオブジェクトを使うこと、すべてのタグを明示的に閉じる必要があること(<img />などの空要素を含む)などです。JSXでは波括弧内にJavaScript式を埋め込むこともできます。
ReactはなぜclassではなくclassNameを使うのですか?
'class'はJavaScriptの予約キーワードです。JSXはJavaScriptの関数呼び出しにコンパイルされるため、'class'をprop名として使うと構文エラーになります。ReactがclassNameを選んだのは、JavaScriptがDOM要素のCSSクラスを読み書きするために既に使用しているDOM APIのプロパティ名(element.className)と一致するためです。
HTMLをJSXに手動で変換する必要がありますか?
いいえ。このツールのようなオンラインコンバーターを使うか、htmltojsx(npm)やhtml-react-parserなどのライブラリで自動化できます。大規模な移行にはcodemodやjscodeshift(コードベース全体を変換できるツール)も利用できます。手動変換は数行の小さなスニペットにのみ現実的です。
JSXでインラインスタイルはどのように扱われますか?
JSXでは、style属性はCSS文字列ではなくJavaScriptオブジェクトを受け取ります。プロパティ名はcamelCase(background-colorの代わりにbackgroundColor)を使用します。値はデフォルトで文字列ですが、lineHeight、opacity、zIndexなど一部の数値プロパティは単位なしの数値を受け付けます。style={{ color: 'red' }}の二重波括弧は特殊な構文ではありません。外側の波括弧はJSXの式で、内側の波括弧はJavaScriptのオブジェクトリテラルです。
JSXでHTMLコメントは使えますか?
いいえ。HTMLコメント(<!-- comment -->)はJSXでは無効です。代わりに波括弧で囲まれたJavaScriptブロックコメントを使用してください:{/* comment */}。このコンバーターは自動的に変換を処理します。JSXコメントはコンポーネントのreturnのトップレベルではなく、親要素の内側に記述する必要があります。
JSXでも同じ名前のままのHTML属性はどれですか?
ほとんどの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はJSXに変換できない外部ソースからの信頼できるHTMLをレンダリングする場合にのみ使用してください。