#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

tinyurl.com/yc48sbc5

#0ea5e9

Sky 500

Flash Me

DEVELOPMENT

DEVELOPMENT

WEB

WEB

Lorem Ipsum Dolor Sit Amet

Who's Who !?

FullStack JS Developer

d.chazoule@alltechconsulting.fr

GitHub

@dmnchzl

Damien Chazoule

Frontend Developer

m.vaudon@alltechconsulting.fr

GitHub

@maxime145

Maxime Vaudon

Chargé d'Affaires

r.lemaux@alltechconsulting.fr

LinkedIn

@rodolphe-le-maux

Rodolphe Le Maux-Millien

Business Manager

m.chaumeil@alltechconsulting.fr

LinkedIn

@marion-chaumeil

Marion Chaumeil

Lead Developer Frontend

m.gilet@alltechconsulting.fr

GitHub

@maximiliengilet

Maximilien Gilet

State Of The Art

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 !?

Par où commencer ?

Dev Community

FullStack Means...

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

Frontend Focus !

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

What About The Code ?

Frameworks

Langages de Prog.

Algorithmes

Structures de Données

Let's Talk About... Web !

JavaScript
HTML5

HTML

CSS3

CSS

A Tone Of... Tools !

Firefox Browser
Git
Node.js
npm
Visual Studio Code
Sass
ESLint
Prettier
Jest
Webpack

BROWSER

GIT

LINTER

(S)CSS

NODE

FORMATTER

NPM

EDITOR

BUNDLER

TESTS

Jest
Vitest
Webpack
Vite

FRAMEWORKS

FRAMEWORKS

FRONTEND

FRONTEND

"R" Is For... React !

React
React
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>
  );
}
Vue.js
Vue.js
<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>

"V" Is For... Vue !

Angular
Angular
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);
  }
}

"A" Is For... Angular !

Vite x Vitest

Vite
Vitest

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 !

React
Vue.js
Preact
Svelte
Solid

Bundle Based Server...

Native ESM Based Server...

BACKEND

BACKEND

FRAMEWORKS

FRAMEWORKS

"E" Is For... Express !

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'...");
});

"F" Is For... Fastify !

Fastify
Fastify
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'...");
});

Framework : Pros + / Cons -

Avantages

Architecture lourde

Couche de complexité

Mystifie les librairies sous le capot

Ce n'est pas un langage

Attention aux méta-frameworks

Inconvénients

La communauté open-source

Environnement moderne

Maintenabilité du code

Fonctionnalités clé en main

Gain de temps et d'efficacité

JavaScript réactif

Live Code

Serious

Content

read

_

write

app

_

_

Use Case :

Issues

#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"

FRAMEWORKS

FRAMEWORKS

NEXTGEN

NEXTGEN

"P" Is For... Preact !

Preact
Preact
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>
  );
}

"S" Is For... Svelte !

Svelte
Svelte
<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>

"S" Is For... Solid !

Solid
Solid
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>
  );
}

Atomic Design

ATOMS

MOLECULES

ORGANISMS

TEMPLATES

PAGES

(IONS)
DESIGN
TOKENS

PRODUCT

SYSTEM

"T" Is For... Tailwind !

Tailwind CSS
Tailwind CSS
<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>

Uncomplicated JS/TS With :

Firefox Browser
Git
Node.js
npm
Visual Studio Code
Sass
ESLint
Prettier

BROWSER

GIT

LINTER

(S)CSS

NODE

FORMATTER

NPM

EDITOR

BUNDLER

TESTS

Vitest
Vite
Node.js
Deno

DENO

Firefox Browser
Git
npm
Vim
CSS3
ESLint
Prettier

FRESH

GIT

LINT

CSS

FMT

JSR

EDITOR

BUNDLER

TEST

Vitest
Vite
Fresh
Deno
Deno
Deno
JSR

"D" Is For... Deno !

Deno
Deno
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);

Why Deno !?

