Torna a Articoli
Mar 02, 2022
5 min read

È tempo di JS-Joda, ma attento al Lato Oscuro!

Pochi giorni fa vi abbiamo parlato di Moment.js, libreria JavaScript per gestire le date, e del perché non dovremmo più utilizzarla. Ma adesso?

Il maestro Yoda in mezzo al codice.

Questo articolo è stato scritto originariamente per Devmy, lo puoi trovare qui insieme a moltissimi altri articoli interessanti 😉

Pochi giorni fa vi abbiamo parlato di Moment.js, libreria JavaScript per gestire le date, e del perché non dovremmo più utilizzarla. Ma adesso?

Come già accennato, abbiamo a disposizione diverse alternative:

Quale libreria JS scegliere?

Tutte le soluzioni elencate sono estremamente valide: mettono a disposizione delle API immutabili e forniscono i file di definizione per TypeScript (a eccezione di Luxon che si appoggia a @types).

A questo punto dipende solo da quello di cui ha bisogno il nostro progetto: Performance? Integrazioni? Peso complessivo?

Queste statistiche possono aiutarci nella scelta:

Performance

Il grafico sottostante mostra il tempo medio che le librerie impiegano a svolgere le operazioni comuni di manipolazione.

Il piano cartesiano compara le varie librerie in millisecondi di esecuzione per le funzioni di parseISO, format YYYY-MM-DD, aggiunta di 2 anni a una data, diff in mesi, comparazione minore di. JS-Joda, rasenta lo zero in tutte le operazioni elencate con evidenti performance rispetto agli altri, a eccezione di parseISO che è più lento di tutti ma con pochissimo scarto. Altro dato interessante è Day.js che impiega un tempo eccessivo per eseguire la diff in mesi.

Stelle su GitHub

  • Day.js: 38k
  • date-fns: 28.1k
  • Luxon: 12.1k
  • JS-Joda: 1.8k

Pacchetti dipendenti

  • date-fns: 10k
  • Day.js: 6k
  • Luxon: 2.6k
  • JS-Joda: 68

Issues aperte

  • Day.js: 366
  • date-fns: 282
  • Luxon: 90
  • JS-Joda: 14

Dimensioni

  • Day.js: 2.8kb (minified, gzipped)
  • date-fns: 19.5kb (minified, gzipped)
  • Luxon: 20.9kb (minified, gzipped)
  • JS-Joda: 39.8kb (minified, gzipped)

Ognuna di queste librerie eccelle in qualcosa ma, tra tutte, quella che più ha attirato la nostra attenzione è JS-Joda (e non solo perché il nome somiglia a qualcuno che stimiamo profondamente…).

JS-Joda non ha un aspetto un po’ Javoso?

Forse perché questa utility è il porting del backport Threeten, che è la base per l’implementazione JSR-310 del pacchetto Java SE 8 java.time (mentre Threeten si ispira a Joda-Time, condividendo concetti molto simili se non lo stesso autore).

JS-Joda

Gestire le date è la via per il Lato Oscuro. Le date conducono all’ira, l’ira ai bug; il bug conduce alla sofferenza. Ah… sento molti bug in questo codice.

Considerata la più grande libreria Jedi dell’epoca, JS-Joda è uno dei più abili utilizzatori delle date nella storia della galassia. Basato sul sistema del calendario ISO, mette a nostra disposizione oggetti totalmente indipendenti dal nativo, semplici e immutabili. Grazie a queste caratteristiche è in grado di manipolare le date a suo piacimento, validare i formati influenzati dal lato Oscuro e formattare con grande vigore.

Dove si utilizza JS-Joda?

JS-Joda è una libreria Vanilla senza dipendenze di terze parti e può essere inclusa in qualsiasi progetto JavaScript (o TypeScript): questo perché le librerie Jedi sono chiamate a portare la pace e la giustizia su tutti gli Stack Node della galassia, soprattutto in quelli minacciati dal lato Oscuro delle Date e del context switching.

Perché dovrei usare JS-Joda?

Come già detto, la scelta di una libreria JavaScript dipende da quello di cui ha bisogno il nostro progetto. Ma ecco i motivi per i quali JS-Joda ha attirato la nostra attenzione:

  • Veloce: JS-Joda è estremamente veloce. È da 2 a 10 volte più veloce delle librerie competitor. 🚀

  • Leggero: Il pacchetto minificato e compresso pesa solo 43kb ed è privo di ulteriori dipendenze.

  • TypeScript: JS-Joda fornisce al suo utilizzatore il suo set di definizioni TypeScript, senza la necessità di appoggiarsi a progetti terzi come @types.

  • Standalone: JS-Joda implementa le sue entità temporali in maniera indipendente dall’oggetto nativo Date, al contrario di librerie come Moment.js o date-utils che fanno semplicemente da wrapper.

  • Immutabile: A differenza di Moment.js, JS-Joda è immutabile: i bug a causa di aliasing inaspettati non erano previsti nel suo addestramento.

  • Domain Driven Design: Le sue API sono modellate sulla base del Domain Driven Design, con classi per ciascuno dei diversi casi d’uso, come LocalDate, ZonedDateTime o Period.

  • Robusto: Questa libreria vanta più di 1700 test case eseguiti tramite karma su Firefox, Chrome, Node e Pantomjs, portandosi dietro le permutazioni di test del progetto Threetenbp.

Conclusioni

Nonostante non sia sulla vetta dei download più elevati di npm, JS-Joda è un’ottima libreria per la manipolazione di date, con API intuitive per l’utilizzatore e estremamente veloci a runtime.

Un enorme punto a favore (imho) è quello di derivare da Threeten e Joda-Time, ereditando tutta l’esperienza incapsulata nel loro codice e la vastità di casi d’uso raccolti nel tempo dall’enorme community di Java.

E poi, diciamolo, ha decisamente il nome più figo 😉.

Crediti

  • Immagine di copertina realizzata Simone Trovato Monastra ❤️
  • La revisione dei testi è a cura di Elena Costa ❤️
  • Il grafico delle Performance è stato preso da Best Moment.JS Alternatives di Jakub Kozak.