﻿1
00:00:01,390 --> 00:00:03,570
‫Jonas: Como última parte de esta sección,

2
00:00:03,570 --> 00:00:06,660
‫hablemos de cómo NODE. Los módulos JS realmente funcionan

3
00:00:06,660 --> 00:00:07,623
‫detrás de escena.

4
00:00:09,220 --> 00:00:11,980
‫Primero que nada en el NODO. Sistema de módulos

5
00:00:11,980 --> 00:00:15,660
‫JS cada archivo JavaScript se trata como un módulo separado.

6
00:00:15,660 --> 00:00:18,120
‫Y ya jugamos un poco con los

7
00:00:18,120 --> 00:00:19,722
‫módulos en la

8
00:00:19,722 --> 00:00:21,780
‫intersección, 'especialmente usando la función require

9
00:00:21,780 --> 00:00:23,920
‫y exportando datos de los módulos.

10
00:00:23,920 --> 00:00:27,150
‫Así que esos son los fundamentos de los módulos Common JS, que

11
00:00:27,150 --> 00:00:29,770
‫es el sistema de módulos que usa el nodo.

12
00:00:29,770 --> 00:00:33,010
‫Porque funciona especialmente bien en el servidor.

13
00:00:33,010 --> 00:00:35,930
‫Ahora, también existe el script ECMA nativo o el

14
00:00:35,930 --> 00:00:37,620
‫sistema de módulos ES

15
00:00:37,620 --> 00:00:39,870
‫con el que quizás ya esté familiarizado,

16
00:00:39,870 --> 00:00:42,060
‫especialmente si tomó mi curso de JavaScript

17
00:00:42,060 --> 00:00:43,950
‫o si ha estado escribiendo

18
00:00:43,950 --> 00:00:45,840
‫JavaScript en la interfaz últimamente.

19
00:00:45,840 --> 00:00:49,270
‫Este sistema de módulo ES del que estaba hablando fue

20
00:00:49,270 --> 00:00:53,310
‫desarrollado para funcionar en el navegador usando la sintaxis de importación y exportación.

21
00:00:53,310 --> 00:00:55,640
‫Entonces, solo quería dejar en claro que estos

22
00:00:55,640 --> 00:00:57,980
‫son dos sistemas de módulos diferentes que verá

23
00:00:57,980 --> 00:00:59,030
‫en diferentes

24
00:00:59,030 --> 00:01:00,950
‫situaciones, así que no se confunda.

25
00:01:00,950 --> 00:01:03,110
‫También ha habido intentos de implementar módulos

26
00:01:03,110 --> 00:01:05,699
‫ES nativos en NODE. JS ', especialmente

27
00:01:05,699 --> 00:01:07,280
‫usando extensiones de archivo

28
00:01:07,280 --> 00:01:09,130
‫como. mjs.

29
00:01:09,130 --> 00:01:10,870
‫Pero hasta ahora, no se

30
00:01:10,870 --> 00:01:12,940
‫ha convertido en algo muy popular.

31
00:01:12,940 --> 00:01:14,630
‫Entonces, a menos que esté

32
00:01:14,630 --> 00:01:16,140
‫viendo este curso

33
00:01:16,140 --> 00:01:17,970
‫en un futuro lejano, probablemente siempre

34
00:01:17,970 --> 00:01:20,223
‫usará el sistema Common JS con node.

35
00:01:21,070 --> 00:01:23,600
‫Ahora, es posible que se pregunte por qué en NODE. JS todos

36
00:01:23,600 --> 00:01:26,350
‫y cada uno de los módulos tienen

37
00:01:26,350 --> 00:01:28,420
‫acceso a la función require

38
00:01:28,420 --> 00:01:30,780
‫para importar módulos en primer lugar.

39
00:01:30,780 --> 00:01:31,700
‫¿Derecha?

40
00:01:31,700 --> 00:01:34,570
‫Quiero decir, no es una función estándar de JavaScript.

41
00:01:34,570 --> 00:01:36,040
‫¿Entonces de donde viene?

42
00:01:36,040 --> 00:01:39,080
‫¿Y cómo funciona exactamente entre bastidores?

43
00:01:39,080 --> 00:01:40,763
‫Bueno, averigüémoslo.

44
00:01:42,070 --> 00:01:43,780
‫Entonces, la pregunta aquí

45
00:01:43,780 --> 00:01:45,930
‫es, qué sucede cada vez que

46
00:01:45,930 --> 00:01:48,540
‫requerimos un módulo llamando a la función

