ToolDeck

แปลง HTML เป็น JSX

แปลง HTML เป็น JSX สำหรับ React — class→className, style string→object

ลองตัวอย่าง

ข้อมูล HTML

ผลลัพธ์ JSX

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
ผลลัพธ์ JSX จะปรากฏที่นี่…

การแปลง HTML เป็น JSX คืออะไร?

การแปลง HTML เป็น JSX คือกระบวนการเปลี่ยน HTML markup มาตรฐานให้เป็น syntax ของ JSX ที่ React component สามารถแสดงผลได้ JSX มีลักษณะคล้าย HTML แต่ปฏิบัติตามข้อกำหนดการตั้งชื่อและกฎของ JavaScript แอตทริบิวต์อย่าง class จะกลายเป็น className, for จะกลายเป็น htmlFor และ style string แบบ inline จะถูกแทนที่ด้วย JavaScript object การเปลี่ยนแปลงเหล่านี้เป็นสิ่งจำเป็นเนื่องจาก JSX คอมไพล์เป็น React.createElement() call ซึ่งชื่อแอตทริบิวต์ต้องตรงกับชื่อ property ของ DOM API ไม่ใช่ชื่อแอตทริบิวต์ HTML

การแมประหว่างแอตทริบิวต์ HTML และ JSX prop ถูกกำหนดโดยเอกสาร DOM element ของ React React ใช้ camelCase สำหรับแอตทริบิวต์หลายคำ (tabindex กลายเป็น tabIndex, maxlength กลายเป็น maxLength) เพราะ JavaScript identifier ไม่สามารถมีขีดกลางได้ แท็กที่ปิดตัวเองอย่าง <img>, <br> และ <input> ต้องมี slash ต่อท้ายใน JSX (<img />) เนื่องจาก JSX ปฏิบัติตามกฎ XML ซึ่งทุกแท็กต้องปิดอย่างชัดเจน

htmlToJsxContent.whatBody3

ทำไมต้องใช้ตัวแปลง HTML เป็น JSX?

การเปลี่ยนชื่อแอตทริบิวต์และเขียน style string ใหม่ทีละองค์ประกอบใน HTML หลายสิบรายการนั้นช้าและเสี่ยงต่อความผิดพลาด ตัวแปลงจัดการการเปลี่ยนแปลงทั้งหมดพร้อมกัน ให้คุณวาง HTML จากแหล่งใดก็ได้และรับ JSX ที่ถูกต้องภายในไม่กี่วินาที

แปลงได้ทันที
วาง HTML snippet ใดก็ได้แล้วรับผลลัพธ์ JSX ทันที ตัวแปลงจัดการ class, for, style, event handler, boolean attribute และ self-closing tag ในครั้งเดียว
🔒
ประมวลผลโดยให้ความสำคัญกับความเป็นส่วนตัว
การแปลงทั้งหมดทำงานในเบราว์เซอร์ของคุณ HTML ของคุณไม่เคยออกจากหน้านี้ ดังนั้นจึงปลอดภัยที่จะแปลง markup ที่มีโค้ดภายใน, API endpoint หรือเนื้อหาที่เป็นความลับ
📋
ไม่ต้องสมัครสมาชิกหรือติดตั้ง
เปิดหน้าและเริ่มแปลงได้เลย ไม่ต้องเข้าสู่ระบบ ไม่ต้องติดตั้ง npm package ไม่ต้องตั้งค่า build step รองรับอุปกรณ์ทุกชนิดที่มีเบราว์เซอร์ทันสมัย
🔧
ครอบคลุมแอตทริบิวต์ทั้งหมด
แปลงการแมปแอตทริบิวต์ HTML เป็น JSX มาตรฐานทั้งหมด รวมถึง className, htmlFor, tabIndex, readOnly, autoComplete และอีกกว่า 20 รายการ รวมถึงการเปลี่ยนชื่อ event handler จาก onclick เป็น onClick

กรณีการใช้งานตัวแปลง HTML เป็น JSX

