##### Hello World ##### Maintenant que nous avons installé tout ce dont nous avons besoin pour réaliser cette application, nous pouvons commencer ! Vous avez désormais appris tous les langages qui nous serviront dans ce tutoriel, mais vous n'avez probablement jamais élaboré une application complète avec. Ce programme tout simple permet de comprendre la structure de base de l'application que nous allons réaliser. Le code, bien que très court, sera séparé en plusieurs fichiers en prévision de la création du forum. Les fichiers et dossiers ----- Commençons tout d'abord par bâtir la structure de base nécessaire à l'élaboration de ce ``Hello World``. D'autres fichiers seront ensuite rajoutés lorsque nous avancerons dans la suite de ce tutoriel. .. only:: html .. code-block:: tree . ├── app.js ├── node_modules ├── serveur │   └── routes.js ├── static │   ├── js │   │   └── general.js │   ├── responsive.css │   └── style.css └── views ├── balise_head.ejs ├── barre_navigation.ejs └── index.ejs .. only:: latex .. code-block:: sh . |-- app.js |-- node_modules |-- serveur | `-- routes.js |-- static | |-- js | | `-- general.js | |-- responsive.css | `-- style.css `-- views |-- balise_head.ejs |-- barre_navigation.ejs `-- index.ejs .. warning:: Le dossier ``node-modules`` doit contenir les modules que vous avez téléchargés à la section précédente. Prenez le dossier décompressé de ``bootstrap`` et glissez-le vers ``static``. Puis, renommez-le avec le nom de ``bootstrap``. Vous devriez désormais avoir la structure de fichiers suivante : .. only:: html .. code-block:: tree . ├── app.js ├── node_modules ├── serveur │   └── routes.js ├── static │   ├── bootstrap │   │   ├── css │   │   │   ├── bootstrap-theme.css │   │   │   ├── bootstrap-theme.css.map │   │   │   ├── bootstrap-theme.min.css │   │   │   ├── bootstrap-theme.min.css.map │   │   │   ├── bootstrap.css │   │   │   ├── bootstrap.css.map │   │   │   ├── bootstrap.min.css │   │   │   └── bootstrap.min.css.map │   │   ├── fonts │   │   │   ├── glyphicons-halflings-regular.eot │   │   │   ├── glyphicons-halflings-regular.svg │   │   │   ├── glyphicons-halflings-regular.ttf │   │   │   ├── glyphicons-halflings-regular.woff │   │   │   └── glyphicons-halflings-regular.woff2 │   ├── js │   │   └── general.js │   ├── responsive.css │   └── style.css └── views ├── balise_head.ejs ├── barre_navigation.ejs └── index.ejs .. only:: latex .. code-block:: sh . |-- app.js |-- node_modules |-- serveur | `-- routes.js |-- static | |-- bootstrap | | |-- css | | | |-- bootstrap-theme.css | | | |-- bootstrap-theme.css.map | | | |-- bootstrap-theme.min.css | | | |-- bootstrap-theme.min.css.map | | | |-- bootstrap.css | | | |-- bootstrap.css.map | | | |-- bootstrap.min.css | | | `-- bootstrap.min.css.map | | `-- fonts | | |-- glyphicons-halfings-regular.eot | | |-- glyphicons-halfings-regular.svg | | |-- glyphicons-halfings-regular.ttf | | |-- glyphicons-halfings-regular.woff | | `-- glyphicons-halfings-regular.woff2 | |-- js | | `-- general.js | |-- responsive.css | `-- style.css `-- views |-- balise_head.ejs |-- barre_navigation.ejs `-- index.ejs Code ----- Maintenant, nous pouvons enfin débuter le codage ! Nous indiquons au script ``NodeJS`` principal de récupérer différents modules et de lancer ``expressJS``. .. captionup:: ./app.js .. code-block:: javascript var http = require('http'); var path = require('path'); var express = require('express'); // nous pouvons faire appel à expressJS en tapant app.nom_de_la_fonction() var app = express(); Ensuite, nous appelons les fichiers qui se trouvent dans le dossier ``serveur``. .. captionup:: ./app.js .. code-block:: javascript var routes = require('./serveur/routes.js'); // à cet emplacement viendront d'autres fichiers qui seront créés plus tard Enfin, nous entrons les instructions pour lancer le serveur. .. captionup:: ./app.js .. code-block:: javascript var server = http.Server(app); server.listen(8888); .. note:: Nous utilisons ici le port 8888, mais bien entendu, vous pouvez en employer un autre. Notez que si vous utilisez le port 80, vous n'aurez pas besoin de le spécifier depuis votre navigateur web ; toutefois, ce port sert généralement lors de la mise en ligne de l'application, et non lors du développement. Nous allons ensuite dans le fichier ``balise_head.ejs`` et y ajoutons quelques éléments pour que le tout soit compatible avec ``bootstrap`` : .. captionup:: ./views/balise_head.ejs .. code-block:: html Hello World .. tip:: Le fichier ``general.js`` contiendra des fonctions javascript qui seront accessibles depuis toutes les pages du site web Nous ajoutons une barre de navigation : .. captionup:: ./views/barre_navigation.ejs .. code-block:: html .. only:: html .. note:: Pour plus d'informations sur la barre de navigation, vous pouvez consulter la `documentation officielle de bootstrap`_ qui traite plus précisément ce sujet. .. only:: latex .. note:: Pour plus d'informations sur la barre de navigation, vous pouvez consulter la documentation officielle de ``bootstrap`` (consultable sur le lien suivant : http://j.mp/1QV9Q0g) qui traite plus précisément ce sujet. Puis, nous insérons une fonction qui permet à la barre de navigation de s'ajuster sur les appareils mobiles : .. captionup:: ./static/js/general.js .. code-block:: javascript /* les fonctions byId() et byClass() permettent juste de ne pas avoir besoin d'écrire "document.getElementById" et "document.getElementsByClassName" à chaque fois qu'on les appelle */ function byId(id) { return document.getElementById(id); } function byClass(classe) { return document.getElementsByClassName(classe); } /* cette fonction est appelée lorsque un utilisateur qui est sur un appareil mobile clique sur le toggle de la barre de navigation */ function navbar_mobile() { // si, lorsque la fonction est appelée, le contenu de la barre n'est pas affiché if (byId('contenu_nav').className === 'navbar-collapse collapse') { // on l'affiche byId('contenu_nav').className = 'navbar-collapse collapse in'; byId('navbar').style.height = '100%'; // à l'inverse } else { // on le cache byId('contenu_nav').className = 'navbar-collapse collapse'; byId('navbar').style.height = '50px'; } } Enfin, nous assemblons le tout dans la page principale, ``index.ejs`` : .. captionup:: ./views/index.ejs .. code-block:: guess <% include balise_head %> <% include barre_navigation %>