(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

FRAMEWORKS

FRAMEWORKS

META

META

Nest

NestJS

Framework backend efficace, fiable et évolutif

$ npm i -g @nestjs/cli
$ nest new my-project

Basé sur l'architecture d'Angular (Modules)

HTTP Adapters :

Fastify

Authentification / Authorization / Passport Strategies

REST / GraphQL / WebSocket

OpenAPI (Swagger UI)

SECURITY

FEATURES

DOCS

SECURITY

FEATURES

DOCS

Next x Nuxt

Next.js
Nuxt.js

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

React

FEATURES

HYDRATATION

NEXT ONLY

FEATURES

HYDRATATION

NEXT ONLY

Nuxt is for

Vue.js

SEO friendly

Open-Source

JavaScript

IA For Developers...

Perplexity : Le moteur de recherche précis, fiable, en temps réel

Perplexity

Ollama : Le framework pour exécuter des modèles de langage

Ollama
Arc

Arc : L'alternative à Google Chrome

Warp

Warp : Le terminal ré-imaginé pour le travail collaboratif

SuperMaven : L'alternative à GitHub Copilot

HTTPie

HTTPie : Le client HTTP simple // intuitif

What's Next ?

La convergence des librairies Web : Vite

L'apport de Rust dans la performance applicative

Fine-Grained Reactivity :

De nouveaux standards : Deno / JSR

Signals

Angular

Signals !?

React

Runes

Svelte

Signals

Preact

Signals

Solid

Refs

Vue.js

Thanks !!!

Alltech Consulting

Created by potrace 1.15, written by Peter Selinger 2001-2017

NANTES

BORDEAUX

TOULOUSE

BAYONNE

NIORT

Expertise <Tech />

+180 collaborateurs

+100 Projets

5 Agences

Projets Web / Mobile

Créé en 2015

Sources

Sources

WEB

WEB

TIMELINE

TIMELINE

Tim Berners Lee

HTML / URI / HTTP

HTML 2.0

Brendan Eich

JavaScript

CSS

mise en style

ECMAScript (ES1)

W3C

HTML 3.2 - 4.0

1996

1997

1995

1990

THE BEGINNING

THE BEGINNING

2005

Jesse James Garret

Linus Torvals

AJAX

Git

2002

2000

1999

1998

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

2010

2011

2009

2006

2008

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

Google

ExpressJS

NPM

AngularJS

GitLab

ÉVOLUTIVITÉ

ÉVOLUTIVITÉ

2016

Google

ZEIT

Angular 2.0

Next / Nuxt

2015

2014

2013

2012

Evan You

VueJS

WHATWG

HTML 5.0

Hugo

Valeri Karpov

Microsoft

TypeScript

AngularJS 1.0

2nd static site gen

MEAN

Facebook

React

Google

Angular

Facebook

BabelJS

GraphQL

React Native

ES6...

a.k.a ES2015

Mozilla

Rust

DEV ORIENTÉ
COMPOSANT

DEV ORIENTÉ
COMPOSANT

JAMSTACK

JAMSTACK

2020

2021

2019

2017

2018

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

2022

2023

Astro

Jason Miller

Evan You

"Islands Architecture"

Preact Signals

ViteJS

Misko Hevery

Qwik

Angular Signals

Bun 1.0

WHAT'S NEXT !?

WHAT'S NEXT !?

2024

TC39

Proposal-Signals

Deno 2.0

WELCOME TO THE FUTURE

WELCOME TO THE FUTURE

React

18.3.x

npm

10.9.x

Node.js

22.11.x

HTML5

5.0

CSS3

3.0

Webpack

5.96.x

Google Chrome

132.0.x

Tailwind CSS

3.4.x

Firefox Browser

133.0.x

GraphQL

16.9.x

0.24.x

4.24.x

Vite

5.4.x

NestJS

10.4.x

Bun

1.1.x

pnpm

9.12.x

Yarn

4.5.x

Deno

2.0.x

TypeScript

5.6.x

Solid

1.9.x

Astro

4.16.x

Svelte

5.1.x

Preact

10.24.x

Nuxt.js

3.14.x

Angular

18.2.x

Vue.js

3.5.x

Next.js

15.0.x

Vitest

2.1.x

Jest

29.7.x

Playwright

1.48.x

Fastify

5.1.x

JavaScript

ES2024

1.9.x

Fresh

1.7.x

Web Development - 2024 Edition

By Damien Chazoule

Web Development - 2024 Edition

15th Mar. 2k24

  • 304