DEV Community

Cover image for Ça part en prod maintenant
jean-smaug
jean-smaug

Posted on • Updated on • Originally published at maximeblanc.fr

Ça part en prod maintenant

On va parler de Now, c'est pour cela que "Ça part en prod maintenant".
⇒ :rire:

Now est une plateforme d'hébergement proposée par Zeit. Les créateurs de Socket.io, Next.js, du terminal Hyper et de beaucoup d'autres. À cette solution d'hébergement, vient s'ajouter un outil en ligne de commande pour déployer son application super facilement.

À titre personnel c'est la solution que j'ai choisie pour héberger mon site. Les concepts que je présente sont ceux que j'utilise et qui j'espère, vous seront utiles.

Le code utilisé dans cet article est disponible ici :

Tarifs

L'offre gratuite sera suffisante dans le cadre de cet article, mais de manière plus générale pour une utilisation personnelle.

zeit-princing

N'ayant pas essayé les offres payantes, je me garderai de faire des commentaires.

Configuration

Pour commencer, il faut créer un compte. Il est possible de s'inscrire via Github, Gitlab, Bitbucket ou par Email.

Ensuite, on installe de CLI Now.

yarn global add now
# OU
npm install -g now
Enter fullscreen mode Exit fullscreen mode

Enfin, il faut aussi se connecter via le CLI

now login adressemail@smaug.fr
Enter fullscreen mode Exit fullscreen mode

Un mail te sera envoyé à l'adresse saisie, il faudra juste cliquer sur le lien afin d'être authentifié.
Petite digression, ce mode de connexion est dit "passwordless".

Tout est en place, on peut déployer un site.

Création d'un site basique

Dans un premier temps, nous allons voir comment déployer un site statique.

