‫Jonas: Come ultima parte di questa sezione,
‫parliamo di come NODE. I moduli JS funzionano effettivamente
‫dietro le quinte.
‫Prima di tutto nel NODE. Sistema di moduli
‫JS ogni file JavaScript viene trattato come un modulo separato.
‫E abbiamo già giocato un po' con
‫i moduli nell'intersezione,
‫specialmente usando la funzione require
‫ed esportando i dati dai moduli.
‫Quindi questi sono i fondamenti dei moduli Common JS, che
‫è il sistema di moduli utilizzato dal nodo.
‫Perché funziona particolarmente bene sul server.
‫Ora, c'è anche lo script ECMA nativo o
‫il sistema di moduli
‫ES con cui potresti già avere familiarità,
‫"specialmente se hai seguito il mio
‫corso JavaScript o se ultimamente
‫hai scritto JavaScript sul front-end.
‫Questo sistema di moduli ES di cui parlavo è stato
‫sviluppato per funzionare nel browser utilizzando la sintassi di importazione e esportazione.
‫Quindi, volevo solo chiarire che si tratta
‫di due diversi sistemi di moduli che
‫vedrai in
‫situazioni diverse, quindi non essere confuso.
‫Ci sono stati anche tentativi di implementare moduli
‫ES nativi in NODE. JS, "usando specialmente
‫estensioni di file come
‫. mj.
‫Ma finora, non è diventato
‫davvero una cosa popolare da usare.
‫Quindi, a meno che tu
‫non stia guardando questo
‫corso in un lontano futuro, probabilmente
‫utilizzerai sempre il sistema Common JS con node.
‫Ora, ti starai chiedendo perché in NODE. JS ogni
‫singolo modulo ottiene effettivamente l'accesso alla
‫funzione require per importare
‫i moduli in primo luogo.
‫Destra?
‫Voglio dire, non è una funzione JavaScript standard.
‫Allora da dove viene?
‫E come funziona esattamente dietro le quinte?
‫Bene, scopriamolo.
‫Quindi la domanda
‫qui è, cosa succede ogni
‫volta che richiediamo un modulo chiamando la
‫funzione require con un nome modulo, è l'argomento.
‫Come una panoramica molto
‫ampia, i seguenti passaggi vengono eseguiti dietro le quinte.
‫Innanzitutto, viene risolto il percorso del
‫modulo richiesto e il file viene caricato.
‫Quindi si verifica un processo chiamato wrapping,
‫il
‫codice del modulo viene eseguito
‫e vengono restituite le esportazioni del modulo.
‫E infine l'intero modulo viene memorizzato nella cache.
‫Quindi esaminiamo ora ogni passaggio in modo più dettagliato.
‫Prima di tutto, come fa il nodo a sapere quale file
‫caricare quando è richiesto un modulo?
‫Perché ricorda, possiamo effettivamente
‫caricare tre diversi tipi di moduli.
‫I moduli principali di
‫Node, i nostri moduli oi moduli di terze parti di npm
‫come express, che è il framework del nodo
‫che utilizzeremo per la maggior parte del corso.
‫Quindi questo processo è noto come risoluzione del percorso del file.
‫Ed ecco come funziona.
‫Quando le funzioni require ricevono il nome del
‫modulo come input,
‫proveranno prima a caricare un modulo principale con quel nome.
‫Come per esempio, il modulo http.
‫Troverà automaticamente un percorso per quel modulo
‫e quindi lo caricherà.
‫Ora, se il percorso inizia con un
‫punto o due
‫punti, significa che è un modulo sviluppatore.
‫Perché indichiamo il percorso relativo al nostro file.
‫Quindi il nodo proverà a caricare quel
‫file, ma se non ci sono file con
‫quel nome, cercherà invece una
‫cartella e caricherà index. js se è in quella cartella.
‫Quindi, in questo
‫esempio, proverà a caricare lib/controller. js.
‫Ricorda che possiamo eliminare il punto js
‫quando è richiesto un modulo.
‫Nel caso in cui non ci siano
‫file in questo percorso,
‫proverà invece ad aprire index. js dalla cartella lib/controller invece.
‫Ha senso?
‫E infine, se il modulo richiesto
‫non è né
‫un modulo principale, né un modulo
‫sviluppatore, il nodo presumerà che sia un modulo da npm.
‫E ricorda, su un modulo che carichiamo da npm, in realtà
‫non abbiamo bisogno di scrivere il percorso quando lo richiediamo.
‫Solo il nome
‫del modulo, proprio come funziona su un modulo principale.
‫Quindi questi moduli di terze parti sono archiviati
‫in una cartella del modulo
‫del nodo, quindi il nodo entrerà in quella cartella e proverà
‫a trovare un modulo lì e quindi lo caricherà.
‫E, naturalmente, se il file non può essere trovato
‫da nessuna parte, viene generato un errore e
‫l'esecuzione dell'app viene interrotta.
‫Andando avanti, dopo che il modulo è
‫stato caricato, il codice del modulo è racchiuso in una funzione
‫speciale che ci darà accesso a un paio di oggetti speciali.
‫Quindi questo passaggio è dove avviene la magia.
‫È qui che otteniamo la risposta alla domanda,
‫da dove viene effettivamente la funzione require e
‫perché abbiamo accesso ad essa?
‫È perché il runtime di
‫nodejs, toglie il
‫codice dal nostro modulo e lo inserisce
‫nell'espressione della funzione immediatamente invocata, o IIFE che puoi vedere qui.
‫Quindi il nodo in realtà
‫non esegue direttamente il codice che riscrivo in un
‫file, ma invece la funzione wrapper che conterrà
‫il nostro codice nel suo corpo.
‫Passa anche gli esperti richiedono il modulo, il
‫nome del file e gli oggetti dir in esso.
‫Ecco perché in ogni modulo
‫abbiamo automaticamente accesso
‫a cose come la funzione require.
‫Quindi queste sono fondamentalmente come variabili
‫globali che vengono iniettate in ogni singolo modulo.
‫Ora, in questo modo, node ottiene due cose molto importanti.
‫Innanzitutto, ovviamente, è dare agli sviluppatori l'accesso a
‫tutte queste variabili di cui abbiamo appena parlato,
‫il che è molto utile.
‫In secondo luogo, mantiene private le variabili di primo
‫livello che definiamo nei nostri moduli.
‫Quindi ha come ambito solo il
‫modulo corrente invece di perdere tutto nell'oggetto globale.
‫Quindi immagina per
‫un secondo di aver dichiarato una variabile x in uno dei
‫nostri moduli e quindi incluso un modulo npm che utilizzava
‫anche una variabile chiamata x.
‫Senza questo meccanismo,
‫la nostra variabile verrebbe sovrascritta
‫e l'intera app non funzionerebbe.
‫Quindi ogni modulo che ha il suo ambito
‫privato è assolutamente cruciale e si ottiene attraverso
‫questo astuto trucco di avvolgere il nostro codice in
‫questa funzione speciale.
‫Diamo ora una rapida occhiata a ciascun oggetto
‫ottenuto dal nostro modulo.
‫Innanzitutto la funzione require,
‫che già conosciamo.
‫Poi c'è un oggetto modulo, che
‫è solo un riferimento al modulo corrente e
‫che per noi è più
‫importante quando si tratta di esportare i dati.
‫Lo stesso vale per l'oggetto dell'esportazione
‫di cui parleremo tra poco.
‫Infine, ci sono le variabili
‫di convenienza nome file e nome directory
‫che contengono semplicemente il percorso
‫assoluto del file
‫del modulo corrente e il nome della directory corrente.
‫Ed è così che funziona la fase di wrapping del caricamento di un modulo.
‫Successivamente, il codice nel modulo, o
‫per essere più
‫precisi, nella funzione wrapper del modulo,
‫viene effettivamente eseguito dal NODE. runtime JS.
‫Quindi, niente di speciale qui.
‫Fino a questo
‫punto, la funzione require è stata chiamata con un
‫nome di modulo come argomento
‫il percorso del file del modulo è stato risolto in file
‫caricato, tutto il codice è stato racchiuso nella funzione
‫wrapper che è stata quindi eseguita.
‫Ora è il momento che la funzione
‫require restituisca effettivamente qualcosa.
‫E ciò che restituisce sono le esportazioni del modulo richiesto.
‫Queste esportazioni sono memorizzate nel modulo. esportare oggetti.
‫Potrebbe sembrare un po' così.
‫Quindi, di nuovo, in ogni modulo possiamo
‫esportare variabili, che alla fine verranno restituite dalla funzione require.
‫E lo facciamo assegnando variabili a module. exports o semplicemente alle esportazioni
‫dove è solo
‫un puntatore al modulo. esportare.
‫Lo faremo in pratica nel
‫prossimo video, perché so che suona un po'
‫confuso quando lo dico in questo modo.
‫Ad ogni modo, ecco cosa
‫devi sapere su quando usare il modulo. esportare o semplicemente esportare.
‫Quindi, se tutto ciò che vuoi fare è esportare una singola
‫variabile, come una classe o una funzione,
‫di solito usi module. exports e impostalo
‫uguale alla variabile che vuoi esportare.
‫Proprio come in questo esempio.
‫D'altra
‫parte, se stai cercando di esportare più
‫variabili denominate come più funzioni,
‫ad esempio,
‫dovresti crearle come proprietà dell'oggetto di esportazione.
‫Ad esempio, se stessimo realizzando un modulo calcolatrice, potresti
‫creare esportazioni. aggiungere, esportare.
‫moltiplicarsi, esportare. dividere e così via.
‫Ha senso?
‫Di nuovo, lo faremo nel prossimo video e
‫per allora avrà più senso per te.
‫Questo è effettivamente il modo in cui esportiamo e importiamo
‫i dati da un modulo all'altro.
‫Naturalmente, questo è anche il motivo per cui
‫di solito assegniamo il risultato di una funzione require chiamata a una nuova variabile.
‫In modo che possiamo salvare le esportazioni restituite.
‫Ora, solo per finire questo video molto
‫velocemente, l'ultimo passaggio è che i moduli vengono effettivamente memorizzati
‫nella cache dopo la prima volta che vengono caricati.
‫Ciò significa che se richiedi lo stesso
‫modulo più volte, otterrai sempre lo stesso risultato.
‫E il codice nei moduli viene effettivamente eseguito solo nella
‫prima chiamata.
‫Nelle chiamate successive,
‫il risultato viene semplicemente recuperato dalla cache.
‫Perfetto.
‫Quindi spero che tutta la logica
‫dietro il modo di
‫lavorare con i moduli non sembri più magica.
‫È davvero importante sapere come funziona tutto questo,
‫per diventare un grande,
‫e soprattutto, un NODO
‫più indipendente. Sviluppatore JS.