Essenzialmente, si riduce a come ottenere due sistemi di moduli molto diversi per lavorare insieme. I moduli CommonJS (CJS) sono dinamici e caricati in modo sincrono, i moduli ES sono statici, immutabili e caricati in modo asincrono. Ma nessuno vuole rompere l'ecosistema del Nodo, il che significa che vogliamo essere in grado di caricare moduli CJS da moduli ES e viceversa, idealmente senza che l'utente debba sapere quale tipo di moduli utilizza un pacchetto. (Al momento non è possibile caricare i moduli ES dai moduli CJS, che richiederà una nuova funzione di caricamento asincrona.) Alcune persone vogliono anche essere in grado di pubblicare pacchetti con esportazioni in entrambi i tipi di modulo.
I browser non avevano alcun tipo di modulo in precedenza, quindi non dovevano far cooperare i moduli ES con nulla. Potrebbero semplicemente eseguire un'implementazione semplice.
Qualsiasi sistema di moduli in ambienti così diversi come browser e Node avranno alcuni casi complicati. Anche se con --experimental-modules
flag l'implementazione dei moduli ES del Node è in gran parte uguale a quella di un browser, ci sono ancora differenze. Ad esempio, i browser caricheranno solo da URL completi, ma il Nodo caricherà pacchetti da node_modules
con solo un nome di pacchetto.