<!-- index.html -->

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Démo now</title>
    <style>
      body {
        background: whitesmoke;
      }

      main {
        display: flex;
        justify-content: center;
        margin-top: 1em;
        font-size: 2em;
        height: 100vh;
        font-family: Arial, Helvetica, sans-serif;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <main>
      Avant j'étais moche dans la tess,<br />
      aujourd'hui je plais à Eva Mendes
    </main>
  </body>
</html>
Enter fullscreen mode Exit fullscreen mode

En prenant le html ci-dessus, il suffit de se placer dans le répertoire correspondant et de lancer la commande now.
5 questions vous seront posées afin de configurer le nom du projet, son propriétaire, le dossier à uploader...
Appuyez sur "⏎" pour chacune d'entre-elles afin d'utiliser la configuration par défaut.
Et... c'est tout.

now-cli-deployment

La console nous indique que notre site a été déployé sur la production, accessible depuis https://demo-now-deployment.now.sh dans mon cas. À l'avenir, il faudra lancer la commande now --prod pour déployer de nouveau en production. La commande now déploiera sur un espace de "preview".

deployment-result

On a pu déployer notre site statique en 30 secondes, maintenant on va voir que Now propose aussi de faire du backend

API JSON avec les Serverless Functions

Déjà, le serverless c'est quoi ? Malgré son nom, il n'est pas question de supprimer les serveurs, mais de ne plus s'occuper de leur gestion. Cette gestion est déléguée aux acteurs du cloud, AWS, GCP... et Now.

Dans la pratique, nous allons créer un dossier api dans lequel nous allons venir placer notre code serveur. Dans l'exemple ci-dessous le fichier api/kitchens.js ira lire le contenu du dossier images afin de renvoyer l'url permettant d'accéder aux photos de cuisines.

tree-now-serverless

// api/kitchens.js

const fs = require("fs")

// Récupération de la liste des fichiers du dossier images
const files = fs.readdirSync(__dirname + "/../images")

/* Votre code doit respecter un certain formalisme afin d'être compris
par Now. Dans le cadre du Javascript vous devez exporter une fonction.
Cette fonction à un paramètre requête et un paramètre réponse.
NB : la fonction doit nécessairement renvoyer des données. */
module.exports = (req, res) => {
  const data = files.map(fileName => ({
    name: fileName,
    url: `https://${req.headers.host}/images/${fileName}`,
  }))

  // On retourne les données au format json
  res.json(data)
}
Enter fullscreen mode Exit fullscreen mode

Pour déployer, même principe que tout à l'heure : now --prod.
Nos fonctions serverless peuvent être appelé via URL_PROJET/api/NOM_FICHIER. Dans notre cas https://demo-now-deployment.now.sh/api/kitchens.

result-api

Rendu HTML avec les Serverless Functions

Maintenant que notre API nous retourne les bonnes données, on pourrait l'appeler en Javascript avec fetch pour ensuite ajouter des éléments au DOM. Cependant, afin de faciliter le travail des moteurs de recherche, il est judicieux de retourner du HTML.

Notre arborescence de fichiers ressemblera à cela. Le fichier index.html est devenu templates/index.art et un fichier now.json est apparu.

tree-now-serverless-markup

art-template est un moteur de template Javascript, au même titre que Handlebars, Pug, EJS...

<!-- templates/index.art -->

<!DOCTYPE html>
<html lang="fr">
  <head>
    ...
  </head>
  <body>
    <main>
      <ul class="List">
        <!-- On boucle sur chacune des cuisines
        afin d'en afficher le contenu -->
        {{each kitchens}}
        <li class="Item">
          <span>{{ $value.name }}</span>
          <img width="350" height="200" src="{{ $value.url }}" />
        </li>
        {{/each}}
      </ul>
    </main>
  </body>
</html>
Enter fullscreen mode Exit fullscreen mode
const fs = require("fs")
const artTemplate = require("art-template")

const files = fs.readdirSync(__dirname + "/../images")
const template = fs.readFileSync(`${__dirname}/../templates/index.art`, "utf8")
// Pré-compiler le template permet de gagner en performances
const render = artTemplate.compile(template)

module.exports = (req, res) => {
  const data = files.map(fileName => ({
    name: fileName,
    url: `https://${req.headers.host}/images/${fileName}`,
  }))

  // Obtention du markup final
  const markup = render({ kitchens: data })

  // res.json est devenu res.send
  res.send(markup)
}
Enter fullscreen mode Exit fullscreen mode

Enfin, le fichier now.json va nous permettre d'ajuster le comportement de notre serveur.
Pour un utilisateur, il serait bizarre d'avoir une URL contenant /api. Ainsi, la configuration permet de rediriger la racine de notre site vers notre cloud function.

{
  "routes": [{ "src": "/", "dest": "/api/kitchens.js" }]
}
Enter fullscreen mode Exit fullscreen mode

On re-déploie avec now --prod

server-rendered-markup

Et on à accès à nos photos de cuisines !

Conclusion

Now c'est quand même vachement bien. Actuellement en V2, je regrette juste le fait de ne plus pouvoir déployer de conteneurs Docker.

Une chose que je peux affirmer, est que pour un projet personnel, vous pouvez déployer votre application en 30 secondes sans prise de tête. Que votre application soit constituée de fichiers statiques, d'une API JSON ou de pages dynamiques.

Dans la présentation que j'ai faite, je n'ai pas utilisé de frameworks. Si tel est votre souhait, sachez que Now se chargera de builder votre application pour vous. Que vous utilisiez React, Vue, Angular (ou leur dérivés Gatsby, Gridsom...).
Plus d'info par ici.

À travers cette présentation nous avons pu voir certains cas d'utilisations. Bien entendu, je vous invite à expérimenter par vous-même afin de voir l'étendu complète des possibilités de cet outil !

Cimer au valeureux Captain Tatane pour la relecture.

Merci de m'avoir lu.

Liens

Top comments (9)

Collapse
 
daviddalbusco profile image
David Dal Busco

Cool ton article 👍

T'as déjà mis en place un SSR pour une de tes apps avec now? Bien?

J'utilise principalement Firebase Hosting et je prerender mes apps, mais desfois j'me dis que ça serait pas si mal de passer à du SSR, du coup je serais pas contre un blog post à ce sujet 😉

Collapse
 
jeansmaug profile image
jean-smaug

Pas mis en place personnellement.
Mais j'avais pu lire des articles comme quoi les cloud fonctions de firebase te permettaient de faire du ssr.
J'imagine que c'est le mm principe pour Now.

Collapse
 
daviddalbusco profile image
David Dal Busco

Je dois dire j'ai jamais poussé plus loin avec Firebase, sûrement possible à travers des fonctions cloud ou genre. Il faudra que je mène l'enquête ;)

Collapse
 
fennecdjay profile image
Jérémie Astor

Un post en francais!!! 😄

Collapse
 
jeansmaug profile image
jean-smaug

C'est vrai que c'est assez rare :')

La raison : à part Grafikart et le SDZ les autres ressources quand j'ai commencé le dev m'étaient inaccessibles car l'anglais c'était pas vraiment ça...
Donc ça fait toujours un peu de contenu en plus pour les débutants ! :D

Rien à voir mais c'est un homonyme ou tu es bassiste dans ce groupe ? youtu.be/qUBqoFQ5O8A

Collapse
 
fennecdjay profile image
Jérémie Astor

LOL !!!
Je suis bien le bassiste de cette formation 😄
C'est peut etre indiscret (et mal formulé) mais comment tu connais ça?

Thread Thread
 
jeansmaug profile image
jean-smaug

Tout simple. J'ai cherché.
Dans ton profile j'ai vu que tu composais, après Google à fait le reste.

"C'est peut etre indiscret (et mal formulé)", vous dites dans votre texte que désormais vous ne lèverez plus le doigt pour vous exprimer. Pas besoin de t'inquiéter car tu poses une question ;)

Donc à mon tour de dire "Oh un groupe qui chante en français !!!" :)

Collapse
 
martinjeremyl profile image
martinjeremyl

Quel rapport avec Israël ?

Collapse
 
jeansmaug profile image
jean-smaug

Le triangle