นักพัฒนา Frontend: ย้าย template
เมื่อย้ายหน้า HTML หรือ component ที่มีอยู่เข้าสู่ React project ให้วาง markup ลงในตัวแปลงแทนที่จะค้นหาแอตทริบิวต์ class และ for ด้วยตนเองในโค้ดหลายร้อยบรรทัด
นักพัฒนา Backend: ฝัง HTML email
Email template เขียนด้วย HTML ล้วนๆ เมื่อต้องแสดงผลใน React admin dashboard หรือ preview component ให้แปลง HTML เป็น JSX ที่ถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาด syntax ของ className และ style
DevOps: แปลง dashboard widget
Monitoring dashboard มักใช้ HTML snippet สำหรับ widget แบบกำหนดเอง แปลงสิ่งเหล่านี้เป็น JSX เมื่อรวมเข้ากับแพลตฟอร์มเครื่องมือภายในที่ใช้ React อย่าง Retool หรือ admin panel แบบกำหนดเอง
วิศวกร QA: จำลองรายงานข้อบกพร่อง
เมื่อรายงานข้อบกพร่องมี HTML output ดิบ ให้แปลงเป็น JSX เพื่อแสดงผลอย่างรวดเร็วใน React test harness หรือ Storybook story สำหรับการตรวจสอบและแก้ไขข้อผิดพลาดด้วยสายตา
นักออกแบบ: สร้าง prototype จาก HTML mockup
เครื่องมือออกแบบอย่าง Figma ส่งออก HTML/CSS แปลง markup ที่ส่งออกมาเป็น JSX เพื่อนำไปใช้ใน React prototype ได้โดยตรงโดยไม่ต้องแก้ไขแอตทริบิวต์ด้วยตนเอง
นักศึกษา: เรียนรู้ syntax ของ React
เปรียบเทียบ HTML input กับ JSX output แบบเคียงกันเพื่อทำความเข้าใจว่าแอตทริบิวต์ใดเปลี่ยนแปลงและทำไม การเห็นการเปลี่ยนแปลงทำให้จำข้อกำหนดการตั้งชื่อของ React ได้ง่ายกว่าการอ่านเอกสารอย่างเดียว

ตารางอ้างอิงการแมปแอตทริบิวต์ HTML เป็น JSX

ตารางด้านล่างแสดงแอตทริบิวต์ HTML ที่เปลี่ยนแปลงเมื่อแปลงเป็น JSX แอตทริบิวต์ที่ไม่ได้ระบุในตาราง (id, src, href, alt, placeholder ฯลฯ) จะไม่เปลี่ยนแปลง เนื่องจากชื่อ HTML ตรงกับชื่อ property ของ DOM API อยู่แล้ว

แอตทริบิวต์ HTMLJSX 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

การแปลง Inline Style: HTML กับ JSX

Inline style เป็นส่วนที่เสี่ยงต่อความผิดพลาดมากที่สุดในการแปลง HTML เป็น JSX เพราะทั้งรูปแบบค่าและชื่อ property ล้วนเปลี่ยนแปลง:

แอตทริบิวต์ style ใน HTML
String ของ CSS declaration ที่คั่นด้วย semicolon ชื่อ property ใช้ kebab-case (background-color, font-size, border-radius) ค่าทั้งหมดเป็น string รวมถึงค่าตัวเลขที่มีหน่วย
<div style="background-color: #fff;
  font-size: 14px;
  margin-top: 10px;">
JSX style prop
JavaScript object ที่มีชื่อ property เป็น camelCase (backgroundColor, fontSize, borderRadius) ค่า string ต้องอยู่ในเครื่องหมายคำพูด ค่าตัวเลขที่ไม่มีหน่วย (lineHeight, opacity, zIndex, flexGrow) สามารถเป็นตัวเลขล้วนได้
<div style={{
  backgroundColor: '#fff',
  fontSize: '14px',
  marginTop: 10
}}>

ตัวอย่างโค้ด

