﻿1
00:00:01,390 --> 00:00:03,570
‫Jonas: Come ultima parte di questa sezione,

2
00:00:03,570 --> 00:00:06,660
‫parliamo di come NODE. I moduli JS funzionano effettivamente

3
00:00:06,660 --> 00:00:07,623
‫dietro le quinte.

4
00:00:09,220 --> 00:00:11,980
‫Prima di tutto nel NODE. Sistema di moduli

5
00:00:11,980 --> 00:00:15,660
‫JS ogni file JavaScript viene trattato come un modulo separato.

6
00:00:15,660 --> 00:00:18,120
‫E abbiamo già giocato un po' con

7
00:00:18,120 --> 00:00:19,722
‫i moduli nell'intersezione,

8
00:00:19,722 --> 00:00:21,780
‫specialmente usando la funzione require

9
00:00:21,780 --> 00:00:23,920
‫ed esportando i dati dai moduli.

10
00:00:23,920 --> 00:00:27,150
‫Quindi questi sono i fondamenti dei moduli Common JS, che

11
00:00:27,150 --> 00:00:29,770
‫è il sistema di moduli utilizzato dal nodo.

12
00:00:29,770 --> 00:00:33,010
‫Perché funziona particolarmente bene sul server.

13
00:00:33,010 --> 00:00:35,930
‫Ora, c'è anche lo script ECMA nativo o

14
00:00:35,930 --> 00:00:37,620
‫il sistema di moduli

15
00:00:37,620 --> 00:00:39,870
‫ES con cui potresti già avere familiarità,

16
00:00:39,870 --> 00:00:42,060
‫"specialmente se hai seguito il mio

17
00:00:42,060 --> 00:00:43,950
‫corso JavaScript o se ultimamente

18
00:00:43,950 --> 00:00:45,840
‫hai scritto JavaScript sul front-end.

19
00:00:45,840 --> 00:00:49,270
‫Questo sistema di moduli ES di cui parlavo è stato

20
00:00:49,270 --> 00:00:53,310
‫sviluppato per funzionare nel browser utilizzando la sintassi di importazione e esportazione.

21
00:00:53,310 --> 00:00:55,640
‫Quindi, volevo solo chiarire che si tratta

22
00:00:55,640 --> 00:00:57,980
‫di due diversi sistemi di moduli che

23
00:00:57,980 --> 00:00:59,030
‫vedrai in

24
00:00:59,030 --> 00:01:00,950
‫situazioni diverse, quindi non essere confuso.

25
00:01:00,950 --> 00:01:03,110
‫Ci sono stati anche tentativi di implementare moduli

26
00:01:03,110 --> 00:01:05,699
‫ES nativi in NODE. JS, "usando specialmente

27
00:01:05,699 --> 00:01:07,280
‫estensioni di file come

28
00:01:07,280 --> 00:01:09,130
‫. mj.

29
00:01:09,130 --> 00:01:10,870
‫Ma finora, non è diventato

30
00:01:10,870 --> 00:01:12,940
‫davvero una cosa popolare da usare.

31
00:01:12,940 --> 00:01:14,630
‫Quindi, a meno che tu

32
00:01:14,630 --> 00:01:16,140
‫non stia guardando questo

33
00:01:16,140 --> 00:01:17,970
‫corso in un lontano futuro, probabilmente

34
00:01:17,970 --> 00:01:20,223
‫utilizzerai sempre il sistema Common JS con node.

35
00:01:21,070 --> 00:01:23,600
‫Ora, ti starai chiedendo perché in NODE. JS ogni

36
00:01:23,600 --> 00:01:26,350
‫singolo modulo ottiene effettivamente l'accesso alla

37
00:01:26,350 --> 00:01:28,420
‫funzione require per importare

38
00:01:28,420 --> 00:01:30,780
‫i moduli in primo luogo.

39
00:01:30,780 --> 00:01:31,700
‫Destra?

40
00:01:31,700 --> 00:01:34,570
‫Voglio dire, non è una funzione JavaScript standard.

41
00:01:34,570 --> 00:01:36,040
‫Allora da dove viene?

42
00:01:36,040 --> 00:01:39,080
‫E come funziona esattamente dietro le quinte?

43
00:01:39,080 --> 00:01:40,763
‫Bene, scopriamolo.

44
00:01:42,070 --> 00:01:43,780
‫Quindi la domanda

45
00:01:43,780 --> 00:01:45,930
‫qui è, cosa succede ogni

46
00:01:45,930 --> 00:01:48,540
‫volta che richiediamo un modulo chiamando la

