Retour

NestJS - Framework en Typescript

NestJS

Framework Backend Typescript

NestJS est un framework Typescript dont la philosophie emprunte beaucoup à Angular.

Cela lui permet de proposer une architecture plus modulaire et de produire des projets plus maintenables, extensibles et robustes qu’avec un développement NodeJS lambda.

Par rapport à Angular, il est complètement agnostique concernant le front, il est tout à fait possible d’utiliser NestJS pour bâtir une API, un front en React ou même une application CLI.

Si vous ajoutez à cela de très bonnes performances et une popularité grandissante, vous ne pouvez faire qu’un très bon choix en adoptant NestJs… :)

NestJS et Docker

On part du Hello World qu’on installe de la façon suivante :

npm i -g @nestjs/cli
nest new app

On ajoute ensuite le Dockerfile suivant :

FROM node:12-alpine

WORKDIR /app

COPY ./app .

RUN yarn; \
    yarn build

CMD ["yarn", "start:prod"]

Et le fichier .dockerignore suivant :

/app/node_modules
/app/dist

Cela permet d’éviter de mettre ces gros dossiers dans le contexte Docker et de les copier dans l’image.

Un problème de poids

L’image se contruit et se lance correctement :

docker build . -t nestjs
docker run --rm -it -p 3000:3000 nestjs

Par contre, l’image pèse 400 Mo !!! Pour un simple Hello World ?

Les nodes modules pèsent lourd

L’explication

L’image contient toutes les devDepencies et avec Typescript, elles pèsent lourd (les @types, le compilateur …)

La solution consiste à construire l’image Docker en 2 étapes :

  • la première pour compiler le Typescript.
  • la seconde pour installer les dépendences de production et servir le build.

On utilise pour cela le mécanisme du multistage build de Docker.

FROM node:12-alpine AS builder

WORKDIR /app

RUN npm install -g @nestjs/cli

COPY ./app /app

RUN yarn; \
  yarn build

FROM node:12-alpine

ENV NODE_ENV production

WORKDIR /app

COPY --from=builder /app/package.json .
COPY --from=builder /app/yarn.lock .
COPY --from=builder /app/dist ./dist

RUN yarn

CMD ["yarn", "start:prod"]

L’image finale ne contient donc que le dist et les dépendances de production.

Le résultat : une image de … 264 Mo !! Mieux, mais encore très décevant …

Supprimer le cache

Voici les tailles de chaque élément de l’image Docker :

  • l’image de base node:12-alpine : 85Mo
  • le répertoire node_modules : 35Mo
  • le répertoire dist : < 1Mo

Le reste ? En fait, il s’agit du cache de yarn qui peut être supprimé dans la dernière commande RUN du Dockerfile.

RUN yarn; \
    yarn cache clean

CMD ["yarn", "start:prod"]

Enfin, nous obtenons une image d’une taille raisonnable : 100Mo tout rond.

Voilà vous pouvez maintenant utiliser NestJS dans vos micro-services hébergés sur Kubernetes !