ตัวอย่างเหล่านี้แสดงวิธีแปลง HTML เป็น JSX โดยอัตโนมัติในภาษาและสภาพแวดล้อมต่างๆ แต่ละตัวอย่างครอบคลุมการเปลี่ยนชื่อแอตทริบิวต์ การแปลง style และการจัดการ self-closing tag

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 คือ syntax extension สำหรับ JavaScript ที่ใช้โดย React มีลักษณะคล้าย HTML แต่คอมไพล์เป็น React.createElement() call ความแตกต่างหลักคือ: class กลายเป็น className, for กลายเป็น htmlFor, inline style ใช้ JavaScript object แทน CSS string และทุกแท็กต้องปิดอย่างชัดเจน (รวมถึง void element อย่าง <img />) JSX ยังรองรับการฝัง JavaScript expression ไว้ในวงเล็บปีกกา
ทำไม React ใช้ className แทน class?
คำว่า 'class' เป็น reserved keyword ใน JavaScript เนื่องจาก JSX คอมไพล์เป็น JavaScript function call การใช้ 'class' เป็นชื่อ prop จะทำให้เกิด syntax error React เลือกใช้ 'className' เพราะตรงกับชื่อ property ของ DOM API (element.className) ที่ JavaScript ใช้อยู่แล้วสำหรับการอ่านและกำหนด CSS class บน DOM element
ต้องแปลง HTML เป็น JSX ด้วยตนเองหรือไม่?
ไม่จำเป็น คุณสามารถใช้ตัวแปลงออนไลน์อย่างเครื่องมือนี้ หรือทำอัตโนมัติด้วย library เช่น htmltojsx (npm) หรือ html-react-parser สำหรับการย้ายขนาดใหญ่ เครื่องมืออย่าง codemod หรือ jscodeshift สามารถแปลงทั้ง codebase ได้ การแปลงด้วยตนเองเหมาะสมเฉพาะกับ snippet ขนาดเล็กไม่กี่บรรทัดเท่านั้น
Inline style จัดการอย่างไรใน JSX?
ใน JSX แอตทริบิวต์ style รับ JavaScript object ไม่ใช่ CSS string ชื่อ property ใช้ camelCase (backgroundColor แทน background-color) ค่าเป็น string ตามค่าเริ่มต้น แต่ property ตัวเลขบางตัวอย่าง lineHeight, opacity และ zIndex รับตัวเลขล้วนโดยไม่มีหน่วย วงเล็บปีกกาคู่ใน style={{ color: 'red' }} ไม่ใช่ syntax พิเศษ: วงเล็บชั้นนอกคือ JSX expression และวงเล็บชั้นในคือ JavaScript object literal
สามารถใช้ HTML comment ใน JSX ได้หรือไม่?
htmlToJsxContent.a5
แอตทริบิวต์ HTML ใดที่ยังคงเหมือนเดิมใน JSX?
แอตทริบิวต์ HTML ส่วนใหญ่ยังคงชื่อเดิมใน JSX ตัวอย่างทั่วไปได้แก่ id, src, href, alt, type, name, value, placeholder, disabled, hidden และแอตทริบิวต์ data-* และ aria-* ทั้งหมด มีเพียงแอตทริบิวต์ที่ชื่อ HTML แตกต่างจากชื่อ property ของ DOM API เท่านั้นที่ต้องเปลี่ยน: class เป็น className, for เป็น htmlFor และแอตทริบิวต์หลายคำที่เปลี่ยนจาก lowercase เป็น camelCase
dangerouslySetInnerHTML เหมือนกับการแปลง HTML เป็น JSX หรือไม่?
ไม่ dangerouslySetInnerHTML ข้ามการ render ของ React และฉีด HTML ดิบเข้า DOM โดยตรง ซึ่งเสี่ยงต่อช่องโหว่ XSS การแปลง HTML เป็น JSX สร้าง React element จริงที่ผ่าน virtual DOM ของ React และปลอดภัยตามค่าเริ่มต้น ใช้การแปลง HTML เป็น JSX สำหรับ markup แบบ static ที่คุณควบคุม ใช้ dangerouslySetInnerHTML เฉพาะเมื่อจำเป็นต้องแสดงผล HTML ที่น่าเชื่อถือจากแหล่งภายนอกที่ไม่สามารถแปลงเป็น JSX ได้