Why does create-react-app creates both App.js and index.js?

ReactjsCreate React-App

Reactjs Problem Overview


I started learning React and now I'm trying to understand what is the purpose of the index.js and App.js which are created by by running create-react-app.

Why can't we just use, for example. App.js?

I've read that App.js usually used as a main entry point to the application, but auto-generated code of index.js seems like a part of main entry point:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';

ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();

I saw a similar questions for react native but I want to know about this in react in general.

Reactjs Solutions


Solution 1 - Reactjs

index.js is the traditional and actual entry point for all node apps. Here in React it just has code of what to render and where to render.

App.js on the other hand has the root component of the react app because every view and component are handled with hierarchy in React, where <App /> is the top most component in the hierarchy. This gives you the feel that you maintain hierarchy in your code starting from App.js.

Other than that, you can have the App logic in the index.js file itself. But it's something related to conventions followed by the community using the library or framework. It always feels good to go along the community.

Solution 2 - Reactjs

Great question. The answer is that App.js is not necessary and I personally delete it and just use Index.js as the root.

People "say" it makes it look nicer / easier but it is just adding an extra step that is not necessary. I hope that they will eventually delete App.js out of npx create-react-app and just use index.js.

Edit: I'm not going to alter my original comment, however, I gave up deleting App.js. I now just funnel everything through App.js and use Index.js. The nice thing about index.js is you can do all your imports there and funnel them through App.js

Solution 3 - Reactjs

Yes, App.js is not necessary. You can have just the index.js as follows.

// Import React and ReactDOM Libraries.
import React from 'react';
import ReactDOM from 'react-dom';
import CommmentDetail from './CommentDetail';

function getLabelText() {
  return 'Enter Name: ';
}

// Create React Components 
const App = () => {
  const buttonText = {text: 'Submit'};
  const buttonStyle = {backgroundColor: 'blue', color: 'white'}; 
  return (
	<div>
	  <label className="label" htmlFor="name">{getLabelText()}</label>  
	  <input id="name" type="text" />
	  <button style={buttonStyle} >{buttonText.text}</button>

	  // You can have other components here as follows.
	  // CommmentDetail is someOther component defined in another file.
	  // See the import statement for the same, 4th line from top

	  <CommmentDetail author='Nivesh' timeAgo='3 months ago at 4.45 PM' commentText='Good Point' } />
	</div>
  )
}

// Take the react component and show it on the screen
// ReactDOM.render(<App />, document.getElementById('root'));
// You can use the following as well.
ReactDOM.render(<App />, document.querySelector('#root'));

Solution 4 - Reactjs

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

function App() {
  return (
    <div className="App">
      <h1>Hello</h1>
      <h2>How are you!</h2>
    </div>
  );
}

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById("root")
);

This is a sample where we can directly implement without using App.js.

Solution 5 - Reactjs

create-react-app use a plugin for webpack that name is html-webpack-plugin and this plugin use index.js for entrypoint like below :

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
 entry: 'index.js',
 output: {
path: __dirname + '/dist',
filename: 'index_bundle.js'
},
 plugins: [
new HtmlWebpackPlugin()
 ]
}

this plugin use for generating html file.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArtem MalchenkoView Question on Stackoverflow
Solution 1 - ReactjsHariharan LView Answer on Stackoverflow
Solution 2 - ReactjsEvan EricksonView Answer on Stackoverflow
Solution 3 - ReactjsVivekDevView Answer on Stackoverflow
Solution 4 - ReactjsvazenfinoView Answer on Stackoverflow
Solution 5 - ReactjsMBehtemamView Answer on Stackoverflow