47
00:01:48,540 --> 00:01:51,620
‫funzione require con un nome modulo, è l'argomento.

48
00:01:51,620 --> 00:01:53,270
‫Come una panoramica molto

49
00:01:53,270 --> 00:01:56,270
‫ampia, i seguenti passaggi vengono eseguiti dietro le quinte.

50
00:01:56,270 --> 00:01:58,890
‫Innanzitutto, viene risolto il percorso del

51
00:01:58,890 --> 00:02:01,600
‫modulo richiesto e il file viene caricato.

52
00:02:01,600 --> 00:02:04,290
‫Quindi si verifica un processo chiamato wrapping,

53
00:02:04,290 --> 00:02:05,130
‫il

54
00:02:05,130 --> 00:02:07,210
‫codice del modulo viene eseguito

55
00:02:07,210 --> 00:02:09,760
‫e vengono restituite le esportazioni del modulo.

56
00:02:09,760 --> 00:02:12,963
‫E infine l'intero modulo viene memorizzato nella cache.

57
00:02:14,300 --> 00:02:17,550
‫Quindi esaminiamo ora ogni passaggio in modo più dettagliato.

58
00:02:17,550 --> 00:02:20,570
‫Prima di tutto, come fa il nodo a sapere quale file

59
00:02:20,570 --> 00:02:22,640
‫caricare quando è richiesto un modulo?

60
00:02:22,640 --> 00:02:24,970
‫Perché ricorda, possiamo effettivamente

61
00:02:24,970 --> 00:02:27,410
‫caricare tre diversi tipi di moduli.

62
00:02:27,410 --> 00:02:29,030
‫I moduli principali di

63
00:02:29,030 --> 00:02:32,400
‫Node, i nostri moduli oi moduli di terze parti di npm

64
00:02:32,400 --> 00:02:34,990
‫come express, che è il framework del nodo

65
00:02:34,990 --> 00:02:37,380
‫che utilizzeremo per la maggior parte del corso.

66
00:02:37,380 --> 00:02:40,940
‫Quindi questo processo è noto come risoluzione del percorso del file.

67
00:02:40,940 --> 00:02:42,820
‫Ed ecco come funziona.

68
00:02:42,820 --> 00:02:45,500
‫Quando le funzioni require ricevono il nome del

69
00:02:45,500 --> 00:02:46,810
‫modulo come input,

70
00:02:46,810 --> 00:02:50,280
‫proveranno prima a caricare un modulo principale con quel nome.

71
00:02:50,280 --> 00:02:52,860
‫Come per esempio, il modulo http.

72
00:02:52,860 --> 00:02:55,570
‫Troverà automaticamente un percorso per quel modulo

73
00:02:55,570 --> 00:02:57,130
‫e quindi lo caricherà.

74
00:02:57,130 --> 00:02:59,150
‫Ora, se il percorso inizia con un

75
00:02:59,150 --> 00:03:00,160
‫punto o due

76
00:03:00,160 --> 00:03:02,280
‫punti, significa che è un modulo sviluppatore.

77
00:03:02,280 --> 00:03:06,010
‫Perché indichiamo il percorso relativo al nostro file.

78
00:03:06,010 --> 00:03:08,380
‫Quindi il nodo proverà a caricare quel

79
00:03:08,380 --> 00:03:11,130
‫file, ma se non ci sono file con

80
00:03:11,130 --> 00:03:13,180
‫quel nome, cercherà invece una

81
00:03:13,180 --> 00:03:16,870
‫cartella e caricherà index. js se è in quella cartella.

82
00:03:16,870 --> 00:03:18,060
‫Quindi, in questo

83
00:03:18,060 --> 00:03:21,370
‫esempio, proverà a caricare lib/controller. js.

84
00:03:21,370 --> 00:03:23,600
‫Ricorda che possiamo eliminare il punto js

85
00:03:23,600 --> 00:03:25,600
‫quando è richiesto un modulo.

86
00:03:25,600 --> 00:03:28,570
‫Nel caso in cui non ci siano

87
00:03:28,570 --> 00:03:30,360
‫file in questo percorso,

88
00:03:30,360 --> 00:03:34,450
‫proverà invece ad aprire index. js dalla cartella lib/controller invece.

89
00:03:34,450 --> 00:03:35,900
‫Ha senso?

90
00:03:35,900 --> 00:03:37,890
‫E infine, se il modulo richiesto

91
00:03:37,890 --> 00:03:39,330
‫non è né

92
00:03:39,330 --> 00:03:41,290
‫un modulo principale, né un modulo

