﻿1
00:00:01,390 --> 00:00:03,570
‫Jonas : Comme dernière partie de cette section, parlons

2
00:00:03,570 --> 00:00:06,660
‫de la façon dont NODE. Les modules JS fonctionnent réellement

3
00:00:06,660 --> 00:00:07,623
‫dans les coulisses.

4
00:00:09,220 --> 00:00:11,980
‫Tout d'abord dans le NODE. Système de module

5
00:00:11,980 --> 00:00:15,660
‫JS, chaque fichier JavaScript est traité comme un module distinct.

6
00:00:15,660 --> 00:00:18,120
‫Et nous avons déjà joué un peu avec

7
00:00:18,120 --> 00:00:19,722
‫les modules dans l'intersection,

8
00:00:19,722 --> 00:00:21,780
‫'particulièrement en utilisant la fonction require

9
00:00:21,780 --> 00:00:23,920
‫et en exportant les données des modules.

10
00:00:23,920 --> 00:00:27,150
‫Voilà donc les principes fondamentaux des modules Common JS, qui constituent

11
00:00:27,150 --> 00:00:29,770
‫le système de modules utilisé par le nœud.

12
00:00:29,770 --> 00:00:33,010
‫Parce que cela fonctionne particulièrement bien sur le serveur.

13
00:00:33,010 --> 00:00:35,930
‫Maintenant, il y a aussi le script natif ECMA ou

14
00:00:35,930 --> 00:00:37,620
‫le système de module

15
00:00:37,620 --> 00:00:39,870
‫ES que vous connaissez peut-être déjà, «

16
00:00:39,870 --> 00:00:42,060
‫surtout si vous avez suivi mon cours

17
00:00:42,060 --> 00:00:43,950
‫JavaScript, ou si vous avez récemment

18
00:00:43,950 --> 00:00:45,840
‫écrit du JavaScript sur le front-end.

19
00:00:45,840 --> 00:00:49,270
‫Ce système de module ES dont je parlais a été

20
00:00:49,270 --> 00:00:53,310
‫développé pour fonctionner dans le navigateur en utilisant la syntaxe import export.

21
00:00:53,310 --> 00:00:55,640
‫Donc, je voulais juste préciser qu'il s'agit de

22
00:00:55,640 --> 00:00:57,980
‫deux systèmes de modules différents que vous verrez

23
00:00:57,980 --> 00:00:59,030
‫dans des situations

24
00:00:59,030 --> 00:01:00,950
‫différentes, alors ne soyez pas confus.

25
00:01:00,950 --> 00:01:03,110
‫Il y a également eu des tentatives pour implémenter des

26
00:01:03,110 --> 00:01:05,699
‫modules ES natifs dans NODE. JS, 'en utilisant

27
00:01:05,699 --> 00:01:07,280
‫spécialement des extensions de fichiers

28
00:01:07,280 --> 00:01:09,130
‫comme . mjs.

29
00:01:09,130 --> 00:01:10,870
‫Mais jusqu'à présent, ce n'est

30
00:01:10,870 --> 00:01:12,940
‫pas vraiment devenu une chose populaire à utiliser.

31
00:01:12,940 --> 00:01:14,630
‫Donc, à moins que vous

32
00:01:14,630 --> 00:01:16,140
‫ne regardiez ce cours

33
00:01:16,140 --> 00:01:17,970
‫dans un avenir lointain, vous utiliserez

34
00:01:17,970 --> 00:01:20,223
‫probablement toujours le système Common JS avec node.

35
00:01:21,070 --> 00:01:23,600
‫Maintenant, vous vous demandez peut-être pourquoi dans NODE. JS chaque

36
00:01:23,600 --> 00:01:26,350
‫module a en fait accès à

37
00:01:26,350 --> 00:01:28,420
‫la fonction require afin d'importer

38
00:01:28,420 --> 00:01:30,780
‫des modules en premier lieu.

39
00:01:30,780 --> 00:01:31,700
‫Droit?

40
00:01:31,700 --> 00:01:34,570
‫Je veux dire, ce n'est pas une fonction JavaScript standard.

41
00:01:34,570 --> 00:01:36,040
‫Donc, d'où cela vient-il?

42
00:01:36,040 --> 00:01:39,080
‫Et comment ça marche exactement dans les coulisses ?

43
00:01:39,080 --> 00:01:40,763
‫Eh bien, découvrons.

44
00:01:42,070 --> 00:01:43,780
‫Donc, la question ici

45
00:01:43,780 --> 00:01:45,930
‫est, ce qui se passe chaque

46
00:01:45,930 --> 00:01:48,540
‫fois que nous demandons un module en appelant

