ToolDeck

تحويل HTML إلى JSX

تحويل HTML إلى JSX لـ React — class→className، سلاسل الأنماط→كائنات

جرب مثالاً

HTML المدخل

مخرج JSX

يعمل محليًا · آمن للصق الأسرار
سيظهر مخرج JSX هنا…

ما هو تحويل HTML إلى JSX؟

تحويل HTML إلى JSX هو عملية تحويل ترميز HTML القياسي إلى صيغة JSX التي تستطيع مكونات React عرضها. تبدو JSX مشابهة لـ HTML، لكنها تتبع قواعد وتسميات JavaScript. تُعاد تسمية السمات؛ فـ class تصبح className، وfor تصبح htmlFor، وتُستبدَل سلاسل style النصية بكائنات JavaScript. هذه التغييرات ضرورية لأن JSX تُترجَم إلى استدعاءات React.createElement()، حيث يجب أن تطابق أسماء السمات أسماء خصائص DOM API لا أسماء سمات HTML.

التعيين بين سمات HTML وخصائص JSX محدَّد في توثيق عناصر DOM الخاصة بـ React. تستخدم React camelCase للسمات متعددة الكلمات (فـ tabindex تصبح tabIndex، وmaxlength تصبح maxLength)، لأن معرّفات JavaScript لا تقبل الواصلات. كما يجب أن تتضمن الوسوم ذاتية الإغلاق مثل <img> و<br> و<input> شرطة مائلة في النهاية ضمن JSX (مثل <img />) لأن JSX تتبع قواعد XML حيث يجب إغلاق كل وسم صراحةً.

إلى جانب إعادة تسمية السمات، يتعامل تحويل HTML إلى JSX مع الأنماط المضمّنة والتعليقات. تستخدم سمات style في HTML صيغة CSS كسلسلة نصية (مثل style="color: red; font-size: 14px")، بينما تتوقع JSX كائن JavaScript بأسماء خصائص camelCase (مثل style={{ color: 'red', fontSize: '14px' }})). وتُحوَّل تعليقات HTML (<!-- '-->') إلى تعليقات تعبيرات JSX ({/* */}). أي إغفال لهذه التحويلات يُنتج أخطاء وقت التشغيل أو أخطاء عرض صامتة في تطبيقات React.

لماذا تستخدم محوّل HTML إلى JSX؟

إعادة تسمية السمات يدويًا وإعادة كتابة سلاسل style عبر عشرات عناصر 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 أو لوحة تحكم مخصصة.
مهندس ضمان جودة: إعادة إنتاج تقارير الأخطاء
عندما يتضمن تقرير خطأ مخرجات 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 مقابل 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.