Introduction

TLDR;

create-react-app permet de démarrer rapidement un projet React, sauf qu’il n’intègre aucune autre librairie.

Dans cet article on va voir comment je configure des librairies essentielles à tout projet React.

React est une très bonne librairie pour organiser le code de votre site ou application web, elle est performante, très bien documentée et supportée par une large communauté.

Mais React est avant tout une librairie qui ne gère que la partie affichage des composants, on peut dire donc que quand on choisit React on choisit plutôt un écosystème, on pioche des librairies pour gérer tous les aspects de la création d’une application web, par exemple :

Démarrer un projet React peut être fastidieux, cependant facebook a créer un outils très utile pour faciliter le démarrage d’une application React nommé create-react-app.

Sauf que même avec cet outil, il est nécessaire de configurer soit même pas mal de librairies avant de réellement commencer à travailler.

Dans cet article on va donc créer un projet avec create-react-app, puis configurer quelques librairies pour faciliter le démarrage d’un projet React.

Création de projet

Avant de commencer le projet, assurez vous d’avoir une version à jour de NodeJS installée sur votre pc.

à noter que j’utilise yarn au lieu d’ npm pour la gestion des dépendances, remplacez yarn par npm dans mes exemples pour utiliser ce dernier.

On commence donc par créer projet d’exemple avec create-react-app, pour ce faire lancez la commande suivante :

npx create-react-app my-example

le projet react est maintenant créé, vous pouvez tester avec la commande :

cd my-exemple
yarn start

Ajouter quelques librairies essentielles

On va ensuite configurer quelques librairies qui vont nous aider à créer notre application, je travaille principalement sur des applications web, et en général j’utilise les librairies suivantes :

on installe donc toutes les dépendances avec la ligne de commande suivante.

yarn add immutable redux-form redux-thunk react-router-dom react-redux redux

ajouter le dossier src au NODE_PATH

En ajoutant le dossier src/ au NODE_PATH, on peut faire des imports avec des chemins absolus vers nos composants.

pour faire cela, créez un fichier .env à la racine du projet avec le contenu suivant :

chemin: .env

PORT=3000
CHOKIDAR_USEPOLLING=true
NODE_PATH=src

Préparation de notre store avec Redux

J’ai tendance à mettre tout ce qui concerne le state global de l’application dans un dossier store/, on commence donc à configurer notre store:

chemin: src/store/index.js

import { createStore, applyMiddleware } from "redux";
import thunkMiddleware from "redux-thunk";
import combinedReducers from "./reducers";

const reduxChromeExtesionConnection =
  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__();

export function initStore(initialState) {
  const middlewares = [thunkMiddleware];

  const store = applyMiddleware(...middlewares)(createStore)(
    combinedReducers,
    initialState,
    reduxChromeExtesionConnection
  );
  return store;
}

export default initStore;

Dans ce bout de code on configure les choses suivantes :

Pour faciliter la configuration du Hot module reload ( voir chapitre correspondant) on centralise tout nos reducers dans un seul fichier.

chemin: src/store/reducers.js

import { combineReducers } from "redux";

import { reducer as formReducer } from "redux-form";

// Import your reducers here

const reducers = {
  form: formReducer
};

export default combineReducers(reducers);

on centralise dans ce fichier tout nos reducers, et on en profite pour ajouter le reducer de redux-form.

Activer le hot module reload

Le hot module reload ne fonctionne pas trop bien avec create-react-app, en effet, à la moindre modification la page est rechargée, la prochaine étape est donc de corriger ce problème.

on commence par le point d’entrée de l’application, modifiez ce fichier avec le contenu suivant :

chemin: src/index.js

import React from "react";
import ReactDOM from "react-dom";
import App from "App";
import { Provider } from "react-redux";
import configureStore from "store";

const store = configureStore();

const render = Component => {
  return ReactDOM.render(
    <Provider store={store}>
      <Component />
    </Provider>,
    document.getElementById("root")
  );
};

render(App);

if (module.hot) {
  module.hot.accept("./App", () => {
    const NextApp = require("./App").default;
    render(NextApp);
  });
}

Puis on modifie la configuration du store précédement faite, modifiez la fonction initStore pour ressembler à l’exemple ci dessous :

chemin: src/store/index.js

...
export function initStore(initialState) {
  const middlewares = [thunkMiddleware];

  const store = applyMiddleware(...middlewares)(createStore)(combinedReducers, initialState, reduxChromeExtesionConnection);

  if (process.env.NODE_ENV !== 'production') {
    if (module.hot) {
      module.hot.accept('./reducers', () => {
        store.replaceReducer(combinedReducers);
      });
    }
  }

  return store
}
...

Ajouter le routeur

On va maintenant mettre en place une configuration basique de React router, mais avant de commencer on va d’abort créer deux pages pour tester notre configuration.

chemin: src/views/SomePage1.jsx

import React from "react";
import { Link } from "react-router-dom";

export default function SomePage1() {
  return (
    <div>
      <h1>Page 1</h1>
      <Link to="/">Page 1</Link>
      <br />
      <Link to="/page2">Page 2</Link>
    </div>
  );
}

chemin: src/views/SomePage2.jsx

import React from "react";
import { Link } from "react-router-dom";

export default function SomePage2() {
  return (
    <div>
      <h1>Page 2</h1>
      <Link to="/">Page 1</Link>
      <br />
      <Link to="/page2">Page 2</Link>
    </div>
  );
}

Puis je configure mes routes directement sur App.js, remplacez le contenu de ce fichier avec le code suivant :

chemin: src/App.js

import React, { Component } from "react";
import { Router, Route, Switch } from "react-router-dom";
import createHistory from "history/createBrowserHistory";

import "./App.css";

import SomePage1 from "views/SomePage1";
import SomePage2 from "views/SomePage2";

export const history = createHistory();

class App extends Component {
  render() {
    return (
      <Router history={history}>
        <Switch>
          <Route path="/" exact name="Page1" component={SomePage1} />
          <Route path="/page2" name="Page2" component={SomePage2} />
        </Switch>
      </Router>
    );
  }
}

export default App;

Conclusion

On a vu une façon simple de démarrer un projet React, cependant il existe pas mal de façons de faire, donc n’hésitez pas à vous inspirer des exemples présents sur github pour des solutions plus complètes.