47
00:01:48,540 --> 00:01:51,620
‫la fonction require avec un nom de module, est l'argument.

48
00:01:51,620 --> 00:01:53,270
‫En guise d'aperçu très

49
00:01:53,270 --> 00:01:56,270
‫général, les étapes suivantes sont exécutées dans les coulisses.

50
00:01:56,270 --> 00:01:58,890
‫Tout d'abord, le chemin d'accès au module

51
00:01:58,890 --> 00:02:01,600
‫requis est résolu et le fichier est chargé.

52
00:02:01,600 --> 00:02:04,290
‫Ensuite, un processus appelé wrapping se produit après

53
00:02:04,290 --> 00:02:05,130
‫cela, le

54
00:02:05,130 --> 00:02:07,210
‫code du module est exécuté

55
00:02:07,210 --> 00:02:09,760
‫et les exportations de module sont renvoyées.

56
00:02:09,760 --> 00:02:12,963
‫Et enfin, tout le module est mis en cache.

57
00:02:14,300 --> 00:02:17,550
‫Examinons maintenant chaque étape plus en détail.

58
00:02:17,550 --> 00:02:20,570
‫Tout d'abord, comment node sait-il quel fichier charger lorsque

59
00:02:20,570 --> 00:02:22,640
‫nous avons besoin d'un module ?

60
00:02:22,640 --> 00:02:24,970
‫Parce que rappelez-vous, nous pouvons en

61
00:02:24,970 --> 00:02:27,410
‫fait charger trois types de modules différents.

62
00:02:27,410 --> 00:02:29,030
‫Les modules de base

63
00:02:29,030 --> 00:02:32,400
‫de Node, nos propres modules ou des modules tiers de npm comme

64
00:02:32,400 --> 00:02:34,990
‫express qui est le framework de nœud que nous

65
00:02:34,990 --> 00:02:37,380
‫allons utiliser pendant la majeure partie du cours.

66
00:02:37,380 --> 00:02:40,940
‫Ce processus est donc connu sous le nom de résolution du chemin du fichier.

67
00:02:40,940 --> 00:02:42,820
‫Et voici comment cela fonctionne.

68
00:02:42,820 --> 00:02:45,500
‫Lorsque la fonction require reçoit le nom du

69
00:02:45,500 --> 00:02:46,810
‫module en entrée,

70
00:02:46,810 --> 00:02:50,280
‫elle essaiera d'abord de charger un module principal avec ce nom.

71
00:02:50,280 --> 00:02:52,860
‫Comme par exemple le module http.

72
00:02:52,860 --> 00:02:55,570
‫Il trouvera automatiquement un chemin vers ce

73
00:02:55,570 --> 00:02:57,130
‫module, puis le chargera.

74
00:02:57,130 --> 00:02:59,150
‫Maintenant, si le chemin commence par un point,

75
00:02:59,150 --> 00:03:00,160
‫ou deux points,

76
00:03:00,160 --> 00:03:02,280
‫cela signifie qu'il s'agit d'un module de développement.

77
00:03:02,280 --> 00:03:06,010
‫Parce que nous indiquons le chemin relatif de notre fichier.

78
00:03:06,010 --> 00:03:08,380
‫Le nœud essaiera donc de charger ce fichier,

79
00:03:08,380 --> 00:03:11,130
‫mais s'il n'y a pas de fichier avec ce

80
00:03:11,130 --> 00:03:13,180
‫nom, il cherchera un dossier à

81
00:03:13,180 --> 00:03:16,870
‫la place et chargera l'index. js s'il se trouve dans ce dossier.

82
00:03:16,870 --> 00:03:18,060
‫Donc, dans cet

83
00:03:18,060 --> 00:03:21,370
‫exemple, il essaiera de charger lib/controller. js.

84
00:03:21,370 --> 00:03:23,600
‫N'oubliez pas que nous pouvons supprimer le point

85
00:03:23,600 --> 00:03:25,600
‫js lorsque vous avez besoin d'un module.

86
00:03:25,600 --> 00:03:28,570
‫S'il n'y a pas de fichier à

87
00:03:28,570 --> 00:03:30,360
‫ce chemin, il

88
00:03:30,360 --> 00:03:34,450
‫essaiera alors d'ouvrir index. js du dossier lib/controller à la place.

89
00:03:34,450 --> 00:03:35,900
‫Avoir du sens ?

90
00:03:35,900 --> 00:03:37,890
‫Et enfin, si le module requis

91
00:03:37,890 --> 00:03:39,330
‫n'est ni un

92
00:03:39,330 --> 00:03:41,290
‫module de base, ni un module

