React

React and JSX on a single HTML page

Learn how to quickly test React components with JSX in a single HTML page without setting up a full project.

Introduction #

As much as tools like create-react-app, Next.js, and Gatsby.js have streamlined React development, there are times when setting up an entire project feels like overkill – especially when you just want to test a small idea. While Vite offers a faster alternative, sometimes what you need is the simplest possible setup. This is where crafting a React app within a single HTML page becomes invaluable. It’s quick, straightforward, and lets you test out your ideas in real-time.

Why Opt for a Single HTML Page? #

This approach is particularly useful for:

  • Rapid prototyping and testing of React components.
  • Learning and experimenting with React and JSX without the overhead of project setup.
  • Simplifying your workflow for small-scale experiments.

Setting Up Your React Environment in HTML #

To get started, you need to include Babel for JSX parsing and React and ReactDOM for rendering your app. Also, remember to set type="text/babel" in your script tag to ensure proper parsing of JSX.

Here’s the basic template to kickstart your React app in an HTML file:

<!doctype html>
<html>
    <head>
        <title>React Counter App</title>
        <!-- Load React and ReactDOM from CDN -->
        <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
        <!-- Load Babel for JSX parsing -->
        <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
    </head>
    <body>
        <div id="root"></div>
        <script type="text/babel">
            const App = () => (
                <div>
                    <h1>Simple React Counter</h1>
                    <Counter />
                </div>
            );

            const Counter = () => {
                const [count, setCount] = React.useState(0);

                const increment = () => {
                    setCount(count + 1);
                };

                const decrement = () => {
                    setCount(count - 1);
                };

                return (
                    <div>
                        <p>Count: {count}</p>
                        <button onClick={increment}>Increment</button>
                        <button onClick={decrement}>Decrement</button>
                    </div>
                );
            };

            ReactDOM.createRoot(document.getElementById('root')).render(
                <App />
            );
        </script>
    </body>
</html>

How Does This Work? #

  • React and ReactDOM: These are included via CDN links and are essential for rendering your React components.
  • Babel: It’s used here to transpile JSX code in the browser. Though not efficient for production, it’s perfect for quick testing.
  • Script Tag: The type="text/babel" attribute ensures your JSX code is correctly interpreted.

The Benefits #

  • No Build Required: There’s no need for a build step or watching files.
  • Instant Feedback: Changes are reflected immediately in your browser.
  • Simplicity: It’s a straightforward way to experiment with React components.

Limitations #

  • Not for Production: This method is intended for testing and prototyping, not for production use.
  • Performance Overhead: Transpiling JSX in the browser can be slower than precompiled code.

Try It Out! #

I encourage you to use this setup for your next quick React experiment. It’s a great way to learn and test React components on the fly.