How to manually configure a minimal setup for React without create-react-app?
Preqrequisites:
- Node.js (npm) or yarn installed on your computer or as executable file
So for a pretty minimal setup you'd want to...
- Initialize a folder
cd path/to/my/folder
npm init
- Create an index.html
<!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <title></title> </head> <body> <div id="root"></div> <script src="./node_modules/react/umd/react.development.js"></script> <script src="./node_modules/react-dom/umd/react-dom.development.js"></script> <script src="./dist/main.js"></script> </body></html>
- Then you'd want to
npm install --save
...
- react
- react-dom
- webpack
- webpack-cli
- @babel/core
- babel-loader
- @babel/preset-react
npm install --save react react-dom
npm install --save-dev webpack webpack-cli @babel/core babel-loader @babel/preset-react
- Create
.babelrc
{ "presets": ["@babel/preset-react"]}
- Create webpack.config.js
module.exports = { module: { rules: [ { test: /\.jsx?$/, exclude: /node_modules/, use: { loader: "babel-loader" } } ] }};
- Edit
package.json
scripts to build
"scripts": { "build": "webpack --mode development" },
- Write your root component
Create a src/components
folder and then create your src/components/app.jsx
:(Edit 2021: use functions, not classes!)
import * as React from "react";export class App extends React.Component { render() { return ( <div> Hello, world! </div> ); }}
- Write your ReactDOM renderer in
src/index.js
(note .js, not jsx - webpack wont find the file otherwise, without more configurations):
import ReactDOM from "react-dom";import { App } from "./components/app.jsx";ReactDOM.render( <App />, document.getElementById("root"));
- Build:
npm run build
- Open your
path/to/my/folder/index.html
in a modern browser
And you're done! You can now add any convenient add-ons you wish without any undesirable bloat. I recommend TypeScript.
For anyone reading that need to support older browsers, simply follow these two steps:
npm install @babel/preset-env
- Edit
.babelrc
and add @babel/preset-env to your presets:
{ "presets": ["@babel/preset-env", "@babel/preset-react"]}