﻿1
00:00:01,390 --> 00:00:03,570
‫Jonas: Como última parte desta seção, vamos falar

2
00:00:03,570 --> 00:00:06,660
‫sobre como o NODE. Módulos JS realmente funcionam

3
00:00:06,660 --> 00:00:07,623
‫nos bastidores.

4
00:00:09,220 --> 00:00:11,980
‫Em primeiro lugar no NODE. Sistema de módulo

5
00:00:11,980 --> 00:00:15,660
‫JS cada arquivo JavaScript é tratado como um módulo separado.

6
00:00:15,660 --> 00:00:18,120
‫E já brincamos um pouco com

7
00:00:18,120 --> 00:00:19,722
‫os módulos na

8
00:00:19,722 --> 00:00:21,780
‫interseção, 'especialmente usando a função

9
00:00:21,780 --> 00:00:23,920
‫require e exportando dados dos módulos.

10
00:00:23,920 --> 00:00:27,150
‫Portanto, esses são os fundamentos dos módulos JS comuns, que é

11
00:00:27,150 --> 00:00:29,770
‫o sistema de módulos que o nó usa.

12
00:00:29,770 --> 00:00:33,010
‫Porque funciona especialmente bem no servidor.

13
00:00:33,010 --> 00:00:35,930
‫Agora, há também o script ECMA nativo ou sistema

14
00:00:35,930 --> 00:00:37,620
‫de módulo ES com

15
00:00:37,620 --> 00:00:39,870
‫o qual você já deve estar familiarizado,

16
00:00:39,870 --> 00:00:42,060
‫especialmente se você fez meu curso de

17
00:00:42,060 --> 00:00:43,950
‫JavaScript ou se tem escrito

18
00:00:43,950 --> 00:00:45,840
‫JavaScript no front end recentemente.

19
00:00:45,840 --> 00:00:49,270
‫Este sistema de módulo ES de que estava falando foi

20
00:00:49,270 --> 00:00:53,310
‫desenvolvido para funcionar no navegador usando a sintaxe de importação e exportação.

21
00:00:53,310 --> 00:00:55,640
‫Então, eu só queria deixar claro que esses

22
00:00:55,640 --> 00:00:57,980
‫são dois sistemas de módulos diferentes que você

23
00:00:57,980 --> 00:00:59,030
‫verá em

24
00:00:59,030 --> 00:01:00,950
‫diferentes situações, então não se confunda.

25
00:01:00,950 --> 00:01:03,110
‫Também houve tentativas de implementar módulos ES

26
00:01:03,110 --> 00:01:05,699
‫nativos no NODE. JS, 'especialmente usando

27
00:01:05,699 --> 00:01:07,280
‫extensões de arquivo

28
00:01:07,280 --> 00:01:09,130
‫como. mjs.

29
00:01:09,130 --> 00:01:10,870
‫Mas, até agora, não

30
00:01:10,870 --> 00:01:12,940
‫se tornou algo popular de usar.

31
00:01:12,940 --> 00:01:14,630
‫Portanto, a menos que você

32
00:01:14,630 --> 00:01:16,140
‫esteja acompanhando este curso

33
00:01:16,140 --> 00:01:17,970
‫em um futuro distante, provavelmente sempre

34
00:01:17,970 --> 00:01:20,223
‫usará o sistema JS comum com o nó.

35
00:01:21,070 --> 00:01:23,600
‫Agora, você deve estar se perguntando por que no NODE. Cada

36
00:01:23,600 --> 00:01:26,350
‫módulo JS realmente obtém acesso

37
00:01:26,350 --> 00:01:28,420
‫à função require para

38
00:01:28,420 --> 00:01:30,780
‫importar módulos em primeiro lugar.

39
00:01:30,780 --> 00:01:31,700
‫Direito?

40
00:01:31,700 --> 00:01:34,570
‫Quer dizer, não é uma função JavaScript padrão.

41
00:01:34,570 --> 00:01:36,040
‫Então de onde isso vem?

42
00:01:36,040 --> 00:01:39,080
‫E como isso funciona exatamente nos bastidores?

43
00:01:39,080 --> 00:01:40,763
‫Bem, vamos descobrir.

44
00:01:42,070 --> 00:01:43,780
‫Portanto, a questão aqui

45
00:01:43,780 --> 00:01:45,930
‫é: o que acontece cada vez

46
00:01:45,930 --> 00:01:48,540
‫que solicitamos um módulo, chamando a função