93
00:03:41,290 --> 00:03:44,470
‫de développeur, node supposera qu'il s'agit d'un module de npm.

94
00:03:44,470 --> 00:03:47,910
‫Et rappelez-vous, sur un module que nous chargeons à partir de npm, nous n'avons

95
00:03:47,910 --> 00:03:51,050
‫en fait pas besoin d'écrire le chemin lorsque nous en avons besoin.

96
00:03:51,050 --> 00:03:52,150
‫Juste le nom du

97
00:03:52,150 --> 00:03:55,130
‫module, juste la façon dont il fonctionne sur un module principal.

98
00:03:55,130 --> 00:03:57,470
‫Ainsi, ces modules tiers sont stockés dans un

99
00:03:57,470 --> 00:03:59,250
‫dossier de module de nœud,

100
00:03:59,250 --> 00:04:02,280
‫de sorte que le nœud entrera dans ce dossier et

101
00:04:02,280 --> 00:04:04,960
‫essaiera d'y trouver un module, puis de le charger.

102
00:04:04,960 --> 00:04:07,860
‫Et bien sûr, si le fichier ne peut être trouvé

103
00:04:07,860 --> 00:04:10,410
‫nulle part, une erreur est générée et l'exécution

104
00:04:10,410 --> 00:04:12,043
‫de l'application est arrêtée.

105
00:04:13,861 --> 00:04:16,450
‫Ensuite, une fois le module

106
00:04:16,450 --> 00:04:20,230
‫chargé, le code du module est enveloppé dans une

107
00:04:20,230 --> 00:04:24,098
‫fonction spéciale qui nous donnera accès à quelques objets spéciaux.

108
00:04:24,098 --> 00:04:27,370
‫C'est donc à cette étape que la magie opère.

109
00:04:27,370 --> 00:04:30,260
‫C'est ici que nous obtenons la réponse à

110
00:04:30,260 --> 00:04:33,290
‫la question, d'où vient réellement la fonction require et

111
00:04:33,290 --> 00:04:35,403
‫pourquoi y avons-nous accès ?

112
00:04:36,290 --> 00:04:38,190
‫C'est parce que le temps d'exécution

113
00:04:38,190 --> 00:04:39,860
‫de nodejs retire le

114
00:04:39,860 --> 00:04:42,450
‫code de notre module et le met dans

115
00:04:42,450 --> 00:04:46,390
‫l'expression de fonction immédiatement invoquée, ou IIFE que vous pouvez voir ici.

116
00:04:46,390 --> 00:04:48,330
‫Ainsi, le nœud n'exécute pas

117
00:04:48,330 --> 00:04:51,500
‫directement le code que je réécris dans un fichier,

118
00:04:51,500 --> 00:04:54,530
‫mais à la place, la fonction wrapper qui

119
00:04:54,530 --> 00:04:56,770
‫contiendra notre code dans son corps.

120
00:04:56,770 --> 00:05:00,010
‫Il transmet également les objets requis par les

121
00:05:00,010 --> 00:05:03,360
‫experts au module, au nom de fichier et au répertoire.

122
00:05:03,360 --> 00:05:05,820
‫C'est pourquoi, dans chaque module, nous

123
00:05:05,820 --> 00:05:07,730
‫avons automatiquement accès à

124
00:05:07,730 --> 00:05:10,450
‫des éléments tels que la fonction require.

125
00:05:10,450 --> 00:05:12,870
‫Ce sont donc essentiellement des

126
00:05:12,870 --> 00:05:15,703
‫variables globales qui sont injectées dans chaque module.

127
00:05:17,150 --> 00:05:21,420
‫Maintenant, en faisant cela, node réalise deux choses très importantes.

128
00:05:21,420 --> 00:05:24,010
‫Tout d'abord, bien sûr, donner aux développeurs l'accès à

129
00:05:24,010 --> 00:05:26,450
‫toutes ces variables dont nous venons de parler,

130
00:05:26,450 --> 00:05:28,520
‫ce qui est très utile.

131
00:05:28,520 --> 00:05:31,160
‫Deuxièmement, il garde les variables de niveau supérieur que

132
00:05:31,160 --> 00:05:33,320
‫nous définissons dans nos modules privées.

133
00:05:33,320 --> 00:05:36,080
‫Il est donc limité au module

134
00:05:36,080 --> 00:05:39,690
‫actuel au lieu de tout divulguer dans l'objet global.

135
00:05:39,690 --> 00:05:41,060
‫Imaginez donc une

136
00:05:41,060 --> 00:05:44,640
‫seconde que nous ayons déclaré une variable x dans l'un