Hello World !

.. note:: Comme vous pouvez le remarquer, la page principale se contente d'effectuer des inclusions qui pointent vers d'autres fichiers ``EJS``. Ce système permet d'avoir des codes récurrents comme la barre de navigation et la balise ``head`` dans un fichier séparé. Ainsi, en modifiant ce fichier, la transformation est appliquée sur **toutes les autres pages**. Il reste maintenant une dernière étape : nous demandons à ``expressJS`` d'afficher la page ``index.ejs`` lorsqu'on entre l'``URL`` de l'application dans le navigateur : .. captionup:: ./serveur/routes.js .. code-block:: javascript // nous créons une fonction qui contient toutes les routes // ainsi, nous pouvons la lancer depuis le fichier app.js exports.f = function(app, dossier) { // affichage de la page index si on entre localhost/ app.get('/', function(req, res) { res.render('index.ejs'); }); // envoi des fichiers statiques si l'URL commence par "static" app.get(/static\/([a-z\.\/_-]+)$/i, function(req, res) { res.sendFile(dossier + '/static/' + req.params[0]); }); // affichage d'un message d'erreur pour n'importe quel autre URL app.get(/.*/, function(req, res) { res.end('Cette page n\'existe pas'); }); } Puis nous insérons la fonction que nous venons de créer dans le fichier principal : .. captionup:: ./app.js .. code-block:: javascript routes.f(app, __dirname); .. tip:: Cette fonction utilise pour l'instant deux paramètres ; la variable ``app`` qui sert au bon fonctionnement d'``expressJS`` et ``__dirname`` qui contient le dossier dans lequel se trouve le fichier ``app.js``. Comme ``res.SendFile`` ne supporte que les chemins absolus et que le dossier ``static`` se trouve au même endroit que ``app.js``, nous pouvons ensuite simplement déterminer l'emplacement du fichier statique qu'``expressJS`` ira chercher avec ``res.SendFile()``. Tout ceci devrait donner, au final : .. captionup:: ./app.js .. code-block:: javascript var http = require('http'); var path = require('path'); var express = require('express'); // nous faisons appel à expressJS en tapant app.nom_de_la_fonction() var app = express(); var routes = require('./serveur/routes.js'); // à cet emplacement viennent d'autres fichiers qui seront créés plus tard // appel de la fonction qui se trouve dans "routes.js" routes.f(app, __dirname); var server = http.Server(app); server.listen(8888); Résultat ---- Maintenant, ouvrez le terminal (sur ``OSX``) ou ``node.js command prompt`` et exécutez la commande suivante : .. code-block:: bash sudo node app.js Ouvrez un navigateur web et entrez l'adresse http://localhost:8888/. Si tout fonctionne bien, la page suivante s'affiche : .. image:: structure_base/3.png Si vous redimensionnez la fenêtre, un bouton d'affichage s'ajoute dans la barre de navigation les mots "Hello World" apparaissent tout à gauche (la marge est supprimée) : .. image:: structure_base/4.png :height: 10000 px :width: 700 px :scale: 60 % Nous avons maintenant la base de la structure des fichiers de l'application que nous allons produire. Gardez bien cette structure et n'hésitez pas à créer de nouveaux fichiers lorsque vous rajoutez des fonctionnalités ; cela évitera d'éventuelles redondances du code et améliorera votre organisation. .. only:: html .. tip:: Vous pouvez télécharger ce Hello World en cliquant `ici`_. .. only:: latex .. tip:: Vous pouvez télécharger ce Hello World à l'aide de ce lien : http://j.mp/1QVAxDe .. liens .. _ici: http://tutoriel-forum.s3-website-eu-west-1.amazonaws.com/hello_world.zip .. _documentation officielle de bootstrap: http://getbootstrap.com/components/#navbar