47
00:01:48,540 --> 00:01:51,620
‫require com um nome de módulo, é o argumento.

48
00:01:51,620 --> 00:01:53,270
‫Como uma visão geral

49
00:01:53,270 --> 00:01:56,270
‫muito ampla, as etapas a seguir são executadas nos bastidores.

50
00:01:56,270 --> 00:01:58,890
‫Primeiro, o caminho para o módulo

51
00:01:58,890 --> 00:02:01,600
‫necessário é resolvido e o arquivo é carregado.

52
00:02:01,600 --> 00:02:04,290
‫Em seguida, ocorre um processo chamado empacotamento,

53
00:02:04,290 --> 00:02:05,130
‫o

54
00:02:05,130 --> 00:02:07,210
‫código do módulo é executado

55
00:02:07,210 --> 00:02:09,760
‫e as exportações do módulo são retornadas.

56
00:02:09,760 --> 00:02:12,963
‫E, finalmente, todo o módulo é armazenado em cache.

57
00:02:14,300 --> 00:02:17,550
‫Portanto, vamos examinar cada etapa com mais detalhes.

58
00:02:17,550 --> 00:02:20,570
‫Em primeiro lugar, como o node sabe qual arquivo

59
00:02:20,570 --> 00:02:22,640
‫carregar quando precisamos de um módulo?

60
00:02:22,640 --> 00:02:24,970
‫Porque lembre-se, podemos realmente

61
00:02:24,970 --> 00:02:27,410
‫carregar três tipos diferentes de módulos.

62
00:02:27,410 --> 00:02:29,030
‫Módulos principais do Node,

63
00:02:29,030 --> 00:02:32,400
‫nossos próprios módulos ou módulos de terceiros do npm como

64
00:02:32,400 --> 00:02:34,990
‫express, que é a estrutura do nó que

65
00:02:34,990 --> 00:02:37,380
‫usaremos durante a maior parte do curso.

66
00:02:37,380 --> 00:02:40,940
‫Portanto, esse processo é conhecido como resolução do caminho do arquivo.

67
00:02:40,940 --> 00:02:42,820
‫E é assim que funciona.

68
00:02:42,820 --> 00:02:45,500
‫Quando as funções de requerimento recebem o nome do

69
00:02:45,500 --> 00:02:46,810
‫módulo como sua

70
00:02:46,810 --> 00:02:50,280
‫entrada, ela tentará primeiro carregar um módulo principal com esse nome.

71
00:02:50,280 --> 00:02:52,860
‫Como, por exemplo, o módulo http.

72
00:02:52,860 --> 00:02:55,570
‫Ele encontrará automaticamente um caminho para esse módulo e,

73
00:02:55,570 --> 00:02:57,130
‫em seguida, o carregará.

74
00:02:57,130 --> 00:02:59,150
‫Agora, se o caminho começa com um

75
00:02:59,150 --> 00:03:00,160
‫ponto, ou dois

76
00:03:00,160 --> 00:03:02,280
‫pontos, significa que é um módulo de desenvolvedor.

77
00:03:02,280 --> 00:03:06,010
‫Porque indicamos o caminho relativo ao nosso arquivo.

78
00:03:06,010 --> 00:03:08,380
‫Portanto, o node tentará carregar esse arquivo,

79
00:03:08,380 --> 00:03:11,130
‫mas se não houver nenhum arquivo com esse

80
00:03:11,130 --> 00:03:13,180
‫nome, ele procurará por uma pasta

81
00:03:13,180 --> 00:03:16,870
‫e carregará o índice. js se estiver nessa pasta.

82
00:03:16,870 --> 00:03:18,060
‫Portanto, neste exemplo,

83
00:03:18,060 --> 00:03:21,370
‫ele tentará carregar lib / controller. js.

84
00:03:21,370 --> 00:03:23,600
‫Lembre-se de que podemos descartar o ponto

85
00:03:23,600 --> 00:03:25,600
‫js ao exigir um módulo.

86
00:03:25,600 --> 00:03:28,570
‫Caso não haja nenhum arquivo neste

87
00:03:28,570 --> 00:03:30,360
‫caminho, ele tentará

88
00:03:30,360 --> 00:03:34,450
‫então abrir o índice. js da pasta lib / controlador em vez disso.

89
00:03:34,450 --> 00:03:35,900
‫Faz sentido?

90
00:03:35,900 --> 00:03:37,890
‫E, finalmente, se o módulo necessário

91
00:03:37,890 --> 00:03:39,330
‫não for um

