TP 4

Templating avec EJS

Le TP 3 nous a permis de nous familiariser avec Express et la création de route statique et dynamique. Nous allons maintenant construire un site web et mettre en place la partie Front de notre application.

Installation

Lancez la commande suivante :

npm install --save ejs serve-static morgan

Bower

Bower est un gestionnaire de dépendance pour les packages Front-End (jQuery, Angular, etc...). Il s'utilise de même façon que NPM, c'est-à-dire, en ligne de commande.

Commençons par installer Bower:

npm install -g bower
bower init

Etape suivante, il nous faut préciser le répertoire d'installation des bower_components. Pour cela, il faut créer un fichier .bowerrc à la racine du projet et ajouter ceci :

{
  "directory": "webapp/bower_components/"
}

On installe maintenant les packages que nous allons utiliser pour développer notre site :

bower install --save lodash jquery materialize angular

Vous devez ensuite récupérer le dossier /webapp et son contenu. Puis copier le répertoire à la racine du projet.

Sources du TP : tp4-installation-provided

Configuration du serveur

Commençons par configurer le logger morgan. Il va nous logger toutes les requêtes adressées à notre serveur dans la console.

class Server {

    public importMiddlewares(){
        const morgan = require('morgan');
        
        this.app.use(morgan('combined'));
    }
}

combined est une option permettant d'avoir une log détaillée.

Exercice 1

De la même façon qu'avec le logger morgan, ajoutez le middleware serve-static à votre serveur pour exposer les contenus statiques du dossier /webapp.

Pour valider l'installation du middleware, essayez d'acceder à une image du dossier webapp via le navigateur.

Configuration du moteur de template EJS

EJS est des moteurs de templating pour Node.js et Express.

Afin de pouvoir utiliser EJS nous devons configurer notre serveur comme suivant :

class Server {

    public importMiddlewares(){
        
        /// ... configuration des premiers middlewares
        
        // On utilise l'extension .html en lieu et place de l'extension .ejs
        this.app.engine('.html', require('ejs').__express);

        // On change le dossier de base
        this.app.set('views', './webapp');

        // Permet de ne pas spécifier l'extension lors de l'utilisation de res.render()
        this.app.set('view engine', 'html');
        
    }
}

Exercice 2

Le moteur de template fonctionne. Nous allons le tester.

Actuellement dans le dossier webapp, vous avez une page index.html. Cette page est incomplète et il nous manque le header.html et le footer.html.

Commencez donc par inclure le header.html avec une instruction EJS (doc).

Ensuite essayez d'afficher la page.

Exercice 3

Pour résoudre le problème de l'exercice 2, il faut en réalité créer un controller nommé IndexCtrl dans le dossier src/pages et indiquer explicitement à Express que pour la page index.html ayant la route / il y une phase de rendu ou render à effectuer. Voici les étapes à suivre :

Une fois que votre controlleur est en place vous devriez avoir l'entête de site disponible.

Vous pouvez inclure le footer !

Note : Faite attention à l'ordre des middlewares !

Exercice 4

Maintenant nous allons proposer une page d'accueil avec un peu de contenu sous forme de carte !

Voici un fragment html pour vous aider à faire cette exercice :

<div class="card">
    <div class="card-image waves-effect waves-block waves-light">
        <img class="activator" src="images/">
    </div>
    <div class="card-content">
        <span class="card-title activator grey-text text-darken-4">
            label <i class="material-icons right">more_vert</i>
        </span>

        <p><a href="">Y aller !</a></p>
    </div>

    <div class="card-reveal">
        <span class="card-title grey-text text-darken-4">
            label <i class="material-icons right">fermer</i>
        </span>
        <p>description</p>
    </div>
</div>

Nous avons dans le dossier resources un fichier menu.json. Nous allons utiliser ce fichier pour créer une liste de carte dans la page d'accueil.

Note : response.render() prend deux paramètres, le premier étant le nom de la page html et le second étant des données (scope) pour générer notre vue.

En utilisant les bonnes instructions EJS, essayez d'afficher la liste de carte.

Bonus

Il y a un bouton de téléchargement dans la page d'accueil. Essayez de le relier avec le service Rest document.

Bonus 2 Le header.html doit afficher un menu de navigation (mobile et desktop). Voici le fragment html pour vous aider :

<li><a href="lien">label</a></li>

Correction : tp4-exercice-4-solution

Suivant