SlideShare una empresa de Scribd logo
1 de 78
Développer sereinement
• Gaëtan Maisse & Julien Giovaresco Snowcamp 2020
avec
Julien Gaëtan
@gaetanmaisse
TypeScript
Bière
@jgiovaresco
Java
Crossfit™
P.2
P.3
P.4
Overview
REST API
(25)
Management
interfaces
Store
Locators
(40+)
P.5
Décembre
2015
Début de la V3
P.7
Technos modernes
P.8
Technos modernes
Node.js
P.9
Technos modernes
Node.js(ES6)
P.10
Technos modernes
Node.js • MongoDB
P.11
Technos modernes
Node.js • MongoDB • Mongoose
P.12
Technos modernes
Node.js • MongoDB • Mongoose • Express
P.13
P.14
Qualité de code
P.15
Tests unitaires
Jasmine
P.16
Tests unitaires
100% couverture
P.17
Linter
P.18
Linter
ESLint
P.19
Revue de code
P.20
Revue de code
Pull Request
P.21
Revue de code
Pull Request • Code Owner
On met en prod ?
oui non
P.22
On met en prod ?
oui non
P.23
Avril
2016
Mise en production
(6 APIs)
Décembre
2015
Début de la V3
P.24
P.25
1er bug
(6 APIs)
Décembre
2015
Début de la V3
P.26
Avril
2016
Mise en production
(6 APIs)
1er bug
(6 APIs)
Décembre
2015
Début de la V3
P.27
Avril
2016
Mise en production
(6 APIs)
Avril
2016
P.28
P.29
P.30
Logging
Winston • JSON
P.31
Logging
Asynchrone • Mono thread
• Passer les attributs dans chaque méthode 
• Async Hooks API (experimental) 
• ¯_(ツ)_/¯
P.32
Comment ajouter des attributs à tous les
logs ?
Logging
• Identification des éléments qui peuvent aider au debug (différents identifiants….)
• Convention pour les nommer de la même façon
• Librairie interne
- Partage de la configuration du Logger à tous nos projets
- Outillage permettant de respecter les conventions
P.33
1er refactoring
(8 APIs)
Avril
2016
Mise en production
(6 APIs)
P.34
Avril
2016
1er Bug
(6 APIs)
Juin
2016
P.35
Refactoring
Renommage de variable -> Extraction de classe
Linter
PR & Revue de code
Tests unitaires
P.36
Avec tous ces tests, linters, CI, process
Tout va bien se passer !
P.37
P.38
Une des raisons ?
L’écriture de nos tests
P.39
Tests
proxyquire
P.40
const { categoriesApi } = require('../../onlineListing/yelster’);
class CategoryService {
find(country, language) {
return categoriesApi.findOnServer(country, language);
}
}
module.exports = CategoryService;
Source
P.41
const { categoriesApi } = require('../../onlineListing/yelster’);
class CategoryService {
find(country, language) {
return categoriesApi.findOnServer(country, language);
}
}
module.exports = CategoryService;
describe('CategoryService', () => {
const proxyquire = require('proxyquire');
let service;
beforeEach(() => {
const categoriesApi =
jasmine.createSpyObj('categoriesApi', [’findOnServer’])
.and
.returnValue(Promise.resolve([]));
const CategoryService = proxyquire('../../../../../src/lib/service/category/CategoryService', {
'../../onlineListing/yelster': { categoriesApi }
});
service = new CategoryService();
});
});
Source
Test
P.42
Tests
P.43
• Ajout de tests d’intégration
• Migration à Jest
- Snapshot testing
- Options : onlyChanged, watch failed
- Parallel workers
1ere Api en TS
(12 APIs)
Avril
2016
1er Bug
(6 APIs)
P.44
Juin
2016
1er refactoring
(8 APIs)
Février
2018
TypeScript
P.45
TypeScript
• Typage statique permettant un feedback immédiat :
- Pour notre code de production
- Pour le code des librairies externes
- Pour nos tests
• Fonctions de refactoring des IDE
• Lib TS -> Api JS
• Lib JS -> Api TS
P.46
"Avoir des types c’est bien.
Avoir des types juste c’est mieux."
Développeur Anonyme
P.48
TypeScript
• Chaque API expose un package de types publics
• Utilisés par les autres APIs et les applications fronts, pour le typage :
- Des paramètres de requêtes HTTP
- Des contenus des messages RabbitMQ
P.49
TypeScript
• Aucune vérification au runtime
• Utilisation de `io-ts`
const categoryQueryValidator = t.type({
categoryId: t.string,
country: t.string,
});
// validation succeeded
// => Right({"categoryId":"1","country":"fr" })
categoryQueryValidator.decode({ categoryId:"1", country:"fr" })
// validation failed
// => Left([...])
categoryQueryValidator.decode({ categoryId:1, country:"fr" })
P.50
TypeScript
• Aucune vérification au runtime
• Utilisation de `io-ts`
export type GetCategoryQueryAttributes = t.TypeOf<typeof categoryQueryValidator>;
P.51
Amélioration DX
(16 APIs)
Juin
2016
1er refactoring
(8 APIs)
P.52
Février
2018
1ere Api en TS
(12 APIs)
Juillet
2018
Linter
P.53
ESLint • TSLint
Linter
P.54
ESLint • TSLint
Linter
P.55
ESLint • CommitLint
Linter
P.56
ESLint • CommitLint • Prettier
Linter
P.57
ESLint • CommitLint • Prettier • Husky 🐶
Amélioration Run
(18 APIs)
Février
2018
1ere Api en TS
(12 APIs)
P.58
Juillet
2018
Amélioration DX
(16 APIs)
Octobre
2018
Docker image
• DockerFile naif
FROM node:10.14.1-jessie
ENV SRC_PATH /app
WORKDIR $SRC_PATH
RUN mkdir -p $SRC_PATH
COPY . $SRC_PATH
RUN yarn install
RUN yarn build
EXPOSE 8020
CMD ["node", "src/api-start.js"]
P.59
Docker image
• DockerFile naïf
• Problèmes
- Image volumineuse
- Téléchargement des dépendances à chaque
modification de code
1,21 Go
FROM node:10.14.1-jessie
ENV SRC_PATH /app
WORKDIR $SRC_PATH
RUN mkdir -p $SRC_PATH
COPY . $SRC_PATH
RUN yarn install
RUN yarn build
EXPOSE 8020
CMD ["node", "src/api-start.js"]
P.60
P.61
Docker’s building
Multi-stage builds
# Builder image
FROM node:10.14.1-jessie as builder
ARG NPM_TOKEN
ENV TEST_PATH /usr/bridge/bridge-api-pm
WORKDIR $TEST_PATH
COPY .npmrc package.json yarn.lock ./
RUN echo "//solocal.jfrog.io/solocal/api/npm/npm/:_authToken=${NPM_TOKEN}" >> .npmrc 
&& yarn install --pure-lockfile
COPY . $TEST_PATH
RUN yarn build-all
CMD yarn ci-validate && 
yarn codecov -f coverage-jest/lcov.info && 
yarn sonar
P.62
Multi-stage builds
# Runtime assets builder temp image
FROM node:10.14.0-alpine as production-builder
ARG NPM_TOKEN
ENV API_PATH /usr/bridge/bridge-api-pm
WORKDIR $API_PATH
COPY .npmrc package.json yarn.lock ./
RUN echo "//solocal.jfrog.io/solocal/api/npm/npm/:_authToken=${NPM_TOKEN}" >> .npmrc 
&& yarn install --pure-lockfile --prod --ignore-scripts
COPY --from=builder $API_PATH/tsconfig.json .
COPY --from=builder $API_PATH/dist/config config
COPY --from=builder $API_PATH/dist/src src
COPY --from=builder $API_PATH/dist/packages packages
COPY --from=builder $API_PATH/dist/migrations migrations
COPY --from=builder $API_PATH/dist/seeds seeds
COPY --from=builder $API_PATH/seeds/data seeds/data
RUN find . -name "*.test.js*" -delete 
&& find . -name "*.ts" -delete
P.63
Multi-stage builds
# Runtime image
FROM node:10.14.0-alpine as production
ENV API_PATH /usr/bridge/bridge-api-pm
WORKDIR $API_PATH
COPY --from=production-builder $API_PATH .
EXPOSE 8020
CMD ["node", "-r", "tsconfig-paths/register", "src/api-start.js"]
P.64
Multi-stage builds
# Runtime image
FROM node:10.14.0-alpine as production
ENV API_PATH /usr/bridge/bridge-api-pm
WORKDIR $API_PATH
COPY --from=production-builder $API_PATH .
EXPOSE 8020
CMD ["node", "-r", "tsconfig-paths/register", "src/api-start.js"]
P.65
143 Mo
Unhandled rejection
• Warning lorsqu’une promesse en erreur n’est pas
catchée
• Forcer l’arrêt du process Node dans ce cas
• Log pour aider au debug
process.on('unhandledRejection', error => {
logger.logUnhandledRejection(error);
throw error;
});
P.66
Gracefull shutdown
• Fermeture des connexions
process.on('SIGTERM', () => {
logger.info('Got SIGTERM. Graceful shutdown start');
Bluebird.each(
[
{ name: 'Http Server', closable: () => http.stop() },
{ name: 'Amqp', closable: () => amqp.close() },
{ name: 'Database', closable: () => db.disconnect() },
],
({ name, closable }) =>
Bluebird.try(closable).catch((error: Error) =>
logger.error('Unable to close properly', { name,
error }),
),
)
.finally(() => logger.close());
});
P.67
Inversify.js
(20 APIs)
Juillet
2018
Amélioration DX
(16 APIs)
P.68
Octobre
2018
Amélioration Run
(18 APIs)
Janvier
2019
Inversify JS
P.69
A powerful and lightweight
inversion of control container for
JavaScript & Node.js apps powered
by TypeScript.
https://inversify.io/
Inversify JS
P.70
// ninja.ts
import { injectable, inject } from 'inversify'
@injectable()
export class Ninja implements INinja {
constructor(
@inject(IKatana) private readonly katana: IKatana,
@inject(IShuriken) private readonly shuriken: IShuriken
) {
this.katana = katana;
this.shuriken = shuriken;
}
}
// inversify.config.ts
import { Container } from 'inversify'
import { INinja, Ninja } from './ninja'
import { IKatana, Katana } from './katana'
import { IShuriken, Shuriken } from './shuriken'
export const container = new Container()
container.bind<INinja>(INinja).to(Ninja)
container.bind<IKatana>(IKatana).to(Katana)
container.bind<IShuriken>(IShuriken).to(Shuriken)
Nest.JS
(23 APIs)
Octobre
2018
Amélioration Run
(18 APIs)
P.71
Janvier
2019
Inversify
(20 APIs)
Juin
2019
Nest js
P.72
• Même principes qu’Angular (module, service, ioc)
• TypeScript (utilisation massive de decorators)
• REST et Messaging
• Enfin un framework Node digne de ce nom
https://nestjs.com/
Nest js
P.73
• Assez jeune
• Il reste quelques bugs mais rien de bloquants
https://nestjs.com/
Snowcamp
(25 APIs)
Janvier
2019
Inversify
(20 APIs)
P.74
Juin
2019
Nest.js
(23 APIs)
Janvier
2020
Lightning version
Les +
• Légèreté
- Utilise peu de mémoire
- Rapide à démarrer
• Evolution rapide de Node.JS (V8)
• Outils intéressants
- Prettier
- Linters
P.76
Les -
P.77
• Sans TS ne pas se lancer dans une application d’envergure
• Ecosystème « amateur » : log, doc api, gestion dépendance
• Apprentissage potentiellement compliqué :
- Asynchronisme
- Debug
- Profiling
• Bibliothèque standard limitée
Merci
P.78
Questions ?
P.79

Más contenido relacionado

La actualidad más candente

CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads France
 
CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeadsRNS
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBTJean Detoeuf
 
Présentation de nodejs
Présentation de nodejsPrésentation de nodejs
Présentation de nodejs13p
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?Membré Guillaume
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another frameworkLAHAXE Arnaud
 
NodeJs, une introduction
NodeJs, une introductionNodeJs, une introduction
NodeJs, une introductionToxicode
 
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...mbrechet
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsNicolas Mussat
 
Utiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyXavier Gorse
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesosebiznext
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Fabien Arcellier
 
Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...
Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...
Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...Publicis Sapient Engineering
 
Event sourcing avec Kafka, UPEC
Event sourcing avec Kafka, UPECEvent sourcing avec Kafka, UPEC
Event sourcing avec Kafka, UPECSylia Baraka
 
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads France
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 

La actualidad más candente (20)

CocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - EpitezCocoaHeads Toulouse - Xcode et les tests - Epitez
CocoaHeads Toulouse - Xcode et les tests - Epitez
 
CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubs
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBT
 
Présentation de nodejs
Présentation de nodejsPrésentation de nodejs
Présentation de nodejs
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
NodeJs, une introduction
NodeJs, une introductionNodeJs, une introduction
NodeJs, une introduction
 
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...Gulp fiction, Builder, tester, livrer, sans tomber dans les poms  - breizhcam...
Gulp fiction, Builder, tester, livrer, sans tomber dans les poms - breizhcam...
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgents
 
Utiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec SymfonyUtiliser le Zend Framework avec Symfony
Utiliser le Zend Framework avec Symfony
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesos
 
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
Infra as Code, choisissez vous la pilule rouge ou la pilule bleue - Devoxx 2016
 
Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...
Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...
Paris Container Day 2016 : Conteneurisation de l’usine logicielle (Retour d'e...
 
Event sourcing avec Kafka, UPEC
Event sourcing avec Kafka, UPECEvent sourcing avec Kafka, UPEC
Event sourcing avec Kafka, UPEC
 
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
kubernetes, pourquoi et comment
kubernetes, pourquoi et commentkubernetes, pourquoi et comment
kubernetes, pourquoi et comment
 

Similar a Développer sereinement avec Node.js

Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Jean-Laurent de Morlhon
 
Introduction à Angularjs
Introduction à AngularjsIntroduction à Angularjs
Introduction à AngularjsRossi Oddet
 
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs WebUne visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs WebFrédéric Harper
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIHugo Hamon
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Quentin Adam
 
Java scripting api
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...Publicis Sapient Engineering
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Tugdual Grall
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 

Similar a Développer sereinement avec Node.js (20)

Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
Ou sont mes beans, contrats et workflows ? WOA et REST: Un changement de ment...
 
Introduction à Angularjs
Introduction à AngularjsIntroduction à Angularjs
Introduction à Angularjs
 
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs WebUne visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
Une visite guidée d’Internet Explorer 9 et HTML5 pour les développeurs Web
 
Gradle_LyonJUG
Gradle_LyonJUGGradle_LyonJUG
Gradle_LyonJUG
 
Intégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
DevFestBdm2019
DevFestBdm2019DevFestBdm2019
DevFestBdm2019
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
Café Numérique Arlon S03#02: Je code mon blog (EU code week Arlon)
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
Native script
Native scriptNative script
Native script
 

Développer sereinement avec Node.js

Notas del editor

  1. GAETAN & JULIEN
  2. JULIEN
  3. JULIEN
  4. Pourquoi Node.js /JS ? Même language Front et Back Apprentissage rapide pour les devs non web
  5. Pourquoi Mongo? Bonne perf en lecture Aggregation pratique pour faire des stats ? S’intègre bien avec JS, la creation des endpoints api qui lisent de la data très simplement (spoiler alert: fausse bonne idée)
  6. Pourquoi Mongoose ? Schema qui permet de valider les models
  7. Pourquoi Express ? - LA référence à l’époque
  8. GAETAN
  9. On partait de 0 donc on a bien fait attention à tester correctement nos apis. Nous avons choisi Jasmine comme framework. Il a l’avantage d’être tout en un. Contrairement à Mocha qui demande une librairie pour les expectations (chai par ex) et une autre pour jouer avec des mocks (sinon).
  10. ESLint Assure le respect de standard (single quote, point virgule en fin d’instruction, …) Evite les mauvaises pratiques (ex éviter de faire crasher l’application sur IE8 à cause des virgules sur le dernier élément d’un objet/tableau)
  11. JULIEN
  12. Et là le 1er bug arrive sans prévenir. On regarde nos logs dans Kibana et on ne comprend rien. On n’arrive pas à suivre ce qui se passe en prod. Vu que Node.JS est mono threadé les logs sont « mélangés » il est donc difficile de s’y retrouver.
  13. Et là le 1er bug arrive sans prévenir. On regarde nos logs dans Kibana et on ne comprend rien. On n’arrive pas à suivre ce qui se passe en prod. Vu que Node.JS est mono threadé les logs sont « mélangés » il est donc difficile de s’y retrouver.
  14. Partager
  15. GAETAN
  16. Pas de verif des variables Les tests qui etaient toujours verts (alors que tout était casse)
  17. Nous avons utilisé la lib proxyquire pour nous aider à « remplacer des dépendances des modules ». Ça nous a aidé à nous passer d’inversion de dépendance.
  18. Nous avions tous une expérience différente sur les tests unitaires. Certains plus que d’autres, les tests ont été écrit après l’implémentation et dans l’idée de mocker toutes les dépendances. Ça combinait avec l’objectif de 100% de coverage, on s’est retrouvé à écrire pas mal de tests mais on était fier de cette couverture !
  19. Manque de test d’integration => ajout quand le projet était encore en JS Migration vers Jest : - Snapshot testing -> super utile pour faire du refactoring - --onlyChanged ou watch avec seulement les tests failed MAIS TOUJOURS pas de typage
  20. Ne pas se reposer sur Typescript pour les donnees en entree d’API IO-TS
  21. Ne pas se reposer sur Typescript pour les donnees en entree d’API IO-TS
  22. Ne pas se reposer sur Typescript pour les donnees en entree d’API IO-TS
  23. JULIEN
  24. Remplacement par TSLint
  25. TSLint bientôt déprécié
  26. CommitLint pour garantir les standards sur la forme des commits ne fait pas tout reste à la charge du dev de réfléchir à comment synthétiser son commit
  27. Prettier plus de querelle de clocher pour savoir s’il faut mettre des points virgules… S’occupe de formater les fichers automatiquement
  28. Husky Permet de configurer facilement des hook GIT. Exemple:  exécution du ESLint et Prettier sur pre-commit (impossible de committer un fichier mal formaté) Exécution de Commitlint sur commit-msg (contrôle le message écrit par le dev) Ça n’empêche de configurer la CI pour s’assurer que tout va bien dans le cas où le dev by-pass ces validations
  29. K8S peut tuer des pods quand il veut. On veut s’assurer qu’on ferme l’application correctement
  30. GAETAN
  31. GAETAN
  32. Scope request non testable Bug injection avec des symbols
  33. GAETAN
  34. Légèreté Les apis utilisent peu de mémoire Elles sont rapides à démarrer ce qui est très pratique dans notre environnement élastique
  35. gestion dépendance -> monté de version mineur mais en fait non