92
00:03:39,330 --> 00:03:41,290
‫módulo central nem um módulo de

93
00:03:41,290 --> 00:03:44,470
‫desenvolvedor, o nó assumirá que é um módulo do npm.

94
00:03:44,470 --> 00:03:47,910
‫E lembre-se, em um módulo que carregamos do npm,

95
00:03:47,910 --> 00:03:51,050
‫não precisamos escrever o caminho quando o solicitamos.

96
00:03:51,050 --> 00:03:52,150
‫Apenas o nome

97
00:03:52,150 --> 00:03:55,130
‫do módulo, do jeito que funciona em um módulo principal.

98
00:03:55,130 --> 00:03:57,470
‫Portanto, esses módulos de terceiros são armazenados em

99
00:03:57,470 --> 00:03:59,250
‫uma pasta de módulo de

100
00:03:59,250 --> 00:04:02,280
‫nó, de modo que o nó irá entrar nessa pasta e

101
00:04:02,280 --> 00:04:04,960
‫tentar encontrar um módulo lá e, em seguida, carregá-lo.

102
00:04:04,960 --> 00:04:07,860
‫E, claro, se o arquivo não puder ser encontrado em

103
00:04:07,860 --> 00:04:10,410
‫nenhum lugar, um erro será gerado e a

104
00:04:10,410 --> 00:04:12,043
‫execução do aplicativo será interrompida.

105
00:04:13,861 --> 00:04:16,450
‫Seguindo em frente, depois que o

106
00:04:16,450 --> 00:04:20,230
‫módulo é carregado, o código do módulo é empacotado em

107
00:04:20,230 --> 00:04:24,098
‫uma função especial que nos dará acesso a alguns objetos especiais.

108
00:04:24,098 --> 00:04:27,370
‫Portanto, esta etapa é onde a mágica acontece.

109
00:04:27,370 --> 00:04:30,260
‫É aqui que obtemos a resposta à pergunta:

110
00:04:30,260 --> 00:04:33,290
‫de onde realmente vem a função require e por

111
00:04:33,290 --> 00:04:35,403
‫que temos acesso a ela?

112
00:04:36,290 --> 00:04:38,190
‫É porque o tempo de execução

113
00:04:38,190 --> 00:04:39,860
‫do nodejs tira o

114
00:04:39,860 --> 00:04:42,450
‫código de nosso módulo e o coloca dentro

115
00:04:42,450 --> 00:04:46,390
‫da expressão de função imediatamente chamada, ou IIFE, que você pode ver aqui.

116
00:04:46,390 --> 00:04:48,330
‫Portanto, o node não executa

117
00:04:48,330 --> 00:04:51,500
‫diretamente o código que reescrevo em um arquivo, mas,

118
00:04:51,500 --> 00:04:54,530
‫em vez disso, a função de empacotador que

119
00:04:54,530 --> 00:04:56,770
‫conterá nosso código em seu corpo.

120
00:04:56,770 --> 00:05:00,010
‫Ele também passa os especialistas exigem módulo,

121
00:05:00,010 --> 00:05:03,360
‫nome de arquivo e objetos dir para ele.

122
00:05:03,360 --> 00:05:05,820
‫É por isso que em cada

123
00:05:05,820 --> 00:05:07,730
‫módulo temos acesso

124
00:05:07,730 --> 00:05:10,450
‫automático a coisas como a função require.

125
00:05:10,450 --> 00:05:12,870
‫Portanto, são basicamente como variáveis

126
00:05:12,870 --> 00:05:15,703
‫globais que são injetadas em cada módulo.

127
00:05:17,150 --> 00:05:21,420
‫Agora, ao fazer isso, o nó atinge duas coisas muito importantes.

128
00:05:21,420 --> 00:05:24,010
‫Em primeiro lugar, é claro, é dar aos desenvolvedores

129
00:05:24,010 --> 00:05:26,450
‫acesso a todas essas variáveis de que acabamos de

130
00:05:26,450 --> 00:05:28,520
‫falar, o que é muito útil.

131
00:05:28,520 --> 00:05:31,160
‫Em segundo lugar, ele mantém as variáveis de nível

132
00:05:31,160 --> 00:05:33,320
‫superior que definimos em nossos módulos privadas.

133
00:05:33,320 --> 00:05:36,080
‫Portanto, seu escopo é apenas para o

134
00:05:36,080 --> 00:05:39,690
‫módulo atual, em vez de vazar tudo para o objeto global.

135
00:05:39,690 --> 00:05:41,060
‫Então imagine por