137
00:05:44,640 --> 00:05:48,050
‫de nos modules, puis inclus un module npm qui utilisait

138
00:05:48,050 --> 00:05:49,840
‫également une variable appelée x.

139
00:05:49,840 --> 00:05:51,640
‫Sans ce mécanisme, notre

140
00:05:51,640 --> 00:05:54,080
‫propre variable serait alors remplacée et l'ensemble

141
00:05:54,080 --> 00:05:56,600
‫de l'application ne fonctionnerait tout simplement pas.

142
00:05:56,600 --> 00:05:59,370
‫Ainsi, chaque module ayant sa portée privée est

143
00:05:59,370 --> 00:06:01,950
‫absolument crucial et est réalisé grâce à

144
00:06:01,950 --> 00:06:05,000
‫cette astuce astucieuse consistant à envelopper notre code dans

145
00:06:05,000 --> 00:06:06,423
‫cette fonction spéciale.

146
00:06:08,080 --> 00:06:10,400
‫Jetons maintenant un coup d'œil rapide à chaque

147
00:06:10,400 --> 00:06:11,960
‫objet que notre module obtient.

148
00:06:11,960 --> 00:06:13,710
‫D'abord la fonction require, que

149
00:06:13,710 --> 00:06:15,290
‫nous connaissons déjà.

150
00:06:15,290 --> 00:06:17,260
‫Ensuite, il y a un objet

151
00:06:17,260 --> 00:06:19,760
‫module, qui n'est qu'une référence au module courant

152
00:06:19,760 --> 00:06:21,410
‫et qui pour nous est

153
00:06:21,410 --> 00:06:23,800
‫le plus important lorsqu'il s'agit d'exporter des données.

154
00:06:23,800 --> 00:06:26,230
‫La même chose s'applique à l'objet de l'export

155
00:06:26,230 --> 00:06:28,520
‫dont nous allons parler dans un instant.

156
00:06:28,520 --> 00:06:30,490
‫Enfin, il y a les

157
00:06:30,490 --> 00:06:33,150
‫variables de commodité file name et dir

158
00:06:33,150 --> 00:06:35,240
‫name qui contiennent simplement le chemin

159
00:06:35,240 --> 00:06:36,890
‫absolu vers le fichier

160
00:06:36,890 --> 00:06:40,200
‫du module courant ainsi que le nom du répertoire courant.

161
00:06:40,200 --> 00:06:44,023
‫Et c'est ainsi que fonctionne l'étape d'encapsulation du chargement d'un module.

162
00:06:45,060 --> 00:06:47,280
‫Ensuite, le code dans le module, ou pour

163
00:06:47,280 --> 00:06:48,840
‫être plus précis, dans

164
00:06:48,840 --> 00:06:50,940
‫la fonction wrapper du module, est en

165
00:06:50,940 --> 00:06:54,240
‫fait exécuté par le NODE. Exécution JS.

166
00:06:54,240 --> 00:06:55,693
‫Donc, rien d'extraordinaire ici.

167
00:06:57,460 --> 00:06:58,810
‫Jusqu'à ce point,

168
00:06:58,810 --> 00:07:01,980
‫la fonction require a été appelée avec un nom de

169
00:07:01,980 --> 00:07:03,559
‫module comme argument, le chemin

170
00:07:03,559 --> 00:07:07,200
‫d'accès au fichier du module a été résolu en fichier chargé,

171
00:07:07,200 --> 00:07:10,370
‫tout le code a été encapsulé dans la fonction

172
00:07:10,370 --> 00:07:12,461
‫wrapper qui a ensuite été exécutée.

173
00:07:12,461 --> 00:07:15,190
‫Maintenant, il est temps que la fonction

174
00:07:15,190 --> 00:07:17,320
‫require renvoie réellement quelque chose.

175
00:07:17,320 --> 00:07:21,840
‫Et ce qu'il renvoie, ce sont les exportations du module requis.

176
00:07:21,840 --> 00:07:25,503
‫Ces exportations sont stockées dans le module. exporte des objets.

177
00:07:26,860 --> 00:07:29,260
‫Cela pourrait ressembler un peu à ça.

178
00:07:29,260 --> 00:07:32,300
‫Donc, encore une fois, dans chaque module, nous

179
00:07:32,300 --> 00:07:36,300
‫pouvons exporter des variables, qui seront finalement renvoyées par la fonction require.

180
00:07:36,300 --> 00:07:40,490
‫Et nous le faisons en affectant des variables au module. exportations ou simplement à des exportations où

181
00:07:40,490 --> 00:07:42,190
‫il ne s'agit que

