React - Backbone - Browserify : Que du bonheur!
Jâai eu beau essayer dâautres frameworks (Angular, Polymer, Ember âŠ), jâen reviens toujours Ă Backbone : son modĂšle objet, ses modĂšles et collections, associĂ©s Ă de la lĂ©gĂšretĂ© et de la simplicitĂ©, je nâarrive pas Ă mâen passer. Par contre, je trouve lourds les âBackbone Viewsâ et les templates (Mustache et les autres), et probablement encore plus lourd, le systĂšme de gestion de dĂ©pendances et de module RequireJS.
Remplacer Backbone.View
Il y a peu jâai dĂ©couvert React qui permet de se substituer aux âViewsâ Backbone dâune façon tout Ă fait âconcurrentielleâ. Jây gagne en visibilitĂ© (facilitĂ© de dĂ©veloppement et de maintenance) et en puissance (plus rapide, plus lĂ©ger). (cf. mon post âReact : La RĂ©volution des Views (?) (cĂŽtĂ© front)â pour une initiation rapide).
Remplacer RequireJS
Jâai mis un moment Ă lâaccepter, mais pour dĂ©velopper de âgrossesâ application javascript (surtout si lâon bosse en Ă©quipe), un gestionnaire de modules et de dĂ©pendances est OBLIGATOIRE!.
Mais ĂȘtre obligĂ© de dĂ©clarer lâensemble des dĂ©pendances dans un fichier (avec le risque dans oublier si on ajoute une librairie), la notation utilisĂ©e dans chacun des modules (avec le risque dâoublier une dĂ©pendance lĂ aussi), ⊠tout ça me âpompe lâairâ!
Jâaime bien me simplifier la vie, et jâai fini par tester quelque chose que jâavais mis de cĂŽtĂ© depuis un moment : Browserify. Pour faire court, cela permet dâavoir un systĂšme de gestion de module cĂŽtĂ© front identique Ă celui de Nodejs et donc dâutiliser npm pour tĂ©lĂ©charger vos librairies javascript prĂ©fĂ©rĂ©es. Par exemple pour ârĂ©cupĂ©rerâ Backbone, prĂ©fĂ©rez un npm install backbone
Ă un bower install backbone
. Ensuite, lorsque vous aurez besoin de Backbone dans un module, il suffira dâĂ©crire var Backbone = require("backbone");
dans votre fichier javascript. Vous nâaurez pas de tag <script></script>
Ă ajouter dans votre page html, puisque la commande browserify something.js -o bundle.js
permettra de crĂ©er un fichier javascript unique avec toutes les dĂ©pendances âmergĂ©eâ.
Oui, et comment fait-on?
Le but de cet article nâest pas de vous expliquer de A Ă Z comment construire lâensemble de la stack et des Ă©lĂ©ments nĂ©cessaires pour faire une 1Ăšre application, mais de vous permettre de dĂ©couvrir simplement et facilement comment tout ceci fonctionne. Pour ce faire jâai crĂ©Ă© un gĂ©nĂ©rateur pour Yeoman (1) qui va vous permettre facilement (et automatiquement) de crĂ©er un projet avec toutes les dĂ©pendances nĂ©cessaires pour commencer Ă jouer avec :
- React
- Backbone
- Browserify
- Bootstrap
- et accessoirement Express, Mongoose (et donc MongoDb que vousdevrez installer)
Ce gĂ©nĂ©rateur sâappelle generator-react-app, vous pouvez le trouver ici : https://www.npmjs.org/package/generator-react-app, il est âaccompagnĂ©â de quelque âsubs-generatorsâ permettant de gĂ©nĂ©rer des bouts de code automatiquement (ie: des modĂšles, des composants backbones, âŠ), mais aussi de quelques mĂ©caniques Grunt (grunt-react, grunt-browserify, grunt-watch) permettant de transformer automatiquement vos composants React en javascript mais aussi de gĂ©nĂ©rer le âbundle browserifiy javascript finalâ.
Tout ceci peut paraĂźtre un peu abstrait, donc passons directement Ă la pratique.
Installer generator-react-app
Bien sûr vous avez besoin de Yeoman (et donc node et npm).
Dans un terminal, tapez sudo npm install -g generator-react-app
Créer le squelette de votre projet
Créez un répertoire : mkdir humans-demo
, puis âallezâ dans le rĂ©pertoire : cd humans-demo
et enfin lancez âmon killer generatorâ (2) : yo react-app
et donnez un nom à votre application et à votre base de données :
_____ _ _____
| __ |___ ___ ___| |_ ___| _ |___ ___
| -| -_| .'| _| _|___| | . | . |
|__|__|___|__,|___|_| |__|__| _| _|
|_| |_|
Hi! This is a React-Express-Mongoose Generator :) Enjoy!
[?] Application name? HumansDemo
[?] DataBase name? DemoDb
attendez : le générateur va créer la structure de votre projet et télécharger via npm et bower toutes les dépendances nécessaires à votre projet.
Lancez votre application (pour voir)
Vous devez maintenant avoir lâarborescence suivante :
- lancez MongoDb : dans un terminal tapez
mongod
- lancez votre application :
node app.js
(un conseil installez nodemon https://github.com/remy/nodemon cela permet dâĂ©couter les changements des fichiers et de re-dĂ©marrer node Ă chaque changement) - lancez
grunt browserify
(cela va créer un fichierpublic/js/app.built.js
) - lancez
grunt-watch
pour que Grunt Ă©coute les changements - allez Ă http://localhost:3000
Si tout va bien vous devriez obtenir ceci :
Si tout va mal, âpinguezâ moi âŠ
Créez des services CRUD pour Express (cÎté back)
Dans un terminal, tapez : yo react-app:mgroutes Human
et répondez aux questions :
[?] mongoose schema (ie: name: String, remark: String)? firstName: String, lastName: String
[?] url? humans
create models/Human.js
create routes/Humans.routes.js
create controllers/HumansCtrl.js
Nous venons de renseigner le schema Mongoose : firstName: String, lastName: String
, lâurl (gardez la valeur par dĂ©faut) de base des routes sera /humans
et 3 fichiers ont été créés automatiquement :
models/Human.js
controllers/HumansCtrl.js
routes/Humans.routes.js
Je vous ai déjà fait gagner beaucoup de temps non ? ;)
Créez les modÚles et collections Backbone (cÎté front)
Dans un terminal, tapez : yo react-app:bbmc Human
et répondez aux questions : (gardez les valeurs par défaut quand elles sont proposées)
[?] model name (ie: Book) Human
[?] defaults (ie: name: 'John Doe', remark: 'N/A')? firstName: "John", lastName: "Doe"
[?] url? humans
create public/js/modules/models/HumanModel.js
create public/js/modules/models/HumansCollection.js
Nous avons donc obtenu toujours automatiquement un modĂšle et une collection.
public/js/modules/models/HumanModel.js
public/js/modules/models/HumansCollection.js
Vous avez vu ?!
Nous sommes cÎté client, et nous déclarons les dépendances comme avec Node : var HumanModel = require("./HumanModel");
, câest tout de mĂȘme plus simple quâavec Require, câest la magie de Browserify!
Il ne faut pas oublier dâexporter chacun des modules pour pouvoir les utiliser : module.exports = HumanModel;
et module.exports = HumansCollection;
.
Passons Ă lâIHM avec React ou comment remplacer les âViewsâ Backbone
Nous voulons pouvoir saisir des informations et les afficher, nous allons donc créer un formulaire et une table.
Dans un terminal, tapez : yo react-app:formbb HumanForm Human
et répondez aux questions : (gardez les valeurs par défaut quand elles sont proposées)
[?] model name (ie: Book) Human
[?] fields (for UI) (ie : title, author)? firstName, lastName
[?] url? humans
create public/js/react_components/HumanForm.js
Ensuite, yo react-app:tablebb HumansTable Human
[?] model name (ie: Book) Human
[?] fields (for UI) (ie : title, author)? firstName, lastName
[?] url? humans
create public/js/react_components/HumansTable.js
Nous avons donc maintenant 2 composants React (toujours automatiquement)
public/js/react_components/HumanForm.js
public/js/react_components/HumansTable.js
Vous avez vu là aussi ⊠?!
Nous dĂ©clarons lĂ aussi les dĂ©pendances de la mĂȘme maniĂšre que pour les modĂšles et collection Backbone :
Et surtout ne pas oublier : /** @jsx React.DOM */
pour que les composants soit bien transformés par grunt-react.
One more thing!
Une derniÚre petite remarque, dans la méthode componentDidMount
de mon composant React, jâai pu crĂ©er un âRouterâ Backbone complĂštement associĂ© au composant.
Il ne nous reste plus quâĂ afficher tout ça
Modifiez public/js/modules/main.js`
Ouvrez le fichier public/js/modules/main.js
et remplacez son contenu par :
Modifiez public/index.html
Modifiez le contenu du fichier index.html
de la maniĂšre suivante :
Vous pouvez remarquer que lâon nâinsĂšre quâun seul script js/app.built.js
qui est construit et mis Ă jour au fur et Ă mesure que lâon travail grĂące aux tĂąches Grunt.
Et vous pouvez rafraĂźchir la page de votre navigateur et jouez avec :
Je joue avec tout cela depuis quelques jours et je trouve que marier React et Browserify simplifie le code, et en prime je peux conserver ce que je préfÚre dans Backbone : les modÚles et les collections.
A lâusage, je trouve que lâutilisation des tĂąches grunt-react
et grunt-browserify
lancées via grunt-watch
me permet de détecter rapidement (et de maniÚre assez explicite) certaine erreurs.
Si vous avez des idĂ©es dâamĂ©liorations (notamment pour la partie Grunt) ou dâajouts, nâhĂ©sitez pas Ă contribuer Ă mon gĂ©nĂ©rateur : https://github.com/k33g/generator-react-app. (PS: jâai aussi en projet dâen faire une version pour PlayFramework dĂšs que jâai un peu de temps).
Tous les retours sont bienvenus :)
(1): je sais que jâavais dit que je trouvais Yeoman âpas trĂšs lĂ©gerâ, mais une fois que lâon a fait son premier gĂ©nĂ©rateur, on sâaperçoit quâil est diablement pratique. (2) un peu dâautosatisfaction nâa jamais fait de mal.
Tweet