136
00:05:41,060 --> 00:05:44,640
‫um segundo, que declaramos uma variável x em um de nossos

137
00:05:44,640 --> 00:05:48,050
‫módulos e, em seguida, incluímos um módulo npm que também

138
00:05:48,050 --> 00:05:49,840
‫usava uma variável chamada x.

139
00:05:49,840 --> 00:05:51,640
‫Sem esse mecanismo,

140
00:05:51,640 --> 00:05:54,080
‫nossa própria variável seria substituída e

141
00:05:54,080 --> 00:05:56,600
‫o aplicativo inteiro simplesmente não funcionaria.

142
00:05:56,600 --> 00:05:59,370
‫Portanto, cada módulo com seu escopo privado

143
00:05:59,370 --> 00:06:01,950
‫é absolutamente crucial e é obtido por

144
00:06:01,950 --> 00:06:05,000
‫meio desse truque inteligente de agrupar nosso código

145
00:06:05,000 --> 00:06:06,423
‫nessa função especial.

146
00:06:08,080 --> 00:06:10,400
‫Vamos agora dar uma olhada rápida em cada

147
00:06:10,400 --> 00:06:11,960
‫objeto que nosso módulo obtém.

148
00:06:11,960 --> 00:06:13,710
‫Primeiro, a função require,

149
00:06:13,710 --> 00:06:15,290
‫que já conhecemos.

150
00:06:15,290 --> 00:06:17,260
‫Depois, existe um objeto módulo, que

151
00:06:17,260 --> 00:06:19,760
‫é apenas uma referência ao módulo atual e

152
00:06:19,760 --> 00:06:21,410
‫que para nós é

153
00:06:21,410 --> 00:06:23,800
‫o mais importante na hora de exportar dados.

154
00:06:23,800 --> 00:06:26,230
‫O mesmo se aplica ao objeto de

155
00:06:26,230 --> 00:06:28,520
‫exportação que discutiremos em um momento.

156
00:06:28,520 --> 00:06:30,490
‫Finalmente, existem as variáveis de

157
00:06:30,490 --> 00:06:33,150
‫conveniência nome do arquivo e nome do

158
00:06:33,150 --> 00:06:35,240
‫diretório que simplesmente contêm o caminho

159
00:06:35,240 --> 00:06:36,890
‫absoluto para o arquivo

160
00:06:36,890 --> 00:06:40,200
‫do módulo atual, bem como o nome do diretório atual.

161
00:06:40,200 --> 00:06:44,023
‫E é assim que funciona a etapa de empacotamento do carregamento de um módulo.

162
00:06:45,060 --> 00:06:47,280
‫Em seguida, o código no módulo, ou

163
00:06:47,280 --> 00:06:48,840
‫para ser mais preciso,

164
00:06:48,840 --> 00:06:50,940
‫na função de invólucro do módulo,

165
00:06:50,940 --> 00:06:54,240
‫é realmente executado pelo NODE. Tempo de execução JS.

166
00:06:54,240 --> 00:06:55,693
‫Portanto, nada extravagante aqui.

167
00:06:57,460 --> 00:06:58,810
‫Até este ponto,

168
00:06:58,810 --> 00:07:01,980
‫a função require foi chamada com um nome de

169
00:07:01,980 --> 00:07:03,559
‫módulo como o argumento

170
00:07:03,559 --> 00:07:07,200
‫o caminho para o arquivo do módulo foi resolvido no

171
00:07:07,200 --> 00:07:10,370
‫arquivo carregado, todo o código foi empacotado na função

172
00:07:10,370 --> 00:07:12,461
‫wrapper que foi então executada.

173
00:07:12,461 --> 00:07:15,190
‫Agora, é hora de a função

174
00:07:15,190 --> 00:07:17,320
‫require realmente retornar algo.

175
00:07:17,320 --> 00:07:21,840
‫E o que ele retorna são as exportações do módulo necessário.

176
00:07:21,840 --> 00:07:25,503
‫Essas exportações são armazenadas no módulo. exportaçõesobjetos.

177
00:07:26,860 --> 00:07:29,260
‫Pode ser um pouco assim.

178
00:07:29,260 --> 00:07:32,300
‫Portanto, novamente, em cada módulo podemos

179
00:07:32,300 --> 00:07:36,300
‫exportar variáveis, que, no final, serão retornadas pela função require.

180
00:07:36,300 --> 00:07:40,490
‫E fazemos isso atribuindo variáveis ao módulo. exportações ou simplesmente para exportações,