93
00:03:41,290 --> 00:03:44,470
‫sviluppatore, il nodo presumerà che sia un modulo da npm.

94
00:03:44,470 --> 00:03:47,910
‫E ricorda, su un modulo che carichiamo da npm, in realtà

95
00:03:47,910 --> 00:03:51,050
‫non abbiamo bisogno di scrivere il percorso quando lo richiediamo.

96
00:03:51,050 --> 00:03:52,150
‫Solo il nome

97
00:03:52,150 --> 00:03:55,130
‫del modulo, proprio come funziona su un modulo principale.

98
00:03:55,130 --> 00:03:57,470
‫Quindi questi moduli di terze parti sono archiviati

99
00:03:57,470 --> 00:03:59,250
‫in una cartella del modulo

100
00:03:59,250 --> 00:04:02,280
‫del nodo, quindi il nodo entrerà in quella cartella e proverà

101
00:04:02,280 --> 00:04:04,960
‫a trovare un modulo lì e quindi lo caricherà.

102
00:04:04,960 --> 00:04:07,860
‫E, naturalmente, se il file non può essere trovato

103
00:04:07,860 --> 00:04:10,410
‫da nessuna parte, viene generato un errore e

104
00:04:10,410 --> 00:04:12,043
‫l'esecuzione dell'app viene interrotta.

105
00:04:13,861 --> 00:04:16,450
‫Andando avanti, dopo che il modulo è

106
00:04:16,450 --> 00:04:20,230
‫stato caricato, il codice del modulo è racchiuso in una funzione

107
00:04:20,230 --> 00:04:24,098
‫speciale che ci darà accesso a un paio di oggetti speciali.

108
00:04:24,098 --> 00:04:27,370
‫Quindi questo passaggio è dove avviene la magia.

109
00:04:27,370 --> 00:04:30,260
‫È qui che otteniamo la risposta alla domanda,

110
00:04:30,260 --> 00:04:33,290
‫da dove viene effettivamente la funzione require e

111
00:04:33,290 --> 00:04:35,403
‫perché abbiamo accesso ad essa?

112
00:04:36,290 --> 00:04:38,190
‫È perché il runtime di

113
00:04:38,190 --> 00:04:39,860
‫nodejs, toglie il

114
00:04:39,860 --> 00:04:42,450
‫codice dal nostro modulo e lo inserisce

115
00:04:42,450 --> 00:04:46,390
‫nell'espressione della funzione immediatamente invocata, o IIFE che puoi vedere qui.

116
00:04:46,390 --> 00:04:48,330
‫Quindi il nodo in realtà

117
00:04:48,330 --> 00:04:51,500
‫non esegue direttamente il codice che riscrivo in un

118
00:04:51,500 --> 00:04:54,530
‫file, ma invece la funzione wrapper che conterrà

119
00:04:54,530 --> 00:04:56,770
‫il nostro codice nel suo corpo.

120
00:04:56,770 --> 00:05:00,010
‫Passa anche gli esperti richiedono il modulo, il

121
00:05:00,010 --> 00:05:03,360
‫nome del file e gli oggetti dir in esso.

122
00:05:03,360 --> 00:05:05,820
‫Ecco perché in ogni modulo

123
00:05:05,820 --> 00:05:07,730
‫abbiamo automaticamente accesso

124
00:05:07,730 --> 00:05:10,450
‫a cose come la funzione require.

125
00:05:10,450 --> 00:05:12,870
‫Quindi queste sono fondamentalmente come variabili

126
00:05:12,870 --> 00:05:15,703
‫globali che vengono iniettate in ogni singolo modulo.

127
00:05:17,150 --> 00:05:21,420
‫Ora, in questo modo, node ottiene due cose molto importanti.

128
00:05:21,420 --> 00:05:24,010
‫Innanzitutto, ovviamente, è dare agli sviluppatori l'accesso a

129
00:05:24,010 --> 00:05:26,450
‫tutte queste variabili di cui abbiamo appena parlato,

130
00:05:26,450 --> 00:05:28,520
‫il che è molto utile.

131
00:05:28,520 --> 00:05:31,160
‫In secondo luogo, mantiene private le variabili di primo

132
00:05:31,160 --> 00:05:33,320
‫livello che definiamo nei nostri moduli.

133
00:05:33,320 --> 00:05:36,080
‫Quindi ha come ambito solo il

134
00:05:36,080 --> 00:05:39,690
‫modulo corrente invece di perdere tutto nell'oggetto globale.

135
00:05:39,690 --> 00:05:41,060
‫Quindi immagina per