182
00:07:42,190 --> 00:07:45,600
‫d'un pointeur vers le module. exportation.

183
00:07:45,600 --> 00:07:47,600
‫Nous le ferons en pratique dans la

184
00:07:47,600 --> 00:07:50,250
‫prochaine vidéo, car je sais que cela semble un peu

185
00:07:50,250 --> 00:07:52,270
‫déroutant quand je le dis juste comme ça.

186
00:07:52,270 --> 00:07:54,140
‫Quoi qu'il en soit, voici ce que

187
00:07:54,140 --> 00:07:58,370
‫vous devez savoir pour savoir quand utiliser le module. exporter ou simplement exporter.

188
00:07:58,370 --> 00:08:02,220
‫Donc, si tout ce que vous voulez faire est d'exporter une seule

189
00:08:02,220 --> 00:08:04,460
‫variable, comme une classe ou une fonction,

190
00:08:04,460 --> 00:08:07,890
‫vous utilisez généralement module. exporte et définissez-le égal

191
00:08:07,890 --> 00:08:10,050
‫à la variable que vous souhaitez exporter.

192
00:08:10,050 --> 00:08:12,010
‫Tout comme dans cet exemple.

193
00:08:12,010 --> 00:08:13,000
‫D'un

194
00:08:13,000 --> 00:08:16,120
‫autre côté, si vous cherchez à exporter plusieurs variables

195
00:08:16,120 --> 00:08:18,300
‫nommées comme plusieurs fonctions, par exemple,

196
00:08:18,300 --> 00:08:19,330
‫vous devez les

197
00:08:19,330 --> 00:08:22,280
‫créer en tant que propriétés de l'objet d'exportation.

198
00:08:22,280 --> 00:08:25,690
‫Par exemple, si nous faisions un module de calculatrice, vous pourriez

199
00:08:25,690 --> 00:08:27,690
‫créer des exportations. ajouter, les

200
00:08:27,690 --> 00:08:29,260
‫exportations.

201
00:08:29,260 --> 00:08:32,490
‫multiplier, les exportations. diviser et ainsi de suite.

202
00:08:32,490 --> 00:08:33,560
‫Logique?

203
00:08:33,560 --> 00:08:35,960
‫Encore une fois, nous allons le faire dans la prochaine vidéo et

204
00:08:35,960 --> 00:08:38,110
‫cela aura plus de sens pour vous d'ici là.

205
00:08:39,230 --> 00:08:42,530
‫C'est ainsi que nous exportons et importons des

206
00:08:42,530 --> 00:08:44,980
‫données d'un module à l'autre.

207
00:08:44,980 --> 00:08:47,410
‫Bien sûr, c'est aussi pourquoi nous

208
00:08:47,410 --> 00:08:51,500
‫affectons généralement le résultat d'une fonction require appelée à une nouvelle variable.

209
00:08:51,500 --> 00:08:54,003
‫Afin que nous puissions enregistrer les exportations retournées.

210
00:08:55,140 --> 00:08:57,570
‫Maintenant, juste pour terminer cette vidéo très rapidement,

211
00:08:57,570 --> 00:09:00,500
‫la dernière étape est que les modules sont en fait mis

212
00:09:00,500 --> 00:09:03,090
‫en cache après la première fois qu'ils sont chargés.

213
00:09:03,090 --> 00:09:05,850
‫Cela signifie que si vous avez besoin plusieurs

214
00:09:05,850 --> 00:09:08,890
‫fois du même module, vous obtiendrez toujours le même résultat.

215
00:09:08,890 --> 00:09:12,490
‫Et le code dans les modules n'est en fait exécuté que lors

216
00:09:12,490 --> 00:09:13,640
‫du premier appel.

217
00:09:13,640 --> 00:09:15,100
‫Dans les appels

218
00:09:15,100 --> 00:09:18,470
‫suivants, le résultat est simplement extrait du cache.

219
00:09:18,470 --> 00:09:19,520
‫Parfait.

220
00:09:19,520 --> 00:09:21,730
‫J'espère donc que toute la logique derrière la

221
00:09:21,730 --> 00:09:23,390
‫façon de travailler avec les

222
00:09:23,390 --> 00:09:25,860
‫modules ne ressemble plus vraiment à de la magie.

223
00:09:25,860 --> 00:09:28,570
‫Il est vraiment important de savoir comment tout cela

224
00:09:28,570 --> 00:09:30,130
‫fonctionne, afin de devenir un

225
00:09:30,130 --> 00:09:31,390
‫grand et surtout un

226
00:09:31,390 --> 00:09:33,833
‫NODE plus indépendant. Développeur JS.