181
00:07:40,490 --> 00:07:42,190
‫onde é apenas

182
00:07:42,190 --> 00:07:45,600
‫um ponteiro para o módulo. exportar.

183
00:07:45,600 --> 00:07:47,600
‫Faremos isso na prática no

184
00:07:47,600 --> 00:07:50,250
‫próximo vídeo, porque eu sei que parece um

185
00:07:50,250 --> 00:07:52,270
‫pouco confuso quando eu digo assim.

186
00:07:52,270 --> 00:07:54,140
‫De qualquer forma, aqui está o que

187
00:07:54,140 --> 00:07:58,370
‫você precisa saber sobre quando usar o módulo. exportar ou apenas exportar.

188
00:07:58,370 --> 00:08:02,220
‫Portanto, se tudo o que você deseja fazer é exportar uma única

189
00:08:02,220 --> 00:08:04,460
‫variável, como uma classe ou uma função,

190
00:08:04,460 --> 00:08:07,890
‫geralmente usa o módulo. exporta e define-o igual

191
00:08:07,890 --> 00:08:10,050
‫à variável que você deseja exportar.

192
00:08:10,050 --> 00:08:12,010
‫Exatamente como neste exemplo.

193
00:08:12,010 --> 00:08:13,000
‫Por

194
00:08:13,000 --> 00:08:16,120
‫outro lado, se você estiver procurando exportar várias

195
00:08:16,120 --> 00:08:18,300
‫variáveis nomeadas como várias funções,

196
00:08:18,300 --> 00:08:19,330
‫por exemplo, você

197
00:08:19,330 --> 00:08:22,280
‫deve criá-las como propriedades do objeto de exportação.

198
00:08:22,280 --> 00:08:25,690
‫Por exemplo, se estivéssemos fazendo um módulo de calculadora, você poderia

199
00:08:25,690 --> 00:08:29,260
‫criar exportações. adicionar, exportações.

200
00:08:29,260 --> 00:08:32,490
‫multiplique, as exportações. dividir e assim por diante.

201
00:08:32,490 --> 00:08:33,560
‫Faz sentido?

202
00:08:33,560 --> 00:08:35,960
‫Mais uma vez, faremos isso no próximo vídeo e

203
00:08:35,960 --> 00:08:38,110
‫fará mais sentido para você até lá.

204
00:08:39,230 --> 00:08:42,530
‫É assim que exportamos e importamos dados

205
00:08:42,530 --> 00:08:44,980
‫de um módulo para outro.

206
00:08:44,980 --> 00:08:47,410
‫Obviamente, é também por isso que normalmente

207
00:08:47,410 --> 00:08:51,500
‫atribuímos o resultado de uma função de requerimento chamada a uma nova variável.

208
00:08:51,500 --> 00:08:54,003
‫Para que possamos salvar as exportações retornadas.

209
00:08:55,140 --> 00:08:57,570
‫Agora, só para terminar este vídeo bem rápido,

210
00:08:57,570 --> 00:09:00,500
‫a última etapa é que os módulos são realmente armazenados

211
00:09:00,500 --> 00:09:03,090
‫em cache após a primeira vez que são carregados.

212
00:09:03,090 --> 00:09:05,850
‫O que isso significa é que, se você precisar

213
00:09:05,850 --> 00:09:08,890
‫do mesmo módulo várias vezes, sempre obterá o mesmo resultado.

214
00:09:08,890 --> 00:09:12,490
‫E o código nos módulos é realmente executado apenas na

215
00:09:12,490 --> 00:09:13,640
‫primeira chamada.

216
00:09:13,640 --> 00:09:15,100
‫Em chamadas subsequentes,

217
00:09:15,100 --> 00:09:18,470
‫o resultado é simplesmente recuperado do cache.

218
00:09:18,470 --> 00:09:19,520
‫Perfeito.

219
00:09:19,520 --> 00:09:21,730
‫Espero que toda a lógica por

220
00:09:21,730 --> 00:09:23,390
‫trás de como

221
00:09:23,390 --> 00:09:25,860
‫trabalhar com módulos não pareça mais mágica.

222
00:09:25,860 --> 00:09:28,570
‫É muito importante saber como tudo isso funciona, para

223
00:09:28,570 --> 00:09:30,130
‫se tornar um grande e,

224
00:09:30,130 --> 00:09:31,390
‫acima de tudo, um

225
00:09:31,390 --> 00:09:33,833
‫NÓ mais independente. Desenvolvedor JS.

