Logo

dev-resources.site

for different kinds of informations.

Imagining React Without JSX: A Developer's Worst Nightmare

Published at
10/9/2024
Categories
jsx
react
babel
Author
vedesh_kvs_e874361c1518
Categories
3 categories in total
jsx
open
react
open
babel
open
Author
23 person written this
vedesh_kvs_e874361c1518
open
Imagining React Without JSX: A Developer's Worst Nightmare

Imagining React Without JSX: A Developer's Worst Nightmare

React has revolutionized how we build user interfaces with JavaScript, simplifying the once-tedious process of managing UI components. But what if we lived in a world without JSX? Imagine coding React applications using only React.createElement() instead of the clean and intuitive JSX syntax. Let’s take a journey through this nightmare and explore why JSX is a lifesaver for developers.

React Without JSX: Enter React.createElement()

To understand the value of JSX, let’s first create a simple "Hello World" example using React.createElement():

const heading = React.createElement("h1", {}, "Hello World From React!");
Enter fullscreen mode Exit fullscreen mode

Here, React.createElement() takes three arguments:

  1. The tag you want to create ("h1").
  2. An object representing attributes or properties for that tag, such as {id: "heading"}.
  3. The content to place inside the tag ("Hello World From React!").

This creates a React element, but there’s more to it. React needs a root to render its elements in the DOM. For that, we need ReactDOM:

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(heading);
Enter fullscreen mode Exit fullscreen mode

This works, but it’s not exactly elegant. Let’s not even get started on writing everything inside a <script> tag! Instead, we can create a separate app.js file, which is more maintainable.

Nested HTML with React.createElement()

Now, let’s kick it up a notch and create a nested HTML structure. For example, adding an h1 inside a div:

const parent = React.createElement(
  "div",
  { id: "parent" },
  React.createElement(
    "div",
    { id: "child" },
    React.createElement("h1", {}, "I am an H1 Tag")
  )
);
Enter fullscreen mode Exit fullscreen mode

Do you see the issue already? This approach gets cumbersome fast, especially for more complex components. Imagine creating multiple nested tags or siblings. Here’s how you’d handle siblings:

const parent = React.createElement(
  "div",
  { id: "parent" },
  React.createElement(
    "div",
    { id: "child" },
    [
      heading,
      React.createElement("h1", {}, "I am an H1 Tag")
    ]
  )
);
Enter fullscreen mode Exit fullscreen mode

Now, throw in the key prop React requires for list items, and it quickly turns into a developer's worst nightmare. Error messages like "Each child in a list should have a unique key prop" can make your code even harder to manage.

The JSX Revolution

So, what’s the solution? Enter JSX—a game-changer introduced by Facebook’s React team. JSX is not just a shortcut for writing HTML in JavaScript; it’s a syntax extension that allows you to write your UI components declaratively.

Goodbye React.createElement(), Hello JSX

Let’s rewrite the same nested structure using JSX:

const jsxheading = <h1 id="heading">Namaste React using JSX</h1>;
Enter fullscreen mode Exit fullscreen mode

Look at how clean and readable this is compared to the clunky React.createElement() method. JSX allows us to focus on building components rather than wrangling with verbose syntax.

Here’s how it looks in action:

import React from "react";
import ReactDOM from "react-dom/client";

const jsxheading = <h1 id="heading">Namaste React using JSX</h1>;

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(jsxheading);
Enter fullscreen mode Exit fullscreen mode

What JSX Does Under the Hood

But wait—browsers don’t understand JSX, right? That’s correct! JSX is not valid HTML or JavaScript. It’s simply syntactic sugar that, during the build process, is converted by Babel into React.createElement() calls. For example:

const jsxheading = <h1 id="heading">Namaste React using JSX</h1>;
Enter fullscreen mode Exit fullscreen mode

gets transformed into:

const jsxheading = React.createElement("h1", { id: "heading" }, "Namaste React using JSX");
Enter fullscreen mode Exit fullscreen mode

The result is the same, but JSX makes the code infinitely more readable and maintainable for humans.

Babel the transpiler:

Babel transpiles JSX into browser-understandable JavaScript code. Here's a brief explanation of how it works:

  1. JSX Syntax: JSX is a syntax extension for JavaScript that allows you to write HTML-like code within JavaScript. Browsers, however, can't directly understand JSX because it's not valid JavaScript.

  2. Parsing: Babel parses the JSX code into an Abstract Syntax Tree (AST), which is a tree representation of the structure of the code. It breaks down JSX tags and expressions into nodes of the tree.

  3. Transformation: Babel transforms JSX tags into JavaScript function calls. For example, <div>Hello</div> becomes React.createElement('div', null, 'Hello'). This function React.createElement creates a virtual DOM element.

  4. Output: The transformed JSX is now valid JavaScript, which browsers can execute. The output JavaScript file contains these React.createElement calls instead of JSX, and the browser renders the appropriate DOM elements when this JavaScript runs.

This process allows you to write JSX in your React components, but Babel ensures that the browser only sees standard JavaScript it can execute.

Why JSX Is a Lifesaver

The most expensive operation on a webpage is manipulating the DOM. React’s philosophy is all about minimizing these costly DOM updates using a virtual DOM, and JSX makes this process much easier for developers to handle.

JSX simplifies code, enhances readability, and allows us to write UI components more declaratively, like combining logic and HTML in a single file. This is especially important in modern web development, where building complex UIs requires clean, maintainable code.

Conclusion: The Nightmare Without JSX

Imagine trying to build entire applications using only React.createElement()—every tag, every attribute, every piece of content wrapped in function calls. JSX is the hero that saves us from this complexity, allowing us to write more elegant, readable, and maintainable code. While you technically can write React without JSX, would you really want to?

Goodbye React.createElement()—Hello JSX!

jsx Article's
30 articles in total
Favicon
Why JSX/TSX Isn't Cool
Favicon
Building Static HTML Pages with JSX Server-Side Rendering
Favicon
Task completed
Favicon
Why React Can Surprise You (And How to Tame It)
Favicon
Render Block component in Next JS and Headless CMS
Favicon
Full Guide For React Developer
Favicon
Imagining React Without JSX: A Developer's Worst Nightmare
Favicon
Projeto de Integração: FastAPI, Jinja2 e JSX
Favicon
Introducing Brisa: Full-stack Web Platform Framework 🔥
Favicon
Understanding JSX in React
Favicon
How React JSX Gets Transformed Into JavaScript Behind the Scenes
Favicon
Day 3: Understanding JSX and Rendering Elements - ReactJS
Favicon
A Comprehensive Guide to Writing JSX in React (with Vite)
Favicon
{useState} HooK { Briefly Explained};
Favicon
Build Reactive Web Components with SSR
Favicon
JSX Limitations and Best Practices in React
Favicon
Making headless components easy to style
Favicon
React HooK= { Briefly Explained};
Favicon
How JSX Works
Favicon
Everything About JSX Syntax And Its Basics: A Quick Guide
Favicon
Converting Extension from JS to JSX
Favicon
Mastering JSX Editing in Emacs with Tree-sitter
Favicon
Building a dynamic Canvas rendering engine using JSX
Favicon
Comprendre les Props en React.js
Favicon
iconSvg
Favicon
An 85 Lines of Code Static Site Generator with Bun and JSX
Favicon
Can use React Smooth Scroll package and React Router Links on the same website?
Favicon
Dynamic background image loading
Favicon
How to render JSX to whatever you want with a custom JSX Renderer
Favicon
CREATE A LIBRARY WITH JSX & CUSTOM STATE

Featured ones: