I'm new to react.
My error is:
Uncaught Error: Target container is not a DOM element
I've Googled this plenty of times and find people who have this error:
Uncaught Error: Invariant Violation: _registerComponent(...): Target container is not a DOM element.
Mine doesn't contain:
_registerComponent(...):
Here are my files:
index.html
<html>
<head>
<meta charset="utf-8">
<title>React</title>
</head>
<body>
<div id="root"></div>
<script src="./bundle.js"></script>
</body>
</html>
index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
<div>
<h1>Hello World!</h1>
</div>,
document.getElementById('root')
);
webpack.config.js
const path = require('path');
module.exports = {
context: path.join(__dirname, 'src'),
entry: './index.jsx',
output: {
path: path.join(__dirname, 'public'),
filename: './bundle.js'
},
module: {
loaders: [
{ test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ },
{ test: /\.jsx$/, loader: 'babel-loader', exclude: /node_modules/ },
],
},
resolve: {
modules: [
path.join(__dirname, 'node_modules')
]
}
};
The most common issue I found people were having with this error is that they put <script>
in the head or before the <div>
. Yet I don't do neither of these so I have no idea what the problem is.
Document object model. The DOM is the way Javascript sees its containing pages' data. It is an object that includes how the HTML/XHTML/XML is formatted, as well as the browser state. A DOM element is something like a DIV, HTML, BODY element on a page.
React. createElement( type, [props], [... children] ) Create and return a new React element of the given type. The type argument can be either a tag name string (such as 'div' or 'span' ), a React component type (a class or a function), or a React fragment type.
I'm definitely a little late to the party here, but would like to post an answer for those who want to use webpack-dev-middleware
instead of circumventing it.
The problem, for me, was that basic setup for webpack-dev-middleware
is shown in the webpack docs using html-webpack-plugin
with a default configuration. This plugin dynamically generates a new index.html
file along with your bundle.js
on save, so even though I wrote an index.html
file that contained <div id="root"></div>
, that wasn't the one that was being served to the browser. I was able to verify this by running /node_modules/.bin/webpack
and watching the output in my public path directory.
My solution is as follows:
Add a configuration object to the declaration of the WebpackHtmlPlugin:
plugins: [
new HtmlWebpackPlugin({
title: "boilerplate",
template: path.join(__dirname, "pathto", "template.html"),
inject: "body",
}),
],
(This sets the title of the template file, its location, and directs html-webpack-plugin
to push all script tags into the bottom of the body element of the generated file.) The template is as follows:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
More info can be found here:
Thanks to Axnyff for his help as it resolved my question. The problem was with a dependency I was using, webpack-dev-middleware.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With