Damien Chazoule
Développeur FullStack passionné d'informatique depuis plus d'une décennie
#f3f4f6
#374151
#1f2937
#1b2431
#111827
Gray 100
Gray 700
Gray 800
Gray 900
#10b981
#8b5cf6
#f43f5e
Emerald 500
Violet 500
Rose 500
#1b2431
#e7ad52
#e7ad52
#0ea5e9
Sky 500
FullStack JS Developer
d.chazoule@alltechconsulting.fr
@dmnchzl
Damien Chazoule
Frontend Developer
m.vaudon@alltechconsulting.fr
@maxime145
Maxime Vaudon
Chargé d'Affaires
r.lemaux@alltechconsulting.fr
@rodolphe-le-maux
Rodolphe Le Maux-Millien
Business Manager
m.chaumeil@alltechconsulting.fr
@marion-chaumeil
Marion Chaumeil
Lead Developer Frontend
m.gilet@alltechconsulting.fr
@maximiliengilet
Maximilien Gilet
Le Web, 30 ans plus tard...
2015 : L'expansion de l'écosystème JavaScript
HTML ? CSS ? Ou JavaScript !?
Et le typage dans tout cela...
Programmation impérative Vs. Programmation fonctionnelle
"Compilation" / Transpilation / Interprétation / WTF !?
DEVOPS
DATABASE
BACKEND
FRONTEND
MOBILE
Apache
Nginx
AWS
Azure
Git
Docker
Kubernetes
MySQL
Postgres
Oracle
MongoDB
Firebase
ElasticSearch
Java / SpringBoot
NodeJS / Express
Python / Django
C# / ASP .NET
PHP / Symphony
Go
Rust
Android / Kotlin
iOS / Swift
React Native
Ionic
Dart / Flutter
Native Script
HTML / CSS / JS
Angular
React
Vue
Tailwind
NextJS
NuxtJS
Astro / PWA
SPA*
STATIC SITE
JAMSTACK
SSR*
Angular
React
Vue
Preact
Svelte
Solid
NextJS
NuxtJS
SvelteKit
Analog
Gatsby
Gridsome
Strapi
PayloadCMS
Astro
Docusaurus
Eleventy (11ty)
VuePress
VitePress
Hugo
*SPA : Single Page App
*SSR : Server-Side Rendering
Frameworks
Langages de Prog.
Algorithmes
Structures de Données
HTML
CSS
BROWSER
GIT
LINTER
(S)CSS
NODE
FORMATTER
NPM
EDITOR
BUNDLER
TESTS
import React, { useState } from 'react';
import { BLUE } from './colors';
export default function CustomForm({ label, type = 'text' }) {
const [whois, setWhois] = useState('');
const handleSubmit = e => {
e.preventDefault();
console.log('whois:', whois);
};
return (
<form className="custom-form" onSubmit={handleSubmit}>
<div className="field" style={{ color: BLUE }}>
{label && <label htmlFor="whois">{label}</label>}
<input
id="whois"
type={type}
onChange={e => setWhois(e.target.value)}
/>
</div>
<button className="custom-btn" type="submit">Ok</button>
</form>
);
}
<script setup>
import { ref } from 'vue';
import { GREEN } from './colors';
defineProps({
label: String,
type: {
type: String,
default: 'text'
}
});
const whois = ref('');
const handleSubmit = () => console.log('whois:', whois.value);
</script>
<template>
<form class="custom-form" @submit.prevent="handleSubmit">
<div class="field" :style="{ color: GREEN }">
<label v-if="label" for="whois">{{ label }}</label>
<input id="whois" :type="type" @input="whois.value = $event.target.value">
</div>
<button class="custom-btn" type="submit">Ok</button>
</form>
</template>
import { Component, Input } from '@angular/core';
import { RED } from './colors';
@Component({
selector: 'custom-form',
template: `
<form class="custom-form" (submit)="handleSubmit($event)">
<div class="field" [style.color]="red">
@if (label) {
<label for="whois">{{ label }}</label>
}
<input id="whois" [type]="type" (input)="setWhois($event)">
</div>
<button class="custom-btn" type="submit">Ok</button>
</form>
`
})
export class CustomForm {
@Input() label?: string;
@Input() type = 'text';
whois = '';
get red(): string {
return RED;
}
setWhois(e: Event) {
this.whois = (e.target as HTMLInputElement).value;
}
handleSubmit(e: Event) {
e.preventDefault();
console.log('whois:', this.whois);
}
}
Outillage frontend moderne et rapide
Basé sur ES Modules, ESBuild + Rollup
Un "bundler" pour les gouverner tous :
Framework de tests unitaires ultra rapide
$ npm create vite@latest
$ npm install -D vitest @vitest/ui
Jest est mort, vive Vitest !
import express from 'express';
const server = express();
// application/json
server.use(express.json());
// application/x-www-form-urlencoded
server.use(express.urlencoded({ extended: true }));
server.get('/hello', (req, res) => {
res.json({ hello: 'world' });
});
server.post('/user', (req, res) => {
console.log(req.body);
res.status(201).send({ id: 'aGVsbG8=' });
});
server.listen(3000, err => {
if (err) process.exit(1);
console.log("Server Runnin'...");
});
import fastify from 'fastify';
const server = fastify({ logger: true });
server.get('/hello', (request, reply) => {
reply.send({ hello: 'world' })
});
server.post('/user', (request, reply) => {
reply.header("Access-Control-Allow-Origin", "*");
reply.header("Access-Control-Allow-Methods", "POST");
server.log.info(request.body);
reply.code(201).send({ id: 'aGVsbG8=' });
});
server.listen({ port: 3000 }, err => {
if (err) process.exit(1);
server.log.info("Server Runnin'...");
});
Architecture lourde
Couche de complexité
Mystifie les librairies sous le capot
Ce n'est pas un langage
Attention aux méta-frameworks
La communauté open-source
Environnement moderne
Maintenabilité du code
Fonctionnalités clé en main
Gain de temps et d'efficacité
JavaScript réactif
Serious
Content
#1 HomeView: Use "shortText" Rather Than "currentVersion['id']"
#2 EditView: Apply "bgColor.value"
#3 HomeView: Apply "darkMode"
#4 ColorPicker: New Component
#5 ColorPicker: Unit Testing
#6 StickyHeader: Persist "darkMode"
#7 EditView: Fix "defaultNote.currentVersion === undefined"
import { signal } from '@preact/signals';
import { PURPLE } from './colors';
const whois = signal('');
export default function CustomForm({ label, type = 'text' }) {
const handleSubmit = e => {
e.preventDefault();
console.log('whois:', whois.value);
};
return (
<form className="custom-form" onSubmit={handleSubmit}>
<div className="field" style={{ color: PURPLE }}>
{label && <label htmlFor="whois">{label}</label>}
<input
id="whois"
type={type}
onChange={e => (whois.value = e.target.value)}
/>
</div>
<button className="custom-btn" type="submit">Ok</button>
</form>
);
}
<script>
import { ORANGE } from './colors';
let { label, type = 'text' } = $props();
let whois = $state('');
const handleSubmit = e => {
e.preventDefault();
console.log('whois:', whois);
};
</script>
<form class="custom-form" onsubmit={handleSubmit}>
<div class="field" style:color={ORANGE}>
{#if label}
<label for="whois">{label}</label>
{/if}
<input id="whois" {type} oninput={e => (whois = e.target.value)}>
</div>
<button class="custom-btn" type="submit">Ok</button>
</form>
import { createSignal } from 'solid-js';
import { INDIGO } from './colors';
export default function CustomForm({ label, type = 'text' }) {
const [whois, setWhois] = createSignal('');
const handleSubmit = e => {
e.preventDefault();
console.log('whois:', whois());
};
return (
<form class="custom-form" onSubmit={handleSubmit}>
<div class="field" style={{ color: INDIGO }}>
{label && <label for="whois">{label}</label>}
<input
id="whois"
type={type}
onChange={e => setWhois(e.target.value)}
/>
</div>
<button class="custom-btn" type="submit">Ok</button>
</form>
);
}
ATOMS
MOLECULES
ORGANISMS
TEMPLATES
PAGES
(IONS)
DESIGN
TOKENS
PRODUCT
SYSTEM
<form class="flex flex-col space-y-4 p-4">
<div
class="flex space-x-2 hover:text-white hover:bg-['#06b6d4']"
style="color:#06b6d4;">
<label for="whois">WHOIS</label>
<input id="whois" type="text">
</div>
<button
class="mx-4 md:mx-auto py-2 px-4 rounded-full"
type="submit">
Ok
</button>
</form>
BROWSER
GIT
LINTER
(S)CSS
NODE
FORMATTER
NPM
EDITOR
BUNDLER
TESTS
DENO
FRESH
GIT
LINT
CSS
FMT
JSR
EDITOR
BUNDLER
TEST
const handler = async (req: Request): Promise<Response> => {
const url = new URL(req.url);
if (url.pathname === "/hello" && req.method === "GET") {
return new Response(JSON.stringify({ hello: "world" }));
}
if (url.pathname === "/user" && req.method === "POST") {
const body = await req.json();
console.log(body);
const response = new Response(JSON.stringify({ id: "aGVsbG8=" }), {
status: 201,
});
response.headers.set("Access-Control-Allow-Origin", "*");
response.headers.set("Access-Control-Allow-Methods", "POST");
return response;
}
return new Response(null, { status: 404 });
};
Deno.serve({ port: 3000 }, handler);
(Enfin) un environnement JavaScript "sécurisé"
Support natif de TypeScript, JSX/TSX, ESModules
Code Linter, Test Runner, Code Formatter
Conçu pour le développement Web
Rétro compatibilité Node / NPM
RUST
ZERO CONFIG
WEB APIs
RUST
ZERO CONFIG
WEB APIs
PACKAGE MANAGER
PACKAGE MANAGER
Framework backend efficace, fiable et évolutif
$ npm i -g @nestjs/cli
$ nest new my-project
Basé sur l'architecture d'Angular (Modules)
HTTP Adapters :
Authentification / Authorization / Passport Strategies
REST / GraphQL / WebSocket
OpenAPI (Swagger UI)
SECURITY
FEATURES
DOCS
SECURITY
FEATURES
DOCS
Frameworks fullstack intuitifs et performants
Pages Routing out-of-the-box
Server-Side Rendering / Time To Interactive
Rust : TurboPack x Speedy Web Compiler
Next is for
FEATURES
HYDRATATION
NEXT ONLY
FEATURES
HYDRATATION
NEXT ONLY
Nuxt is for
SEO friendly
Perplexity : Le moteur de recherche précis, fiable, en temps réel
Ollama : Le framework pour exécuter des modèles de langage
Arc : L'alternative à Google Chrome
Warp : Le terminal ré-imaginé pour le travail collaboratif
SuperMaven : L'alternative à GitHub Copilot
HTTPie : Le client HTTP simple // intuitif
La convergence des librairies Web : Vite
L'apport de Rust dans la performance applicative
Fine-Grained Reactivity :
De nouveaux standards : Deno / JSR
Signals
Signals !?
Runes
Signals
Signals
Refs
NANTES
BORDEAUX
TOULOUSE
BAYONNE
NIORT
Expertise <Tech />
+180 collaborateurs
+100 Projets
5 Agences
Projets Web / Mobile
Créé en 2015
Tim Berners Lee
HTML / URI / HTTP
HTML 2.0
Brendan Eich
JavaScript
CSS
mise en style
ECMAScript (ES1)
W3C
HTML 3.2 - 4.0
THE BEGINNING
THE BEGINNING
Jesse James Garret
Linus Torvals
AJAX
Git
Douglass Crockford
JSON
Roy Fielding
REST(ful)
W3C
XHTML
CSS 3.0
ES3
W3C
XML / DOM
Microsoft
XHR (ActiveX)
CSS 2.0
mise en forme
ES2
WEB 2.0
WEB 2.0
John Resig
jQuery
Jekyll
1st static site gen
GitHub
Chromium
V8
MongoDB
NoSQL
NodeJS
a.k.a ES3.1
Ryan Dahl
ES5...
Isaac Z. Schluester
ExpressJS
NPM
AngularJS
GitLab
ÉVOLUTIVITÉ
ÉVOLUTIVITÉ
ZEIT
Angular 2.0
Next / Nuxt
Evan You
VueJS
WHATWG
HTML 5.0
Hugo
Valeri Karpov
Microsoft
TypeScript
AngularJS 1.0
2nd static site gen
MEAN
React
Angular
BabelJS
GraphQL
React Native
ES6...
a.k.a ES2015
Mozilla
Rust
DEV ORIENTÉ
COMPOSANT
DEV ORIENTÉ
COMPOSANT
JAMSTACK
JAMSTACK
Netlify
JAMSTACK Conf
Gridsome
Ryan Dahl
Deno
Rich Harris
Svelte
ZEIT...
Polymer...
Evan You
Vercel !
Lit Element !
Ryan Carniato
MERN / MEVN
NestJS
static site gen
Kamil Mysliwiec
GatsbyJS
Native ESM
browser
static site gen
ViteJS
Solid
Katie Sylor-Miller
"Component Islands"
SEO
SEO
PERFORMANCE
PERFORMANCE
Astro
Jason Miller
Evan You
"Islands Architecture"
Preact Signals
ViteJS
Misko Hevery
Qwik
Angular Signals
Bun 1.0
WHAT'S NEXT !?
WHAT'S NEXT !?
TC39
Proposal-Signals
Deno 2.0
WELCOME TO THE FUTURE
WELCOME TO THE FUTURE
18.3.x
10.9.x
22.11.x
5.0
3.0
5.96.x
132.0.x
3.4.x
133.0.x
16.9.x
0.24.x
4.24.x
5.4.x
10.4.x
1.1.x
9.12.x
4.5.x
2.0.x
5.6.x
1.9.x
4.16.x
5.1.x
10.24.x
3.14.x
18.2.x
3.5.x
15.0.x
2.1.x
29.7.x
1.48.x
5.1.x
ES2024
1.9.x
1.7.x
By Damien Chazoule
15th Mar. 2k24
Développeur FullStack passionné d'informatique depuis plus d'une décennie