136
00:05:41,060 --> 00:05:44,640
‫un secondo di aver dichiarato una variabile x in uno dei

137
00:05:44,640 --> 00:05:48,050
‫nostri moduli e quindi incluso un modulo npm che utilizzava

138
00:05:48,050 --> 00:05:49,840
‫anche una variabile chiamata x.

139
00:05:49,840 --> 00:05:51,640
‫Senza questo meccanismo,

140
00:05:51,640 --> 00:05:54,080
‫la nostra variabile verrebbe sovrascritta

141
00:05:54,080 --> 00:05:56,600
‫e l'intera app non funzionerebbe.

142
00:05:56,600 --> 00:05:59,370
‫Quindi ogni modulo che ha il suo ambito

143
00:05:59,370 --> 00:06:01,950
‫privato è assolutamente cruciale e si ottiene attraverso

144
00:06:01,950 --> 00:06:05,000
‫questo astuto trucco di avvolgere il nostro codice in

145
00:06:05,000 --> 00:06:06,423
‫questa funzione speciale.

146
00:06:08,080 --> 00:06:10,400
‫Diamo ora una rapida occhiata a ciascun oggetto

147
00:06:10,400 --> 00:06:11,960
‫ottenuto dal nostro modulo.

148
00:06:11,960 --> 00:06:13,710
‫Innanzitutto la funzione require,

149
00:06:13,710 --> 00:06:15,290
‫che già conosciamo.

150
00:06:15,290 --> 00:06:17,260
‫Poi c'è un oggetto modulo, che

151
00:06:17,260 --> 00:06:19,760
‫è solo un riferimento al modulo corrente e

152
00:06:19,760 --> 00:06:21,410
‫che per noi è più

153
00:06:21,410 --> 00:06:23,800
‫importante quando si tratta di esportare i dati.

154
00:06:23,800 --> 00:06:26,230
‫Lo stesso vale per l'oggetto dell'esportazione

155
00:06:26,230 --> 00:06:28,520
‫di cui parleremo tra poco.

156
00:06:28,520 --> 00:06:30,490
‫Infine, ci sono le variabili

157
00:06:30,490 --> 00:06:33,150
‫di convenienza nome file e nome directory

158
00:06:33,150 --> 00:06:35,240
‫che contengono semplicemente il percorso

159
00:06:35,240 --> 00:06:36,890
‫assoluto del file

160
00:06:36,890 --> 00:06:40,200
‫del modulo corrente e il nome della directory corrente.

161
00:06:40,200 --> 00:06:44,023
‫Ed è così che funziona la fase di wrapping del caricamento di un modulo.

162
00:06:45,060 --> 00:06:47,280
‫Successivamente, il codice nel modulo, o

163
00:06:47,280 --> 00:06:48,840
‫per essere più

164
00:06:48,840 --> 00:06:50,940
‫precisi, nella funzione wrapper del modulo,

165
00:06:50,940 --> 00:06:54,240
‫viene effettivamente eseguito dal NODE. runtime JS.

166
00:06:54,240 --> 00:06:55,693
‫Quindi, niente di speciale qui.

167
00:06:57,460 --> 00:06:58,810
‫Fino a questo

168
00:06:58,810 --> 00:07:01,980
‫punto, la funzione require è stata chiamata con un

169
00:07:01,980 --> 00:07:03,559
‫nome di modulo come argomento

170
00:07:03,559 --> 00:07:07,200
‫il percorso del file del modulo è stato risolto in file

171
00:07:07,200 --> 00:07:10,370
‫caricato, tutto il codice è stato racchiuso nella funzione

172
00:07:10,370 --> 00:07:12,461
‫wrapper che è stata quindi eseguita.

173
00:07:12,461 --> 00:07:15,190
‫Ora è il momento che la funzione

174
00:07:15,190 --> 00:07:17,320
‫require restituisca effettivamente qualcosa.

175
00:07:17,320 --> 00:07:21,840
‫E ciò che restituisce sono le esportazioni del modulo richiesto.

176
00:07:21,840 --> 00:07:25,503
‫Queste esportazioni sono memorizzate nel modulo. esportare oggetti.

177
00:07:26,860 --> 00:07:29,260
‫Potrebbe sembrare un po' così.

178
00:07:29,260 --> 00:07:32,300
‫Quindi, di nuovo, in ogni modulo possiamo

179
00:07:32,300 --> 00:07:36,300
‫esportare variabili, che alla fine verranno restituite dalla funzione require.

180
00:07:36,300 --> 00:07:40,490
‫E lo facciamo assegnando variabili a module. exports o semplicemente alle esportazioni