47
00:01:48,540 --> 00:01:51,620
‫require con un nombre de módulo, es el argumento.

48
00:01:51,620 --> 00:01:53,270
‫Como una descripción general

49
00:01:53,270 --> 00:01:56,270
‫muy amplia, los siguientes pasos se ejecutan detrás de escena.

50
00:01:56,270 --> 00:01:58,890
‫Primero, se resuelve la ruta al

51
00:01:58,890 --> 00:02:01,600
‫módulo requerido y se carga el archivo.

52
00:02:01,600 --> 00:02:04,290
‫Luego, ocurre un proceso llamado empaquetado, se

53
00:02:04,290 --> 00:02:05,130
‫ejecuta

54
00:02:05,130 --> 00:02:07,210
‫el código del módulo y

55
00:02:07,210 --> 00:02:09,760
‫se devuelven las exportaciones del módulo.

56
00:02:09,760 --> 00:02:12,963
‫Y finalmente todo el módulo se almacena en caché.

57
00:02:14,300 --> 00:02:17,550
‫Así que veamos ahora cada paso con más detalle.

58
00:02:17,550 --> 00:02:20,570
‫En primer lugar, ¿cómo sabe el nodo qué archivo

59
00:02:20,570 --> 00:02:22,640
‫cargar cuando necesitamos un módulo?

60
00:02:22,640 --> 00:02:24,970
‫Porque recuerde, en realidad podemos

61
00:02:24,970 --> 00:02:27,410
‫cargar tres tipos diferentes de módulos.

62
00:02:27,410 --> 00:02:29,030
‫Los módulos centrales de

63
00:02:29,030 --> 00:02:32,400
‫Node, nuestros propios módulos o módulos de terceros de npm como

64
00:02:32,400 --> 00:02:34,990
‫express, que es el marco de nodo que

65
00:02:34,990 --> 00:02:37,380
‫usaremos durante la mayor parte del curso.

66
00:02:37,380 --> 00:02:40,940
‫Entonces, este proceso se conoce como resolución de la ruta del archivo.

67
00:02:40,940 --> 00:02:42,820
‫Y así es como funciona.

68
00:02:42,820 --> 00:02:45,500
‫Cuando las funciones obligatorias reciben el nombre

69
00:02:45,500 --> 00:02:46,810
‫del módulo como

70
00:02:46,810 --> 00:02:50,280
‫entrada, primero intentará cargar un módulo principal con ese nombre.

71
00:02:50,280 --> 00:02:52,860
‫Como por ejemplo, el módulo http.

72
00:02:52,860 --> 00:02:55,570
‫Automáticamente encontrará una ruta a ese módulo

73
00:02:55,570 --> 00:02:57,130
‫y luego lo cargará.

74
00:02:57,130 --> 00:02:59,150
‫Ahora bien, si la ruta comienza con un

75
00:02:59,150 --> 00:03:00,160
‫punto, o dos

76
00:03:00,160 --> 00:03:02,280
‫puntos, significa que es un módulo de desarrollador.

77
00:03:02,280 --> 00:03:06,010
‫Porque indicamos la ruta relativa a nuestro archivo.

78
00:03:06,010 --> 00:03:08,380
‫Por lo tanto, el nodo intentará cargar ese

79
00:03:08,380 --> 00:03:11,130
‫archivo, pero si no hay ningún archivo con ese

80
00:03:11,130 --> 00:03:13,180
‫nombre, buscará una carpeta en su

81
00:03:13,180 --> 00:03:16,870
‫lugar y cargará el índice. js si está en esa carpeta.

82
00:03:16,870 --> 00:03:18,060
‫Entonces, en este

83
00:03:18,060 --> 00:03:21,370
‫ejemplo, intentará cargar lib / controller. js.

84
00:03:21,370 --> 00:03:23,600
‫Recuerde que podemos eliminar el punto

85
00:03:23,600 --> 00:03:25,600
‫js cuando necesitemos un módulo.

86
00:03:25,600 --> 00:03:28,570
‫En caso de que no haya ningún

87
00:03:28,570 --> 00:03:30,360
‫archivo en esta

88
00:03:30,360 --> 00:03:34,450
‫ruta, intentará abrir index. js de la carpeta lib / controller en su lugar.

89
00:03:34,450 --> 00:03:35,900
‫¿Tener sentido?

90
00:03:35,900 --> 00:03:37,890
‫Y finalmente, si el módulo requerido

91
00:03:37,890 --> 00:03:39,330
‫no es un

