Solved: createRoot(): Target container is not a DOM element

If you’ve encountered the “createRoot(…): Target container is not a DOM element” error while working with React, you know how frustrating it can be.

This error occurs when the createRoot() function is passed a null value as the target container, which can have multiple causes. In this post, we’ll explore the common causes of this error and provide solutions for fixing it.

Understanding the Causes of the Error createRoot(…): Target container is not a DOM element“:

There are several reasons why you might encounter the “createRoot(…): Target container is not a DOM element” error when using React:

[Fixed]: NameError: name ‘X’ is not defined in Python

Passing an incorrect id to the document.getElementById() method:

This is perhaps the most common cause of the error. When you use the document.getElementById() method to select the element that will serve as the target container for createRoot(), it’s important to make sure that the id you pass to the method matches the id of the element in your index.html file.

If the id doesn’t match, document.getElementById() will return a null value, which will cause the error when passed to createRoot().

Here’s an example of how this error can occur:

//passed wrong ID to getElementById() method
const rootElement = document.getElementById('wrong-id');
const root = createRoot(rootElement);

To solve this issue, make sure that the id you are using to select the element in your react code is the same id that you have specified in your index.html file.

Placing the react script file above the code that creates the div element:

If you place the script tag for your react code above the code that creates the div element in your index.html file, the script will run before the element is created.

This means that when you try to select the element using document.getElementById(), it won’t exist yet, and you’ll end up passing a null value to createRoot().

Here’s an example of how this error can occur:

<!-- BAD: script runs before div is created  -->
<script src="/bundle.js"></script>

<div id="root"></div>

To solve this issue, make sure to place the script tag for your react code below the code that declares the div element. This will ensure that the element exists when the script runs, and you won’t end up with a null value being passed to createRoot().

<!-- GOOD: div already exists  -->
<div id="root"></div>
<script src="/bundle.js"></script>

Incorrectly configuring webpack’s index.html file:

If you are using webpack with the html-webpack-plugin, you may encounter this error if you have not properly configured the plugin.

To use the html-webpack-plugin, you need to provide a path to your custom html file in the plugins section of your webpack config file, and use the template option to specify the path to your html file.

If you don’t do this, the plugin won’t be able to inject the necessary CSS, JS, manifest, and favicon files into the markup, which can cause the error.

Here’s an example of how to properly configure the html-webpack-plugin in your webpack config file:

const HtmlWebpack
module.exports = {
  // ...
  plugins: [
    new HtmlWebpackPlugin({
      title: "Your custom title",
      template: './src/index.html'
    })
  ],
  // ...
};

And here’s an example of how you might set up your custom html file:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

Finally, make sure that your react code is selecting the element with the correct id:

import {StrictMode} from 'react';
import {createRoot} from 'react-dom/client';

import App from './App';

const rootElement = document.getElementById('root');
const root = createRoot(rootElement);

root.render(
  <StrictMode>
    <App />
  </StrictMode>,
);

By following these steps, you should be able to fix the “createRoot(…): Target container is not a DOM element” error when using webpack with the html-webpack-plugin.

Conclusion

In this post, we’ve looked at the common causes of the “createRoot(…): Target container is not a DOM element” error in React, and provided solutions for fixing it. Whether you’re passing an incorrect id to the document.getElementById() method, placing the react script file in the wrong place, or incorrectly configuring webpack’s index.html file, we hope that these solutions will help you get your react code up and running again.

Leave a Reply