181
00:07:40,490 --> 00:07:42,190
‫dove è solo

182
00:07:42,190 --> 00:07:45,600
‫un puntatore al modulo. esportare.

183
00:07:45,600 --> 00:07:47,600
‫Lo faremo in pratica nel

184
00:07:47,600 --> 00:07:50,250
‫prossimo video, perché so che suona un po'

185
00:07:50,250 --> 00:07:52,270
‫confuso quando lo dico in questo modo.

186
00:07:52,270 --> 00:07:54,140
‫Ad ogni modo, ecco cosa

187
00:07:54,140 --> 00:07:58,370
‫devi sapere su quando usare il modulo. esportare o semplicemente esportare.

188
00:07:58,370 --> 00:08:02,220
‫Quindi, se tutto ciò che vuoi fare è esportare una singola

189
00:08:02,220 --> 00:08:04,460
‫variabile, come una classe o una funzione,

190
00:08:04,460 --> 00:08:07,890
‫di solito usi module. exports e impostalo

191
00:08:07,890 --> 00:08:10,050
‫uguale alla variabile che vuoi esportare.

192
00:08:10,050 --> 00:08:12,010
‫Proprio come in questo esempio.

193
00:08:12,010 --> 00:08:13,000
‫D'altra

194
00:08:13,000 --> 00:08:16,120
‫parte, se stai cercando di esportare più

195
00:08:16,120 --> 00:08:18,300
‫variabili denominate come più funzioni,

196
00:08:18,300 --> 00:08:19,330
‫ad esempio,

197
00:08:19,330 --> 00:08:22,280
‫dovresti crearle come proprietà dell'oggetto di esportazione.

198
00:08:22,280 --> 00:08:25,690
‫Ad esempio, se stessimo realizzando un modulo calcolatrice, potresti

199
00:08:25,690 --> 00:08:29,260
‫creare esportazioni. aggiungere, esportare.

200
00:08:29,260 --> 00:08:32,490
‫moltiplicarsi, esportare. dividere e così via.

201
00:08:32,490 --> 00:08:33,560
‫Ha senso?

202
00:08:33,560 --> 00:08:35,960
‫Di nuovo, lo faremo nel prossimo video e

203
00:08:35,960 --> 00:08:38,110
‫per allora avrà più senso per te.

204
00:08:39,230 --> 00:08:42,530
‫Questo è effettivamente il modo in cui esportiamo e importiamo

205
00:08:42,530 --> 00:08:44,980
‫i dati da un modulo all'altro.

206
00:08:44,980 --> 00:08:47,410
‫Naturalmente, questo è anche il motivo per cui

207
00:08:47,410 --> 00:08:51,500
‫di solito assegniamo il risultato di una funzione require chiamata a una nuova variabile.

208
00:08:51,500 --> 00:08:54,003
‫In modo che possiamo salvare le esportazioni restituite.

209
00:08:55,140 --> 00:08:57,570
‫Ora, solo per finire questo video molto

210
00:08:57,570 --> 00:09:00,500
‫velocemente, l'ultimo passaggio è che i moduli vengono effettivamente memorizzati

211
00:09:00,500 --> 00:09:03,090
‫nella cache dopo la prima volta che vengono caricati.

212
00:09:03,090 --> 00:09:05,850
‫Ciò significa che se richiedi lo stesso

213
00:09:05,850 --> 00:09:08,890
‫modulo più volte, otterrai sempre lo stesso risultato.

214
00:09:08,890 --> 00:09:12,490
‫E il codice nei moduli viene effettivamente eseguito solo nella

215
00:09:12,490 --> 00:09:13,640
‫prima chiamata.

216
00:09:13,640 --> 00:09:15,100
‫Nelle chiamate successive,

217
00:09:15,100 --> 00:09:18,470
‫il risultato viene semplicemente recuperato dalla cache.

218
00:09:18,470 --> 00:09:19,520
‫Perfetto.

219
00:09:19,520 --> 00:09:21,730
‫Quindi spero che tutta la logica

220
00:09:21,730 --> 00:09:23,390
‫dietro il modo di

221
00:09:23,390 --> 00:09:25,860
‫lavorare con i moduli non sembri più magica.

222
00:09:25,860 --> 00:09:28,570
‫È davvero importante sapere come funziona tutto questo,

223
00:09:28,570 --> 00:09:30,130
‫per diventare un grande,

224
00:09:30,130 --> 00:09:31,390
‫e soprattutto, un NODO

225
00:09:31,390 --> 00:09:33,833
‫più indipendente. Sviluppatore JS.