92
00:03:39,330 --> 00:03:41,290
‫módulo central ni un módulo de

93
00:03:41,290 --> 00:03:44,470
‫desarrollador, node asumirá que es un módulo de npm.

94
00:03:44,470 --> 00:03:47,910
‫Y recuerde, en un módulo que cargamos desde npm, en

95
00:03:47,910 --> 00:03:51,050
‫realidad no necesitamos escribir la ruta cuando lo necesitemos.

96
00:03:51,050 --> 00:03:52,150
‫Solo el nombre

97
00:03:52,150 --> 00:03:55,130
‫del módulo, tal y como funciona en un módulo principal.

98
00:03:55,130 --> 00:03:57,470
‫Entonces, estos módulos de terceros se almacenan en

99
00:03:57,470 --> 00:03:59,250
‫una carpeta de módulo de

100
00:03:59,250 --> 00:04:02,280
‫nodo, por lo que el nodo ingresará a esa carpeta e

101
00:04:02,280 --> 00:04:04,960
‫intentará encontrar un módulo allí y luego lo cargará.

102
00:04:04,960 --> 00:04:07,860
‫Y, por supuesto, si el archivo no se puede encontrar en

103
00:04:07,860 --> 00:04:10,410
‫ningún lugar, se genera un error y se detiene

104
00:04:10,410 --> 00:04:12,043
‫la ejecución de la aplicación.

105
00:04:13,861 --> 00:04:16,450
‫Continuando, después de que se carga

106
00:04:16,450 --> 00:04:20,230
‫el módulo, el código del módulo se envuelve en una función

107
00:04:20,230 --> 00:04:24,098
‫especial que nos dará acceso a un par de objetos especiales.

108
00:04:24,098 --> 00:04:27,370
‫Entonces, este paso es donde ocurre la magia.

109
00:04:27,370 --> 00:04:30,260
‫Es aquí donde obtenemos la respuesta a la pregunta,

110
00:04:30,260 --> 00:04:33,290
‫¿de dónde proviene realmente la función require y por

111
00:04:33,290 --> 00:04:35,403
‫qué tenemos acceso a ella?

112
00:04:36,290 --> 00:04:38,190
‫Es porque el tiempo de ejecución

113
00:04:38,190 --> 00:04:39,860
‫de nodejs quita el

114
00:04:39,860 --> 00:04:42,450
‫código de nuestro módulo y lo coloca dentro

115
00:04:42,450 --> 00:04:46,390
‫de la expresión de función invocada inmediatamente, o IIFE que puede ver aquí.

116
00:04:46,390 --> 00:04:48,330
‫Entonces, el nodo en

117
00:04:48,330 --> 00:04:51,500
‫realidad no ejecuta directamente el código que reescribo

118
00:04:51,500 --> 00:04:54,530
‫en un archivo, sino la función contenedora que

119
00:04:54,530 --> 00:04:56,770
‫contendrá nuestro código en su cuerpo.

120
00:04:56,770 --> 00:05:00,010
‫También pasa el módulo requerido por los expertos, el

121
00:05:00,010 --> 00:05:03,360
‫nombre del archivo y los objetos de directorio en él.

122
00:05:03,360 --> 00:05:05,820
‫Es por eso que en cada

123
00:05:05,820 --> 00:05:07,730
‫módulo automáticamente tenemos

124
00:05:07,730 --> 00:05:10,450
‫acceso a cosas como la función require.

125
00:05:10,450 --> 00:05:12,870
‫Entonces, estas son básicamente como variables globales que

126
00:05:12,870 --> 00:05:15,703
‫se inyectan en todos y cada uno de los módulos.

127
00:05:17,150 --> 00:05:21,420
‫Ahora, al hacer esto, node logra dos cosas muy importantes.

128
00:05:21,420 --> 00:05:24,010
‫Lo primero, por supuesto, es dar a los desarrolladores acceso

129
00:05:24,010 --> 00:05:26,450
‫a todas estas variables de las que acabamos de

130
00:05:26,450 --> 00:05:28,520
‫hablar, lo cual es muy útil.

131
00:05:28,520 --> 00:05:31,160
‫En segundo lugar, mantiene privadas las variables de nivel

132
00:05:31,160 --> 00:05:33,320
‫superior que definimos en nuestros módulos.

133
00:05:33,320 --> 00:05:36,080
‫Por lo tanto, está limitado solo al

134
00:05:36,080 --> 00:05:39,690
‫módulo actual en lugar de filtrar todo al objeto global.

