Reattività sul frontend

Signal cambia le regole del gioco
Marco Pollacci - 26/02/2025, Modena
Hello Folks!
me Marco Pollacci Senior Frontend Developer @GELLIFY
qr

📋 Agenda

spongebob-ready

La reattività nelle applicazioni web moderne

ᯓ🏃🏻‍♀️‍➡️
Il concetto di reattività è ormai diventato fondamentale nelle applicazioni web moderne
🔥 Vediamo alcuni vantaggi 🔥

🔥 Reattività 🔥

Ma come funziona la reattività?

In a nutshell 🐿️

Modifica dello Stato Change Detection Aggiornamento del DOM

La reattività nelle applicazioni Angular

angular logo old angular logo

...prima di Signal

(e non solo) 👀

Metodi di gestione dello stato

👀 RxJS (Observables)

🕵️‍♂️ Change Detection (Zone.js) ಥ﹏ಥ

Observable

🧐 Observable

🚀 Gli Observable sono oggetti appartenenti alla libreria RxJS.

🚀 Fanno parte del paradigma della programmazione denominata Reactive Pattern

🚀 Rappresentano un flusso di dati asincrono

🧐 Observable

🕵 Di questo paradigma fa parte anche l'Observer o Subscriber ed è colui che effettua la subscribe all'Observable
e che reagisce all'emissione di un valore in un dato momento nel tempo

🧐 Observable

Angular sfrutta questa libreria per aggiornare lo stato applicativo 🔄

...senza necessità di reload / refresh (ෆ˙ᵕ˙ෆ)♡

🧐 Observable: esempi di utilizzo

Some code 👨‍💻

    //...
    export class UserService {
      getUsers(): Observable<string[]> {
      return this.http.get<{ id: number, name: string }[]>(this.apiUrl).pipe(
        map(users => users.map(user => user.name)),
        catchError(error => {
              console.error('Errore durante il recupero degli utenti', error);
              return throwError(() => new Error('Errore nel recupero utenti'));
            })
      );
      }
    }

Some code 👨‍💻


    <ul>
      @for (user of users$ | async; track user) {
        <li>{{ user }}</li>
      }
    </ul>
  

Change Detection

...con Zone.js

Zone.js

E' una libreria che fornisce un contesto di esecuzione in cui viene eseguito il codice JavaScript

☢️ Zone.js - come funziona

Schematizzando 𓊍

Async Event (setTimeout) Zone.js intercetta l'evento Check di tutti componenti Aggiornamento interfaccia

Ed ora…Signal?

so-confused
“Signals are the primary means of managing state in your Solid application. They provide a way to store and update values, and are the foundation of reactivity in Solid. Signals can be used to represent any kind of state in your application, such as the current user, the current page, or the current theme. This can be any value, including primitive values such as strings and numbers, or complex values such as objects and arrays. ” https://docs.solidjs.com/concepts/signals

Ma chi usa Signal?

meme dilemma

📡 Signal

✔ SolidJS

✔ Angular

✔ Qwik

✔ Preact Signals

≈ Vue3

≈ React

🙌 Signal 🙌


    import {signal} from '@angular/core';
    //...
    export class AppComponent {
      myFirstSignal = signal<number>(1);

      constructor() {
        console.log('My first signal: ', this.myFirstSignal());
        // Output: My first signal: 1
      }
  
☝️

Un signal contiene sempre un valore


    import {signal} from '@angular/core';
    //...
    export class AppComponent {
      myFirstSignal = signal<number>();
    }
  
error signal no initial value

🤑 Consumer 🤑

🙌 Signal Consumer 🙌

Observable vs Signal

Observable vs Signal
  • ☝️Gli observable non sono obbligati ad emettere un valore alla creazione
  • ☝️Gli observable possono emettere i valori in maniera sincrona ed asincrona
  • ☝️Gli observable hanno il concetto di stato “complete”
  • ☝️Signal ha sempre almeno un valore dalla sua creazione
  • ☝️Signal non emette nulla se non la notifica di un cambio di valore, che deve essere “pulled” dal consumer
  • ☝️Signal non presenta il concetto di stato complete

⚛ React ⚛

Angular vs React? (¬_¬")

robert downey jr meme rolleyes

Gestione Reattività 🚀

Signal

fine-grained 🍚

React

coarse-grained 🪨

Gestione delle dipendenze reattive

useEffect() vs effect()

Signal

effect()
Gestione implicita

React

useEffect()
Gestione esplicita

Some code 👨‍💻


      //React
      useEffect(() => {
        console.log('Count changed:', count);
      }, [count]);
  
      //Angular
      effect(() => {
        console.log('Count changed:', this.count());
      });
    
  

Some code 👨‍💻


      //React
      useEffect(() => {
        console.log('Count changed:', count);
      }, []);
  
      //Angular
      effect(() => {
        untracked(() => {
          console.log('Count changed:', this.count())
        });
      });
lets-recap

Ogni tipo di operazione sincrona può essere effettuata con i signal 📡

🙌 Ad esempio 🙌

📡 Signal

thatsall

cssday 2025 - #accessibilità

marco-pollacci-css-day-2025
→ Codice sconto: speaker_10OFF ←

You can see this slide on

qrcode https://talk-reattivita-fe-signal.pages.dev/modena-full-stack

    export class EndOfTalkComponent {
      questions = input.required();
    
      constructor() {
        effect(() => {
          this.questions().forEach(async (question) => {
            console.log('The answer is: ', await this.answer(question))
          })
        })
      }
    }
  
Thank you again!
me Marco Pollacci Senior Frontend Developer @GELLIFY
Leave some feedback
qr