TEMPLATING ENGINES :

npm install --save  ejs / pug /  express-handlebars

UTILISER UN TEMPLATE :

// app.set() nous permet de fixer des valeurs globales dans notre application expressJS
//Dans app.js : 

// on dit quel moteur on utilise
app.set("view engine", 'pug');
// where to find the templates
app.set("views", "views");

Les fichiers pug doivent avoir l'extension .pug et ils ressemblent a ca :

<!DOCTYPE html>
html(lang="en")
    head
        meta(charset="UTF-8")
        meta(name="viewport" content="width=device-width, initial-scale=1.0")
        title My Shop
        link(rel="stylesheet" href="css/main.css")
        link(rel="stylesheet" href="css/product.css")
    body
        header.main-header
            nav.main-header_nav
                ul.main-header__item-list
                    li.main-header__item
                        a.active(href="/") Shop
                    li.main-header__item
                        a.(href="/admin/add-product") Add product

Et pour l'utiliser :

router.get('/', (req, res, next) => {
    const products = adminData.products;
// AVANT : 
    // res.sendFile(path.join(rootDir, 'views', 'shop.html'));
// MAINTENANT (pas besoin de mettre le chemin , on a definit plus haut que tout etait
// dans le dossier 'views' ): + on peut passer des params en 2nd argument
    res.render('shop', {products: products, docTitle: 'Shop'})
});

Avec .pug l'interpolation se fait comme cela :

title #{docTitle}
// loop : 
if prods.length > 0
                .grid
                    each product in prods
else
                h1 No Products

Ajouter des layout :

Si on a du code qui se repete dans le template (par exemple le header) on va creer un dossier layouts/ avec un fichiers ou plusieurs .pug

<!DOCTYPE html>
html(lang="en")
    head
        meta(charset="UTF-8")
        meta(name="viewport", content="width=device-width, initial-scale=1.0")
        title #{pageTitle}
        link(rel="stylesheet", href="/css/main.css")
// on utilise la syntaxe block nomDuBlock pour dire que les templates enfants
// pourront afficher leur modifs ici
        block styles
    body

    header.main-header
        nav.main-header__nav
            ul.main-header__item-list
                li.main-header__item
                    a(href="/") Shop
                li.main-header__item
                    a(href="/admin/add-product") Add Product    
// chaque block enfant pourra display son content ici 
    block content

utiliser le layout :

// on etends le block principal
extends layouts/main-layout.pug

// on modifie ce qu'on a a modifier
block content 
    h1 Page Not Found!

Si je veux rendre mes liens 'active' dans le header ?

router.get('/', (req, res, next) => {
    const products = adminData.products;
    res.render('shop', {
        prods: products,
        docTitle: 'Shop',
// j'exporte une var de plus, je l'appelle comme je le veux
        path: 'shop'
    })
});
// dans le template main-layout.pug

 li.main-header__item
// si la var path est 'shop' bah je suis sur la page shop donc je met la class active
   a(href="/", class=(path==='shop' ? 'active' : '')) Shop
 li.main-header__item
// meme chose ici
   a(href="/admin/add-product", class=(path==='admin/add-product' ? 'active' : '')) Add Product