135
00:05:39,690 --> 00:05:41,060
‫Así que imagina

136
00:05:41,060 --> 00:05:44,640
‫por un segundo, que declaramos una variable x en uno de

137
00:05:44,640 --> 00:05:48,050
‫nuestros módulos y luego incluimos un módulo npm que también

138
00:05:48,050 --> 00:05:49,840
‫usa una variable llamada x.

139
00:05:49,840 --> 00:05:51,640
‫Sin este mecanismo,

140
00:05:51,640 --> 00:05:54,080
‫nuestra propia variable se anularía y

141
00:05:54,080 --> 00:05:56,600
‫toda la aplicación simplemente no funcionaría.

142
00:05:56,600 --> 00:05:59,370
‫Entonces, cada módulo que tiene su ámbito privado

143
00:05:59,370 --> 00:06:01,950
‫es absolutamente crucial y se logra a través

144
00:06:01,950 --> 00:06:05,000
‫de este ingenioso truco de envolver nuestro código en

145
00:06:05,000 --> 00:06:06,423
‫esta función especial.

146
00:06:08,080 --> 00:06:10,400
‫Ahora echemos un vistazo rápido a cada objeto

147
00:06:10,400 --> 00:06:11,960
‫que obtiene nuestro módulo.

148
00:06:11,960 --> 00:06:13,710
‫Primero la función require,

149
00:06:13,710 --> 00:06:15,290
‫que ya conocemos.

150
00:06:15,290 --> 00:06:17,260
‫Luego, hay un objeto de módulo,

151
00:06:17,260 --> 00:06:19,760
‫que es solo una referencia al módulo actual

152
00:06:19,760 --> 00:06:21,410
‫y que para nosotros es

153
00:06:21,410 --> 00:06:23,800
‫más importante a la hora de exportar datos.

154
00:06:23,800 --> 00:06:26,230
‫Lo mismo se aplica al objeto de

155
00:06:26,230 --> 00:06:28,520
‫exportación que discutiremos en un momento.

156
00:06:28,520 --> 00:06:30,490
‫Finalmente, están las variables convenientes

157
00:06:30,490 --> 00:06:33,150
‫nombre de archivo y nombre de directorio

158
00:06:33,150 --> 00:06:35,240
‫que simplemente contienen la ruta absoluta

159
00:06:35,240 --> 00:06:36,890
‫al archivo del

160
00:06:36,890 --> 00:06:40,200
‫módulo actual, así como el nombre de directorio actual.

161
00:06:40,200 --> 00:06:44,023
‫Y así es como funciona el paso de ajuste de la carga de un módulo.

162
00:06:45,060 --> 00:06:47,280
‫A continuación, el código en el módulo, o

163
00:06:47,280 --> 00:06:48,840
‫para ser más precisos,

164
00:06:48,840 --> 00:06:50,940
‫en la función contenedora del módulo, en

165
00:06:50,940 --> 00:06:54,240
‫realidad es ejecutado por el NODE. Tiempo de ejecución de JS.

166
00:06:54,240 --> 00:06:55,693
‫Entonces, nada lujoso aquí.

167
00:06:57,460 --> 00:06:58,810
‫Hasta este punto,

168
00:06:58,810 --> 00:07:01,980
‫la función require se ha llamado con un nombre de

169
00:07:01,980 --> 00:07:03,559
‫módulo como argumento, la ruta

170
00:07:03,559 --> 00:07:07,200
‫al archivo del módulo se ha resuelto en el archivo cargado,

171
00:07:07,200 --> 00:07:10,370
‫todo el código se ha envuelto en la función

172
00:07:10,370 --> 00:07:12,461
‫contenedora que luego se ha ejecutado.

173
00:07:12,461 --> 00:07:15,190
‫Ahora es el momento de que la

174
00:07:15,190 --> 00:07:17,320
‫función require realmente devuelva algo.

175
00:07:17,320 --> 00:07:21,840
‫Y lo que devuelve son las exportaciones del módulo requerido.

176
00:07:21,840 --> 00:07:25,503
‫Estas exportaciones se almacenan en el módulo. exportsobjects.

177
00:07:26,860 --> 00:07:29,260
‫Puede que se parezca un poco a esto.

178
00:07:29,260 --> 00:07:32,300
‫Entonces, nuevamente, en cada módulo podemos exportar

179
00:07:32,300 --> 00:07:36,300
‫variables, que al final serán devueltas por la función require.

180
00:07:36,300 --> 00:07:40,490
‫Y lo hacemos asignando variables al módulo. exportaciones o simplemente a exportaciones

