Descrição Overview Descripción
React foi criado por Jordan Walke no Facebook em 2011, apresentado internamente como FaxJS, e aberto ao público no JSConf de maio de 2013. A primeira reação da comunidade foi de ceticismo e, em muitos casos, rejeição aberta. JSX — a sintaxe que mistura HTML dentro de JavaScript — parecia uma heresia. A separação de HTML, CSS e JavaScript em arquivos diferentes era um princípio quase sagrado do desenvolvimento web desde os anos 2000. Colocar marcação dentro de funções JavaScript parecia um passo atrás de décadas de boas práticas.
A reviravolta foi rápida. Depois de poucos meses com React em produção, a maioria dos desenvolvedores concluiu que separar HTML de JS era uma separação de tecnologias — não de preocupações reais. Um componente de botão tem markup, estilo e comportamento, e ter tudo num único arquivo de componente tornava o código mais fácil de manter do que três arquivos separados em sincronia. JSX ganhou o debate pragmático. Hoje é raro encontrar um projeto React sem JSX como padrão, e o formato influenciou Solid.js, Preact, Qwik e outros frameworks.
O conversor desta página resolve o problema prático de migrar templates HTML existentes para JSX. As mudanças são sistemáticas: `class` vira `className` (porque `class` é palavra reservada em JavaScript), `for` em labels vira `htmlFor`, atributos multi-palavra como `tabindex` e `maxlength` viram camelCase (`tabIndex`, `maxLength`), estilos inline passam de string para objeto JavaScript, comentários HTML viram expressões JSX, e tags void como `<img>` recebem fechamento explícito `<img />` porque JSX segue regras de XML bem-formado.
React was created by Jordan Walke at Facebook in 2011, presented internally as FaxJS, and released to the public at JSConf in May 2013. The community's initial reaction was one of skepticism, and in many cases, open rejection. JSX — the syntax that mixes HTML inside JavaScript — felt like a heresy. Separating HTML, CSS, and JavaScript into different files had been a near-sacred principle of web development since the 2000s. Putting markup inside JavaScript functions felt like a step backward against decades of best practices.
The reversal was quick. After a few months with React in production, most developers concluded that separating HTML from JS was a separation of technologies — not of actual concerns. A button component has markup, style, and behavior, and having all of it in a single component file made the code easier to maintain than three separate files kept in sync. JSX won the pragmatic debate. Today it is rare to find a React project without JSX as the default, and the format has influenced Solid.js, Preact, Qwik, and other frameworks.
The converter on this page solves the practical problem of migrating existing HTML templates to JSX. The changes are systematic: `class` becomes `className` (because `class` is a reserved keyword in JavaScript), `for` in labels becomes `htmlFor`, multi-word attributes like `tabindex` and `maxlength` become camelCase (`tabIndex`, `maxLength`), inline styles go from a string to a JavaScript object, HTML comments become JSX expressions, and void tags like `<img>` get explicit self-closing `<img />` because JSX follows well-formed XML rules.
React fue creado por Jordan Walke en Facebook en 2011, presentado internamente como FaxJS y lanzado al público en JSConf en mayo de 2013. La reacción inicial de la comunidad fue de escepticismo y, en muchos casos, rechazo abierto. JSX — la sintaxis que mezcla HTML dentro de JavaScript — parecía una herejía. Separar HTML, CSS y JavaScript en archivos distintos era un principio casi sagrado del desarrollo web desde los años 2000. Poner marcado dentro de funciones JavaScript parecía un paso atrás respecto a décadas de buenas prácticas.
El cambio de opinión fue rápido. Tras unos pocos meses con React en producción, la mayoría de los desarrolladores concluyó que separar HTML de JS era una separación de tecnologías, no de responsabilidades reales. Un componente de botón tiene marcado, estilo y comportamiento, y tenerlo todo en un único archivo de componente hacía el código más fácil de mantener que tres archivos separados en sincronía. JSX ganó el debate pragmático. Hoy es raro encontrar un proyecto React sin JSX como estándar, y el formato ha influido en Solid.js, Preact, Qwik y otros frameworks.
El conversor de esta página resuelve el problema práctico de migrar plantillas HTML existentes a JSX. Los cambios son sistemáticos: `class` se convierte en `className` (porque `class` es una palabra reservada en JavaScript), `for` en labels pasa a `htmlFor`, los atributos con varias palabras como `tabindex` y `maxlength` pasan a camelCase (`tabIndex`, `maxLength`), los estilos inline pasan de cadena a objeto JavaScript, los comentarios HTML se convierten en expresiones JSX y las void tags como `<img>` reciben cierre explícito `<img />` porque JSX sigue las reglas de XML bien formado.
Detalhamento técnico
Por que o JSX pareceu uma heresia e por que venceu mesmo assim
- Antes do JSX, criar UIs com React puro exigia chamadas aninhadas a `React.createElement('div', {className: 'container'}, React.createElement('h1', null, 'Título'))`. Era funcionalmente correto, mas completamente ilegível para qualquer coisa além de um componente trivial. O JSX foi criado como açúcar sintático que o Babel compila para essas chamadas — mas a DX (experiência do desenvolvedor) é radicalmente diferente.
- Vue, Angular e Svelte tomaram caminhos diferentes: Vue usa templates em HTML com diretivas (`v-if`, `v-for`), Angular usa templates com sintaxe própria e Svelte compila em JavaScript puro. JSX é a abordagem mais próxima de 'JavaScript puro com extensão sintática' — o que tanto atrai desenvolvedores JS quanto incomoda designers acostumados com HTML.
- A reinterpretação de 'separação de responsabilidades' foi o argumento que virou o debate. O princípio original (HTML/CSS/JS em arquivos separados) separava tecnologias, não preocupações de produto. Um componente de modal tem lógica, estilo e markup que mudam juntos — separá-los em arquivos diferentes só cria acoplamento à distância.
- JSX não é exclusivo do React. Solid.js usa JSX mas compila diferente (sem Virtual DOM). Preact é uma alternativa ao React com JSX compatível e 3 KB de tamanho. Qwik usa JSX com serialização de estado para hidratação parcial. Stencil.js usa JSX para web components nativos.
- O Babel transforma JSX em JavaScript antes de qualquer execução. O compilador moderno do React (React 17+) não requer mais o import explícito de React em cada arquivo JSX — o transform é automático. TypeScript também suporta JSX nativamente com arquivos `.tsx`.
As regras de conversão HTML → JSX: um mapeamento sistemático
- `class` → `className`: `class` é uma palavra reservada em JavaScript usada para definir classes ES6. Em JSX, o atributo correspondente é `className`. Esquecer essa conversão é o erro mais comum ao migrar templates.
- `for` → `htmlFor`: O atributo `for` em `<label>` também é palavra reservada (loop `for` do JavaScript). Em JSX é `htmlFor`. Da mesma forma, `<input type="text">` sem atributos problemáticos não muda.
- Atributos camelCase: `tabindex` → `tabIndex`, `maxlength` → `maxLength`, `readonly` → `readOnly`, `autofocus` → `autoFocus`, `crossorigin` → `crossOrigin`, `enctype` → `encType`. A regra é: se o atributo HTML tem hífen ou é multi-palavra com casing inconsistente, em JSX usa-se camelCase.
- Estilos inline: `style="color: red; font-size: 16px"` → `style={{ color: 'red', fontSize: '16px' }}`. Propriedades CSS com hífen viram camelCase. Os valores são strings (exceto números sem unidade, como `zIndex: 10`). Note as chaves duplas: a externa `{}` é a interpolação JSX, a interna `{}` é o objeto JavaScript.
- Tags void com fechamento explícito: `<img>`, `<input>`, `<br>`, `<hr>`, `<meta>`, `<link>` em HTML5 não precisam de fechamento. Em JSX, que segue regras de XML bem-formado, todas as tags devem ser fechadas: `<img />`, `<input />`, `<br />`. Sem isso, o Babel lança erro de parse.
Technical deep dive
Why JSX felt like a heresy and why it won anyway
- Before JSX, building UIs with pure React required nested calls to `React.createElement('div', {className: 'container'}, React.createElement('h1', null, 'Title'))`. Functionally correct, but completely unreadable for anything beyond a trivial component. JSX was created as syntactic sugar that Babel compiles into those calls — but the DX (developer experience) is radically different.
- Vue, Angular, and Svelte took different paths: Vue uses HTML-like templates with directives (`v-if`, `v-for`), Angular uses templates with its own syntax, and Svelte compiles to plain JavaScript. JSX is the approach closest to 'pure JavaScript with a syntactic extension' — which both attracts JS developers and unsettles designers accustomed to plain HTML.
- The reframing of 'separation of concerns' was the argument that turned the debate. The original principle (HTML/CSS/JS in separate files) separated technologies, not product concerns. A modal component has logic, style, and markup that change together — separating them into different files only creates long-distance coupling.
- JSX is not exclusive to React. Solid.js uses JSX but compiles differently (no Virtual DOM). Preact is a React alternative with compatible JSX at 3 KB in size. Qwik uses JSX with state serialization for partial hydration. Stencil.js uses JSX for native web components.
- Babel transforms JSX to JavaScript before any execution. The modern React compiler (React 17+) no longer requires an explicit React import in every JSX file — the transform is automatic. TypeScript also natively supports JSX with `.tsx` files.
The HTML → JSX conversion rules: a systematic mapping
- `class` → `className`: `class` is a reserved keyword in JavaScript used to define ES6 classes. In JSX, the corresponding attribute is `className`. Forgetting this conversion is the most common mistake when migrating templates.
- `for` → `htmlFor`: The `for` attribute in `<label>` is also a reserved word (JavaScript's `for` loop). In JSX it is `htmlFor`. Similarly, `<input type="text">` without problematic attributes does not change.
- camelCase attributes: `tabindex` → `tabIndex`, `maxlength` → `maxLength`, `readonly` → `readOnly`, `autofocus` → `autoFocus`, `crossorigin` → `crossOrigin`, `enctype` → `encType`. The rule: if the HTML attribute has a hyphen or is a multi-word attribute with inconsistent casing, JSX uses camelCase.
- Inline styles: `style="color: red; font-size: 16px"` → `style={{ color: 'red', fontSize: '16px' }}`. CSS properties with hyphens become camelCase. Values are strings (except unitless numbers, like `zIndex: 10`). Note the double braces: the outer `{}` is JSX interpolation, the inner `{}` is the JavaScript object.
- Void tags with explicit closing: `<img>`, `<input>`, `<br>`, `<hr>`, `<meta>`, `<link>` in HTML5 do not need closing. In JSX, which follows well-formed XML rules, all tags must be closed: `<img />`, `<input />`, `<br />`. Without this, Babel throws a parse error.
Detalle técnico
Por qué JSX pareció una herejía y por qué ganó de todas formas
- Antes de JSX, construir interfaces con React puro requería llamadas anidadas a `React.createElement('div', {className: 'container'}, React.createElement('h1', null, 'Título'))`. Funcionalmente correcto, pero completamente ilegible para cualquier cosa más allá de un componente trivial. JSX fue creado como azúcar sintáctico que Babel compila en esas llamadas, pero la DX (experiencia del desarrollador) es radicalmente diferente.
- Vue, Angular y Svelte tomaron caminos distintos: Vue usa plantillas similares a HTML con directivas (`v-if`, `v-for`), Angular usa plantillas con su propia sintaxis y Svelte compila a JavaScript puro. JSX es el enfoque más cercano a 'JavaScript puro con extensión sintáctica', lo que tanto atrae a los desarrolladores JS como incomoda a los diseñadores acostumbrados al HTML plano.
- La reinterpretación de la 'separación de responsabilidades' fue el argumento que cambió el debate. El principio original (HTML/CSS/JS en archivos separados) separaba tecnologías, no responsabilidades de producto. Un componente de modal tiene lógica, estilo y marcado que cambian juntos: separarlos en archivos distintos solo crea acoplamiento a distancia.
- JSX no es exclusivo de React. Solid.js usa JSX pero compila de forma diferente (sin Virtual DOM). Preact es una alternativa a React con JSX compatible y solo 3 KB de tamaño. Qwik usa JSX con serialización de estado para hidratación parcial. Stencil.js usa JSX para web components nativos.
- Babel transforma JSX a JavaScript antes de cualquier ejecución. El compilador moderno de React (React 17+) ya no requiere importar React explícitamente en cada archivo JSX: la transformación es automática. TypeScript también admite JSX de forma nativa con archivos `.tsx`.
Las reglas de conversión HTML → JSX: un mapeo sistemático
- `class` → `className`: `class` es una palabra reservada en JavaScript para definir clases ES6. En JSX el atributo correspondiente es `className`. Olvidar esta conversión es el error más común al migrar plantillas.
- `for` → `htmlFor`: El atributo `for` en `<label>` también es una palabra reservada (el bucle `for` de JavaScript). En JSX es `htmlFor`. Del mismo modo, `<input type="text">` sin atributos problemáticos no cambia.
- Atributos en camelCase: `tabindex` → `tabIndex`, `maxlength` → `maxLength`, `readonly` → `readOnly`, `autofocus` → `autoFocus`, `crossorigin` → `crossOrigin`, `enctype` → `encType`. La regla: si el atributo HTML tiene guion o es una palabra compuesta con casing inconsistente, en JSX se usa camelCase.
- Estilos inline: `style="color: red; font-size: 16px"` → `style={{ color: 'red', fontSize: '16px' }}`. Las propiedades CSS con guion pasan a camelCase. Los valores son cadenas (salvo los números sin unidad, como `zIndex: 10`). Nota las llaves dobles: la exterior `{}` es la interpolación JSX, la interior `{}` es el objeto JavaScript.
- Void tags con cierre explícito: `<img>`, `<input>`, `<br>`, `<hr>`, `<meta>`, `<link>` en HTML5 no necesitan cierre. En JSX, que sigue las reglas de XML bien formado, todas las etiquetas deben cerrarse: `<img />`, `<input />`, `<br />`. Sin esto, Babel lanza un error de parseo.
Exemplo de Código Code Snippets Fragmentos de Código
// ATRIBUTOS: HTML → JSX
// class="container" → className="container"
// for="input-id" → htmlFor="input-id"
// tabindex="0" → tabIndex={0}
// maxlength="100" → maxLength={100}
// readonly → readOnly
// autofocus → autoFocus
// ESTILOS INLINE:
// style="color:red" → style={{ color: 'red' }}
// style="font-size:16px" → style={{ fontSize: '16px' }}
// style="background-color" → style={{ backgroundColor: '...' }}
// COMENTÁRIOS:
// <!-- comentário HTML --> → {/* comentário JSX */}
// TAGS VOID:
// <img src="x.png"> → <img src="x.png" />
// <input type="text"> → <input type="text" />
// <br> → <br />
// HTML original (Bootstrap card)
// <div class="card" style="width: 18rem;">
// <img src="img.jpg" class="card-img-top" alt="Descrição">
// <div class="card-body">
// <h5 class="card-title">Título do Card</h5>
// <p class="card-text">Texto descritivo.</p>
// <a href="#" class="btn btn-primary">Ação</a>
// </div>
// </div>
function Card({ imagem, alt, titulo, texto, href }) {
return (
<div className="card" style={{ width: '18rem' }}>
<img src={imagem} className="card-img-top" alt={alt} />
<div className="card-body">
<h5 className="card-title">{titulo}</h5>
<p className="card-text">{texto}</p>
<a href={href} className="btn btn-primary">
Ação
</a>
</div>
</div>
);
}
// ATTRIBUTES: HTML → JSX
// class="container" → className="container"
// for="input-id" → htmlFor="input-id"
// tabindex="0" → tabIndex={0}
// maxlength="100" → maxLength={100}
// readonly → readOnly
// autofocus → autoFocus
// INLINE STYLES:
// style="color:red" → style={{ color: 'red' }}
// style="font-size:16px" → style={{ fontSize: '16px' }}
// style="background-color" → style={{ backgroundColor: '...' }}
// COMMENTS:
// <!-- HTML comment --> → {/* JSX comment */}
// VOID TAGS:
// <img src="x.png"> → <img src="x.png" />
// <input type="text"> → <input type="text" />
// <br> → <br />
// Original HTML (Bootstrap card)
// <div class="card" style="width: 18rem;">
// <img src="img.jpg" class="card-img-top" alt="Description">
// <div class="card-body">
// <h5 class="card-title">Card Title</h5>
// <p class="card-text">Descriptive text.</p>
// <a href="#" class="btn btn-primary">Action</a>
// </div>
// </div>
function Card({ image, alt, title, text, href }) {
return (
<div className="card" style={{ width: '18rem' }}>
<img src={image} className="card-img-top" alt={alt} />
<div className="card-body">
<h5 className="card-title">{title}</h5>
<p className="card-text">{text}</p>
<a href={href} className="btn btn-primary">
Action
</a>
</div>
</div>
);
}
// ATRIBUTOS: HTML → JSX
// class="container" → className="container"
// for="input-id" → htmlFor="input-id"
// tabindex="0" → tabIndex={0}
// maxlength="100" → maxLength={100}
// readonly → readOnly
// autofocus → autoFocus
// ESTILOS INLINE:
// style="color:red" → style={{ color: 'red' }}
// style="font-size:16px" → style={{ fontSize: '16px' }}
// style="background-color" → style={{ backgroundColor: '...' }}
// COMENTARIOS:
// <!-- comentario HTML --> → {/* comentario JSX */}
// VOID TAGS:
// <img src="x.png"> → <img src="x.png" />
// <input type="text"> → <input type="text" />
// <br> → <br />
// HTML original (Bootstrap card)
// <div class="card" style="width: 18rem;">
// <img src="img.jpg" class="card-img-top" alt="Descripción">
// <div class="card-body">
// <h5 class="card-title">Título del Card</h5>
// <p class="card-text">Texto descriptivo.</p>
// <a href="#" class="btn btn-primary">Acción</a>
// </div>
// </div>
function Card({ imagen, alt, titulo, texto, href }) {
return (
<div className="card" style={{ width: '18rem' }}>
<img src={imagen} className="card-img-top" alt={alt} />
<div className="card-body">
<h5 className="card-title">{titulo}</h5>
<p className="card-text">{texto}</p>
<a href={href} className="btn btn-primary">
Acción
</a>
</div>
</div>
);
}
Exemplo Sample Ejemplo
<div class="box" tabindex="0">
<img src="/a.png" alt="">
<!-- ok -->
</div>
Perguntas frequentes FAQ Preguntas frecuentes
Para que serve esta ferramenta?
What is this tool for?
¿Para qué sirve esta herramienta?
Ela roda 100% no seu navegador: útil para validar, formatar ou converter dados no dia a dia de desenvolvimento.
It runs fully in your browser: useful to validate, format, or convert data in everyday development.
Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.
Meus dados são enviados a algum servidor?
Are my inputs sent to a server?
¿Se envían mis datos a algún servidor?
O processamento é feito localmente via JavaScript. Não armazenamos o conteúdo que você cola nas caixas de texto.
Processing happens locally with JavaScript. We do not store what you paste into the text areas.
El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.
Posso usar em produção ou para dados reais?
Can I use this for real production data?
¿Puedo usarlo con datos reales en producción?
Use por sua conta e risco. Para segredos (senhas, tokens), prefira ambientes controlados e políticas da sua empresa. E lembre sempre de revisar os conteúdos gerados. Nunca confie cegamente nas coisas que vê na internet.
Use at your own risk. For secrets (passwords, tokens), prefer controlled environments and your company policies. And always review the generated contents. Never trust blindly things you see on the internet.
Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.