181
00:07:40,490 --> 00:07:42,190
‫donde es solo

182
00:07:42,190 --> 00:07:45,600
‫un puntero al módulo. exportar.

183
00:07:45,600 --> 00:07:47,600
‫Haremos esto en la práctica

184
00:07:47,600 --> 00:07:50,250
‫en el próximo video, porque sé que suena

185
00:07:50,250 --> 00:07:52,270
‫un poco confuso cuando lo digo así.

186
00:07:52,270 --> 00:07:54,140
‫De todos modos, esto es lo

187
00:07:54,140 --> 00:07:58,370
‫que necesita saber sobre cuándo usar el módulo. exportar o simplemente exportar.

188
00:07:58,370 --> 00:08:02,220
‫Entonces, si todo lo que desea hacer es exportar una sola

189
00:08:02,220 --> 00:08:04,460
‫variable, como una clase o una

190
00:08:04,460 --> 00:08:07,890
‫función, generalmente usa module. exporta y configúrelo igual

191
00:08:07,890 --> 00:08:10,050
‫a la variable que desea exportar.

192
00:08:10,050 --> 00:08:12,010
‫Como en este ejemplo.

193
00:08:12,010 --> 00:08:13,000
‫Por

194
00:08:13,000 --> 00:08:16,120
‫otro lado, si está buscando exportar múltiples variables

195
00:08:16,120 --> 00:08:18,300
‫nombradas como múltiples funciones, por

196
00:08:18,300 --> 00:08:19,330
‫ejemplo, entonces debe

197
00:08:19,330 --> 00:08:22,280
‫crearlas como propiedades del objeto de exportación.

198
00:08:22,280 --> 00:08:25,690
‫Por ejemplo, si estuviéramos haciendo un módulo de calculadora, podría

199
00:08:25,690 --> 00:08:29,260
‫crear exportaciones. agregar, exportaciones.

200
00:08:29,260 --> 00:08:32,490
‫multiplicar las exportaciones. dividir y así sucesivamente.

201
00:08:32,490 --> 00:08:33,560
‫¿Tiene sentido?

202
00:08:33,560 --> 00:08:35,960
‫Nuevamente, haremos esto en el siguiente video

203
00:08:35,960 --> 00:08:38,110
‫y para entonces tendrá más sentido.

204
00:08:39,230 --> 00:08:42,530
‫Así es como exportamos e importamos datos

205
00:08:42,530 --> 00:08:44,980
‫de un módulo al otro.

206
00:08:44,980 --> 00:08:47,410
‫Por supuesto, esta es también la razón por

207
00:08:47,410 --> 00:08:51,500
‫la que solemos asignar el resultado de una función require llamada a una nueva variable.

208
00:08:51,500 --> 00:08:54,003
‫Para que podamos guardar las exportaciones devueltas.

209
00:08:55,140 --> 00:08:57,570
‫Ahora, para terminar este video muy rápido,

210
00:08:57,570 --> 00:09:00,500
‫el último paso es que los módulos se almacenan en

211
00:09:00,500 --> 00:09:03,090
‫caché después de la primera vez que se cargan.

212
00:09:03,090 --> 00:09:05,850
‫Lo que esto significa es que si necesita

213
00:09:05,850 --> 00:09:08,890
‫el mismo módulo varias veces, siempre obtendrá el mismo resultado.

214
00:09:08,890 --> 00:09:12,490
‫Y el código de los módulos en realidad solo se ejecuta en

215
00:09:12,490 --> 00:09:13,640
‫la primera llamada.

216
00:09:13,640 --> 00:09:15,100
‫En llamadas posteriores,

217
00:09:15,100 --> 00:09:18,470
‫el resultado simplemente se recupera de la caché.

218
00:09:18,470 --> 00:09:19,520
‫Perfecto.

219
00:09:19,520 --> 00:09:21,730
‫Así que espero que toda la

220
00:09:21,730 --> 00:09:23,390
‫lógica detrás de cómo

221
00:09:23,390 --> 00:09:25,860
‫trabajar con módulos ya no parezca mágica.

222
00:09:25,860 --> 00:09:28,570
‫Es muy importante saber cómo funciona todo esto

223
00:09:28,570 --> 00:09:30,130
‫para convertirnos en un gran

224
00:09:30,130 --> 00:09:31,390
‫NODO, y sobre todo,

225
00:09:31,390 --> 00:09:33,833
‫más independiente. Desarrollador JS.

