1
00:00:01,120 --> 00:00:03,960
<v Jonas>Let's now use modules and practice,</v>

2
00:00:03,960 --> 00:00:07,520
to make sure that we really understand how they work,

3
00:00:07,520 --> 00:00:10,723
and to import and export values between them.

4
00:00:12,580 --> 00:00:15,780
And let's start with the simplest scenario of all,

5
00:00:15,780 --> 00:00:18,210
which is to simply import a module,

6
00:00:18,210 --> 00:00:20,610
but without importing any value.

7
00:00:20,610 --> 00:00:22,220
And so that's also possible,

8
00:00:22,220 --> 00:00:25,133
and so let's use that as a starting point here.

9
00:00:26,400 --> 00:00:29,173
So let's then create a new module.

10
00:00:30,050 --> 00:00:30,883
Okay?

11
00:00:30,883 --> 00:00:35,030
So as always, we already start with a script.js,

12
00:00:35,030 --> 00:00:37,210
but now as we create a new module,

13
00:00:37,210 --> 00:00:39,283
we simply have to create a new file.

14
00:00:40,120 --> 00:00:41,910
So new file,

15
00:00:41,910 --> 00:00:45,541
and here, I will use the example of a "shopping-cart",

16
00:00:45,541 --> 00:00:48,775
and so we're gonna have a module called,

17
00:00:48,775 --> 00:00:51,403
shoppingcart.jS,

18
00:00:52,430 --> 00:00:53,840
and in module names,

19
00:00:53,840 --> 00:00:57,353
it's also a convention to use camelCase names.

20
00:00:58,710 --> 00:00:59,543
All right?

21
00:01:00,840 --> 00:01:04,140
So this one here will be the importing

22
00:01:06,030 --> 00:01:06,903
module,

23
00:01:08,600 --> 00:01:11,973
and this will be the exporting module.

24
00:01:14,450 --> 00:01:15,630
And to start,

25
00:01:15,630 --> 00:01:18,380
let's actually lock this to the console,

26
00:01:18,380 --> 00:01:19,920
just,

27
00:01:19,920 --> 00:01:21,310
so we can see

28
00:01:21,310 --> 00:01:23,633
that the module is actually being imported.

29
00:01:24,490 --> 00:01:28,140
So this one here, will lock to the console exporting module,

30
00:01:28,140 --> 00:01:31,163
and this one should look to the console importing module.

31
00:01:33,780 --> 00:01:34,903
So like this,

32
00:01:35,790 --> 00:01:38,080
with the quotes, of course,

33
00:01:38,080 --> 00:01:42,100
and now we also have to import, that other module,

34
00:01:42,100 --> 00:01:46,140
And let's do that here first, so import

35
00:01:46,140 --> 00:01:49,345
and then a string with the location of the module.

36
00:01:49,345 --> 00:01:53,690
So ./, which simply means to current location,

37
00:01:53,690 --> 00:01:57,590
and then here VS code already gives us these options.

38
00:01:57,590 --> 00:02:01,050
So let's choose here shoppingcart.js

39
00:02:02,360 --> 00:02:06,760
and you see that VS code automatically omits the js here.

40
00:02:08,036 --> 00:02:11,073
So the name is actually this one with the js,

41
00:02:11,073 --> 00:02:15,810
but ES modules actually also work without the extension.

42
00:02:15,810 --> 00:02:18,830
but for now let's actually leave the extension there,

43
00:02:18,830 --> 00:02:20,903
just to make it a little bit more clear.

44
00:02:21,830 --> 00:02:25,093
So, let's start this cart here.

45
00:02:26,580 --> 00:02:28,930
So as always live server,

46
00:02:28,930 --> 00:02:32,453
but then we will see that this is not yet going to work.

47
00:02:33,440 --> 00:02:35,490
So let's take a look at the console here.

48
00:02:36,379 --> 00:02:39,480
And so what we see cannot use import statement

49
00:02:39,480 --> 00:02:41,123
outside a module.

50
00:02:42,150 --> 00:02:44,600
So why is that happening?

51
00:02:44,600 --> 00:02:46,820
Well, remember from the last lecture,

52
00:02:46,820 --> 00:02:50,724
that when we want to connect a module to the HTML file,

53
00:02:50,724 --> 00:02:54,863
we actually need to specify the type attribute.

54
00:02:56,480 --> 00:03:00,030
So here we have to say

55
00:03:00,030 --> 00:03:04,790
that this is off the type module.

56
00:03:04,790 --> 00:03:08,143
Okay, and so now it actually worked.

57
00:03:10,210 --> 00:03:13,590
So let's go back here and analyze this.

58
00:03:13,590 --> 00:03:15,470
And so here in the console, we see

59
00:03:15,470 --> 00:03:19,130
that the first log is actually exporting module

60
00:03:19,130 --> 00:03:23,220
only then importing model is locked to the console.

61
00:03:23,220 --> 00:03:27,510
And so this means that in fact, this cart here is executed

62
00:03:27,510 --> 00:03:30,970
before any cart in the importing module.

63
00:03:30,970 --> 00:03:34,350
So exactly what I explained to you in the last lecture.

64
00:03:34,350 --> 00:03:36,860
So the cart in this module here is passed,

65
00:03:36,860 --> 00:03:38,700
and before it is executed,

66
00:03:38,700 --> 00:03:40,260
all the cart in the modules

67
00:03:40,260 --> 00:03:43,610
that it imports is executed first.

68
00:03:43,610 --> 00:03:44,443
Right?,

69
00:03:44,443 --> 00:03:47,643
And the same is true if we had this lock here before.

70
00:03:48,870 --> 00:03:50,050
Okay?

71
00:03:50,050 --> 00:03:52,372
So remember that all the importing statements

72
00:03:52,372 --> 00:03:55,220
are basically hoisted to the top.

73
00:03:55,220 --> 00:03:58,510
And so usually, this is actually also how we write it.

74
00:03:58,510 --> 00:04:02,003
So all the imports statements at the top of the file,

75
00:04:02,940 --> 00:04:07,010
and also note how I didn't use strict mode here,

76
00:04:07,010 --> 00:04:09,670
and that's because as you learned in the last video,

77
00:04:09,670 --> 00:04:13,653
all modules are executed in strict mode by default.

78
00:04:14,850 --> 00:04:18,030
But now let's go back here to the "shopping-cart" module

79
00:04:18,030 --> 00:04:19,723
and define some variables.

80
00:04:21,400 --> 00:04:22,603
So let's just say,

81
00:04:24,450 --> 00:04:27,340
shipping cost = 10.

82
00:04:27,340 --> 00:04:30,280
And let's also say we have an empty card

83
00:04:30,280 --> 00:04:32,693
which is like an array.

84
00:04:33,940 --> 00:04:36,160
So an empty array for now.

85
00:04:36,160 --> 00:04:39,680
Now variables that are declared inside of a module,

86
00:04:39,680 --> 00:04:41,870
So just like these two ones here,

87
00:04:41,870 --> 00:04:45,270
are actually sculpt to this module.

88
00:04:45,270 --> 00:04:47,540
So basically inside a module,

89
00:04:47,540 --> 00:04:51,700
the module itself is like the top level scope.

90
00:04:51,700 --> 00:04:55,670
And so by default, this means that all top level variables

91
00:04:55,670 --> 00:04:59,500
are private inside of this variable.

92
00:04:59,500 --> 00:05:01,600
So unlike traditional scripts,

93
00:05:01,600 --> 00:05:04,010
which would put all of these variables here

94
00:05:04,010 --> 00:05:05,740
in the global scope,

95
00:05:05,740 --> 00:05:07,860
but again, not modules,

96
00:05:07,860 --> 00:05:11,253
and so that's why right here, we cannot do this.

97
00:05:14,040 --> 00:05:14,873
All right?

98
00:05:14,873 --> 00:05:17,093
So "shipping-cost" is not defined.

99
00:05:18,840 --> 00:05:19,780
All right?

100
00:05:19,780 --> 00:05:21,100
So the "shipping-costs"

101
00:05:21,100 --> 00:05:23,400
and cart variables are scoped,

102
00:05:23,400 --> 00:05:25,820
to the current module basically,

103
00:05:25,820 --> 00:05:28,103
and so we can only use them here.

104
00:05:28,103 --> 00:05:32,468
Now, if we wanted to use them in the script.js module

105
00:05:32,468 --> 00:05:35,580
then we would have to use exports.

106
00:05:35,580 --> 00:05:39,420
And in ES modules, there are two types of exports,

107
00:05:39,420 --> 00:05:43,330
Named Exports and Default Exports.

108
00:05:43,330 --> 00:05:46,470
And named imports is actually the simplest way

109
00:05:46,470 --> 00:05:48,685
of exporting something from a module,

110
00:05:48,685 --> 00:05:51,920
because all we have to do is to put export

111
00:05:51,920 --> 00:05:56,160
in front of anything, that we might want to export.

112
00:05:56,160 --> 00:05:59,781
So let's say that we want to create this method here

113
00:05:59,781 --> 00:06:01,583
"add to cart"

114
00:06:04,540 --> 00:06:07,563
and it should be a function that takes a product,

115
00:06:09,290 --> 00:06:10,393
and the quantity.

116
00:06:11,240 --> 00:06:15,570
And then it pushes basically a new object to the cart,

117
00:06:15,570 --> 00:06:16,670
so to that cart array,

118
00:06:21,494 --> 00:06:24,920
and then let's also lock something to the console,

119
00:06:24,920 --> 00:06:26,053
like quantity,

120
00:06:28,100 --> 00:06:29,593
and then the product,

121
00:06:30,500 --> 00:06:32,463
was added to the cart.

122
00:06:33,730 --> 00:06:34,630
Okay?

123
00:06:34,630 --> 00:06:36,390
And so again, by now

124
00:06:36,390 --> 00:06:39,900
this variable is private inside of this module,

125
00:06:39,900 --> 00:06:43,630
but if we wanted to now export it, so that we can import it,

126
00:06:43,630 --> 00:06:45,330
in some other module,

127
00:06:45,330 --> 00:06:49,390
all we have to do is write export right here.

128
00:06:49,390 --> 00:06:53,263
And so this then creates a named export from this module.

129
00:06:54,290 --> 00:06:58,260
And so now we can then import that variable right here,

130
00:06:58,260 --> 00:07:01,710
we just have to write it with the exact same name.

131
00:07:01,710 --> 00:07:05,607
So the variable is called "add to cart", right here.

132
00:07:07,460 --> 00:07:10,910
and so, right here in this module,

133
00:07:10,910 --> 00:07:14,440
and so therefore we have to call it that here as well.

134
00:07:14,440 --> 00:07:16,870
Now what we're missing here is the from,

135
00:07:16,870 --> 00:07:19,050
so this is quite easy to understand,

136
00:07:19,050 --> 00:07:21,740
it reads just like a normal sentence.

137
00:07:21,740 --> 00:07:26,288
So we want to import "add to cart" from this module.

138
00:07:26,288 --> 00:07:29,970
And again, "add to cart", this variable name here,

139
00:07:29,970 --> 00:07:32,283
has to be exactly the same as this one.

140
00:07:33,640 --> 00:07:34,530
okay?

141
00:07:34,530 --> 00:07:38,750
Now here we are just missing, actually curly braces

142
00:07:38,750 --> 00:07:41,480
around this here, like this,

143
00:07:41,480 --> 00:07:44,280
so now it's going to work,

144
00:07:44,280 --> 00:07:46,470
and to Syntax without the curly braces.

145
00:07:46,470 --> 00:07:48,850
we will see a little bit later.

146
00:07:48,850 --> 00:07:50,590
But again with named imports,

147
00:07:50,590 --> 00:07:52,540
you have to give them here the same name,

148
00:07:52,540 --> 00:07:54,480
and you actually have to put them

149
00:07:54,480 --> 00:07:56,850
inside curly braces like this.

150
00:07:58,130 --> 00:08:01,460
And so now here we are able to call this function

151
00:08:01,460 --> 00:08:05,190
as if it was defined here in this same scope.

152
00:08:05,190 --> 00:08:08,370
So let's just say, we want to add five breads

153
00:08:08,370 --> 00:08:11,160
to the "shopping-cart", you know,

154
00:08:11,160 --> 00:08:12,750
indeed it works.

155
00:08:12,750 --> 00:08:14,710
So here we got dad log,

156
00:08:14,710 --> 00:08:17,310
now that is coming from the "add to cart" function

157
00:08:17,310 --> 00:08:20,433
that is indeed defined in this module here.

158
00:08:21,310 --> 00:08:22,650
Now, just keep in mind

159
00:08:22,650 --> 00:08:26,273
that exports always need to happen in top level cart,

160
00:08:28,440 --> 00:08:31,033
so it wouldn't work like this.

161
00:08:32,650 --> 00:08:33,483
All right?

162
00:08:33,483 --> 00:08:36,803
So then indeed you get an unexpected token export.

163
00:08:39,170 --> 00:08:40,903
So let's put it back of course.

164
00:08:42,370 --> 00:08:44,570
And so now here we are back.

165
00:08:44,570 --> 00:08:47,490
And of course we can also export multiple things

166
00:08:47,490 --> 00:08:50,870
from a module using Named Exports.

167
00:08:50,870 --> 00:08:55,540
And actually, that is the main use case of Named Exports,

168
00:08:55,540 --> 00:08:59,240
so, basically when we want to export multiple things.

169
00:08:59,240 --> 00:09:00,100
Now, okay?

170
00:09:00,100 --> 00:09:02,840
Now we can also export multiple things,

171
00:09:02,840 --> 00:09:06,150
at the same time, using Named Exports.

172
00:09:06,150 --> 00:09:09,600
So we can just, let's say, declare some variables here,

173
00:09:09,600 --> 00:09:11,683
like total price,

174
00:09:12,608 --> 00:09:14,560

175
00:09:14,560 --> 00:09:18,713
and total quantity,

176
00:09:19,970 --> 00:09:21,303
let's say 23.

177
00:09:22,560 --> 00:09:27,240
And so now we can export all of this at the same time,

178
00:09:27,240 --> 00:09:31,693
again, using Named Exports, by writing total price

179
00:09:31,693 --> 00:09:33,833
and total quantity.

180
00:09:34,780 --> 00:09:37,910
So this is a little bit like exporting an object

181
00:09:37,910 --> 00:09:39,720
from this module.

182
00:09:39,720 --> 00:09:43,970
And so now, just like before we can then come here,

183
00:09:43,970 --> 00:09:46,874
and import these variables using the same name,

184
00:09:46,874 --> 00:09:49,870
and again, that's inside of the curly braces,

185
00:09:49,870 --> 00:09:51,533
just like we export it here.

186
00:09:53,850 --> 00:09:56,650
So that's "add to cart",

187
00:09:56,650 --> 00:10:00,450
total price and total quantity.

188
00:10:00,450 --> 00:10:04,633
And so of course we can then go ahead and use them here,

189
00:10:05,800 --> 00:10:08,460
and in this case, all we do is to lock them,

190
00:10:08,460 --> 00:10:12,800
but indeed, now we get access to these values from here,

191
00:10:12,800 --> 00:10:16,580
and indeed now we get access to these values here,

192
00:10:16,580 --> 00:10:19,580
in this main importing module.

193
00:10:19,580 --> 00:10:23,810
Now actually we can change the name of the inputs as well,

194
00:10:23,810 --> 00:10:26,782
so for example, if we wanted to call the total price,

195
00:10:26,782 --> 00:10:29,763
simply price, we could write this,

196
00:10:30,840 --> 00:10:33,393
So total price as price.

197
00:10:34,470 --> 00:10:37,653
And so then here, it would no longer be called total price.

198
00:10:38,840 --> 00:10:39,680
Right?

199
00:10:39,680 --> 00:10:41,450
So it's no longer there,

200
00:10:41,450 --> 00:10:46,020
but instead it is simply called price.

201
00:10:46,020 --> 00:10:49,730
And we could actually even do that here in the exports.

202
00:10:49,730 --> 00:10:51,460
So here we could also write,

203
00:10:51,460 --> 00:10:56,460
write export total quantity, just as QT,

204
00:10:56,780 --> 00:10:57,910
let's say.

205
00:10:57,910 --> 00:10:59,010
And so then here,

206
00:10:59,010 --> 00:11:02,720
it would no longer be called total quantity,

207
00:11:02,720 --> 00:11:03,893
but TQ.

208
00:11:08,760 --> 00:11:11,633
And now that doesn't work, so let's go back.

209
00:11:13,060 --> 00:11:16,333
So it's TQ, So total quantity.

210
00:11:17,260 --> 00:11:21,570
And so now indeed, we are back to having 23 there.

211
00:11:21,570 --> 00:11:24,230
So this is all very flexible as you can see,

212
00:11:24,230 --> 00:11:27,770
and we can play around with this as we wish.

213
00:11:27,770 --> 00:11:28,730
Okay?

214
00:11:28,730 --> 00:11:33,020
And actually we can take this importing even further,

215
00:11:33,020 --> 00:11:36,040
because we can also import all the exports

216
00:11:36,040 --> 00:11:38,860
of a module at the same time.

217
00:11:38,860 --> 00:11:42,130
So that's import and then everything.

218
00:11:42,130 --> 00:11:44,980
So that's usually the meaning of the star,

219
00:11:44,980 --> 00:11:49,980
and then as and here we can give it some name that we want,

220
00:11:50,000 --> 00:11:54,580
So let's call it "shopping-cart" and with a S here,

221
00:11:54,580 --> 00:11:57,200
so a little bit like a class name.

222
00:11:57,200 --> 00:11:58,033
Okay?

223
00:11:58,033 --> 00:12:01,310
So that's kind of the convention when we import everything

224
00:12:01,310 --> 00:12:03,870
into an object like this.

225
00:12:03,870 --> 00:12:06,270
So basically, this year we'll create an object

226
00:12:06,270 --> 00:12:10,320
containing everything that is exported from the module

227
00:12:10,320 --> 00:12:12,123
that we will specify here.

228
00:12:13,210 --> 00:12:14,163
So from,

229
00:12:15,577 --> 00:12:16,860
"shopping-cart".

230
00:12:16,860 --> 00:12:20,100
And so this will then basically create a namespace,

231
00:12:20,100 --> 00:12:23,743
for all of the values, exported from that module.

232
00:12:24,790 --> 00:12:26,970
Let's just comment out this one here,

233
00:12:26,970 --> 00:12:29,630
and I will put this code that is more related

234
00:12:29,630 --> 00:12:32,320
to this import, and they are here,

235
00:12:32,320 --> 00:12:34,073
So actually I want all of it here.

236
00:12:36,200 --> 00:12:38,870
So put that here and comment it out,

237
00:12:38,870 --> 00:12:42,403
like this, because now we are doing it differently.

238
00:12:43,320 --> 00:12:45,913
Let's just put everything here,

239
00:12:46,759 --> 00:12:50,763
just so we get some new cart here.

240
00:12:51,820 --> 00:12:54,545
Now it tells us that this module doesn't exist,

241
00:12:54,545 --> 00:12:56,700
and that's because by default,

242
00:12:56,700 --> 00:12:59,890
a VS code again removed this js.

243
00:12:59,890 --> 00:13:01,890
And in fact it is necessary,

244
00:13:01,890 --> 00:13:04,800
It is only not necessary in some other cases,

245
00:13:04,800 --> 00:13:05,973
that we will see later.

246
00:13:07,480 --> 00:13:09,110
So now it works again,

247
00:13:09,110 --> 00:13:12,440
and we are back to having our logs here.

248
00:13:12,440 --> 00:13:14,050
And so now whenever we want to use

249
00:13:14,050 --> 00:13:17,480
something that was exported like this, "add to cart"

250
00:13:17,480 --> 00:13:18,350
function

251
00:13:18,350 --> 00:13:21,293
then we have to basically take that from this object.

252
00:13:22,300 --> 00:13:25,453
So, "add to cart", and let's again say bread,

253
00:13:27,140 --> 00:13:27,973
five.

254
00:13:28,830 --> 00:13:29,780
All right?

255
00:13:29,780 --> 00:13:31,908
So here it is again.

256
00:13:31,908 --> 00:13:35,203
And so basically if we think about this,

257
00:13:35,203 --> 00:13:39,400
this module here is now basically exporting a public API,

258
00:13:39,400 --> 00:13:41,500
just like a class.

259
00:13:41,500 --> 00:13:43,900
So it's as if this object here,

260
00:13:43,900 --> 00:13:46,520
was an object created from a class,

261
00:13:46,520 --> 00:13:48,950
which now has these methods,

262
00:13:48,950 --> 00:13:51,433
and also, for example these properties,

263
00:13:52,730 --> 00:13:57,673
like shoppingcart.total price.

264
00:13:59,210 --> 00:14:00,060
Right?,

265
00:14:00,060 --> 00:14:03,303
So that's the other Named Export from this module.

266
00:14:05,100 --> 00:14:06,410
Now of course we are not trying

267
00:14:06,410 --> 00:14:09,173
to replace classes with modules.

268
00:14:09,173 --> 00:14:12,330
I just wanted to turn your attention to the fact,

269
00:14:12,330 --> 00:14:15,540
that some things here look pretty similar indeed.

270
00:14:15,540 --> 00:14:16,460
Right?,

271
00:14:16,460 --> 00:14:19,470
And actually we can say daddy module exports,

272
00:14:19,470 --> 00:14:21,340
kind of a public API,

273
00:14:21,340 --> 00:14:24,380
because everything else of course stays private

274
00:14:24,380 --> 00:14:25,510
inside of the module.

275
00:14:25,510 --> 00:14:27,050
All right?

276
00:14:27,050 --> 00:14:31,966
And that's basically how named imports and exports work.

277
00:14:31,966 --> 00:14:36,107
So we saw how we can export just one value

278
00:14:36,107 --> 00:14:40,240
and also how we can export multiple values at once,

279
00:14:40,240 --> 00:14:44,440
and also how we can change the name of the Named Exports,

280
00:14:44,440 --> 00:14:47,890
and also of the named import,

281
00:14:47,890 --> 00:14:49,460
like this.

282
00:14:49,460 --> 00:14:51,820
Then we learned how we can import everything

283
00:14:51,820 --> 00:14:53,140
at the same time.

284
00:14:53,140 --> 00:14:56,390
So all the named imports at once.

285
00:14:56,390 --> 00:14:57,370
All right?

286
00:14:57,370 --> 00:15:01,520
And so now it's time to talk about Default Exports.

287
00:15:01,520 --> 00:15:05,646
So I said that they were Named Exports and Default Export,

288
00:15:05,646 --> 00:15:07,500
and so let's now talk a little bit

289
00:15:07,500 --> 00:15:10,660
about these exports defaults.

290
00:15:10,660 --> 00:15:12,976
So usually, we use Default Exports

291
00:15:12,976 --> 00:15:17,050
when we only want to export one thing per module,

292
00:15:17,050 --> 00:15:20,870
and so that's the reason why they are called default.

293
00:15:20,870 --> 00:15:22,860
And so it works like this,

294
00:15:22,860 --> 00:15:27,220
so pretty similar, but then we have to write default,

295
00:15:27,220 --> 00:15:30,173
and then here, we want to simply export a value.

296
00:15:31,240 --> 00:15:35,280
So for example, if we wanted to export the same function,

297
00:15:35,280 --> 00:15:39,210
we would simply export the value itself,

298
00:15:39,210 --> 00:15:40,483
so not the variable.

299
00:15:41,700 --> 00:15:45,280
And here you see, that no name is involved at all.

300
00:15:45,280 --> 00:15:48,200
We are simply exporting this value.

301
00:15:48,200 --> 00:15:50,410
And so then when we import it

302
00:15:50,410 --> 00:15:53,720
we can basically give it any name that we want.

303
00:15:55,730 --> 00:15:59,003
So let's say import add from,

304
00:16:01,280 --> 00:16:04,010
shoppingcart.js

305
00:16:04,010 --> 00:16:07,890
And so this will then import the Default Export,

306
00:16:07,890 --> 00:16:10,210
no matter what that's called.

307
00:16:10,210 --> 00:16:12,490
And in fact it's not called anything.

308
00:16:12,490 --> 00:16:16,053
And so, yeah, we can give it any name here that we want.

309
00:16:17,210 --> 00:16:18,790
And right now, we are actually

310
00:16:18,790 --> 00:16:23,090
importing the same module here twice as you see,

311
00:16:23,090 --> 00:16:26,260
now that's not a problem, as you see here now,

312
00:16:26,260 --> 00:16:28,840
but usually we don't do that.

313
00:16:28,840 --> 00:16:29,780
Okay?

314
00:16:29,780 --> 00:16:31,800
So we didn't get any error,

315
00:16:31,800 --> 00:16:35,310
but it is also not advisable, I would say.

316
00:16:35,310 --> 00:16:37,870
So let's take this out here for now.

317
00:16:37,870 --> 00:16:41,423
And now let's once again try to,

318
00:16:42,850 --> 00:16:45,433
actually use the value that we imported here.

319
00:16:47,030 --> 00:16:50,593
So let's add two pizzas, and here they are.

320
00:16:53,020 --> 00:16:54,050
All right?

321
00:16:54,050 --> 00:16:56,400
And we could even mix all

322
00:16:56,400 --> 00:16:59,200
of them in the same import statement.

323
00:16:59,200 --> 00:17:01,620
So if we wanted, we could have default

324
00:17:01,620 --> 00:17:06,560
and named imports and exports all at the same time.

325
00:17:06,560 --> 00:17:09,200
So here we would just have to take this one,

326
00:17:09,200 --> 00:17:12,990
and then put that here after a comma,

327
00:17:12,990 --> 00:17:15,440
and then we could take a look,

328
00:17:15,440 --> 00:17:18,793
for example, at the price once again.

329
00:17:19,870 --> 00:17:21,150
All right?

330
00:17:21,150 --> 00:17:23,810
However in practice, we usually never mix

331
00:17:23,810 --> 00:17:27,600
Named and Default Exports in the same module.

332
00:17:27,600 --> 00:17:30,680
So this is not really desirable here.

333
00:17:30,680 --> 00:17:33,993
Let me just comment it just so you see that we can do it,

334
00:17:34,870 --> 00:17:38,283
but I will then leave it as it was before.

335
00:17:39,852 --> 00:17:40,773
All right?

336
00:17:41,760 --> 00:17:44,053
So of course now the price is not defined,

337
00:17:47,040 --> 00:17:49,700
but now we should be good to go.

338
00:17:49,700 --> 00:17:52,100
So the preferred style is actually

339
00:17:52,100 --> 00:17:55,640
to just use one default expert per module,

340
00:17:55,640 --> 00:17:57,893
and then import that here like we did.

341
00:17:58,940 --> 00:18:00,950
And in fact, that's the reason why

342
00:18:00,950 --> 00:18:04,950
it is easier to import a Default Exports.

343
00:18:04,950 --> 00:18:08,340
So here we don't even need to use the curly braces,

344
00:18:08,340 --> 00:18:12,310
and the designers of the specification, did that on purpose.

345
00:18:12,310 --> 00:18:16,890
So again, to make it easier, to import default exports

346
00:18:16,890 --> 00:18:19,590
but of course that's not a rigid rule,

347
00:18:19,590 --> 00:18:21,520
that we always need to follow,

348
00:18:21,520 --> 00:18:25,940
so, we can do whatever is best for any given situation.

349
00:18:25,940 --> 00:18:29,090
However, what you probably should really not do

350
00:18:29,090 --> 00:18:33,770
is to mix Default and Named Exports like we did here,

351
00:18:33,770 --> 00:18:36,600
so avoid that to reduce complexity.

352
00:18:36,600 --> 00:18:39,680
But besides that, you can use Named Exports

353
00:18:39,680 --> 00:18:44,590
or Default Exports, whatever works best in your situations.

354
00:18:44,590 --> 00:18:47,940
Now, of course, we will use all of this in the real world,

355
00:18:47,940 --> 00:18:50,090
in our next big project.

356
00:18:50,090 --> 00:18:53,130
And so by then, you will get a good feeling for how all

357
00:18:53,130 --> 00:18:54,210
of this works,

358
00:18:54,210 --> 00:18:56,840
a little bit better in the real world.

359
00:18:56,840 --> 00:18:57,920
All right?

360
00:18:57,920 --> 00:18:58,753
But with this,

361
00:18:58,753 --> 00:19:02,600
you now already have a pretty good idea of how importing

362
00:19:02,600 --> 00:19:07,150
and exporting values between modules actually works.

363
00:19:07,150 --> 00:19:09,370
But before finishing this lecture,

364
00:19:09,370 --> 00:19:11,196
I actually also wanted to prove you,

365
00:19:11,196 --> 00:19:16,196
that imports are in fact, a life connection to exports.

366
00:19:16,630 --> 00:19:18,190
So that's something that I mentioned

367
00:19:18,190 --> 00:19:19,981
by the end of last video,

368
00:19:19,981 --> 00:19:23,370
and it's something really important to keep in mind,

369
00:19:23,370 --> 00:19:25,423
and so let's take a look at this.

370
00:19:26,800 --> 00:19:29,045
And so actually what I will start doing,

371
00:19:29,045 --> 00:19:32,713
is to now export this cart array here.

372
00:19:34,169 --> 00:19:35,343
All right?

373
00:19:36,410 --> 00:19:39,895
So here now it looks as if we are simply exporting

374
00:19:39,895 --> 00:19:41,145
this MTRA here.

375
00:19:42,458 --> 00:19:43,970
So cart is an empty array,

376
00:19:43,970 --> 00:19:46,163
and that's all we are exporting here.

377
00:19:47,070 --> 00:19:51,403
But now watch what happens as we add a couple more products.

378
00:19:52,840 --> 00:19:54,073
So let's say bread,

379
00:19:55,280 --> 00:19:56,270
five,

380
00:19:56,270 --> 00:19:59,523
and then just a couple of apples.

381
00:20:00,650 --> 00:20:04,390
And so watch what happens when we now import this cart

382
00:20:04,390 --> 00:20:06,203
and to log it to the console.

383
00:20:07,250 --> 00:20:09,253
So, actually let's do that here.

384
00:20:10,800 --> 00:20:13,050
So I mentioned we should not mix them,

385
00:20:13,050 --> 00:20:17,120
but now just to make this work, we actually need to.

386
00:20:17,120 --> 00:20:20,900
So we're mixing a Default Export and a Named Export,

387
00:20:20,900 --> 00:20:23,290
but nevermind.

388
00:20:23,290 --> 00:20:24,400
Okay?

389
00:20:24,400 --> 00:20:26,660
So everything is added to the cart,

390
00:20:26,660 --> 00:20:30,363
and now let's lock the cart, and see what happens.

391
00:20:31,434 --> 00:20:35,019
So here we do not see that empty object,

392
00:20:35,019 --> 00:20:38,900
that we export, but instead we have this array

393
00:20:38,900 --> 00:20:41,803
with the objects that we just added to the cart,

394
00:20:41,803 --> 00:20:43,963
by calling the add function here.

395
00:20:45,050 --> 00:20:48,360
And so that proves that this import here,

396
00:20:48,360 --> 00:20:51,550
is in fact, not simply a copy of the value,

397
00:20:51,550 --> 00:20:53,760
that we exported here.

398
00:20:53,760 --> 00:20:54,593
Right?

399
00:20:54,593 --> 00:20:55,810
Because if it was,

400
00:20:55,810 --> 00:20:58,970
then here we would simply get debt MTRA,

401
00:20:58,970 --> 00:20:59,803
Right?

402
00:20:59,803 --> 00:21:02,070
Because that's what this cart variable looked

403
00:21:02,070 --> 00:21:04,990
like by the time we exported it.

404
00:21:04,990 --> 00:21:07,490
But, as I mentioned in the last lecture,

405
00:21:07,490 --> 00:21:09,560
it is not simply a copy,

406
00:21:09,560 --> 00:21:10,957
it is a life connection.

407
00:21:10,957 --> 00:21:13,690
And as we call function,

408
00:21:13,690 --> 00:21:16,470
that we called as in the other module,

409
00:21:16,470 --> 00:21:19,970
we keep pushing objects to that array.

410
00:21:19,970 --> 00:21:22,400
So we are mutating that array here,

411
00:21:22,400 --> 00:21:24,080
and so then here of course,

412
00:21:24,080 --> 00:21:27,261
we see that manipulating the array, in the console,

413
00:21:27,261 --> 00:21:29,830
as we locked the cart here.

414
00:21:29,830 --> 00:21:31,540
And so they are in fact,

415
00:21:31,540 --> 00:21:35,830
the exact same object behind the scenes, basically.

416
00:21:35,830 --> 00:21:38,550
So one more time, repeat it with me,

417
00:21:38,550 --> 00:21:42,130
imports are not copies of the export.

418
00:21:42,130 --> 00:21:45,340
They are instead like a live connection,

419
00:21:45,340 --> 00:21:48,720
and so what that means is that I point to the same place

420
00:21:48,720 --> 00:21:49,805
in memory,

421
00:21:49,805 --> 00:21:53,530
because again, otherwise, if it was a copy

422
00:21:53,530 --> 00:21:57,260
then here, we would not get anything in the array.

423
00:21:57,260 --> 00:21:58,560
And so keep this in mind,

424
00:21:58,560 --> 00:22:00,560
when you write your own programs

425
00:22:00,560 --> 00:22:02,980
because this can of course leads to bugs,

426
00:22:02,980 --> 00:22:04,900
if you don't know what you're doing,

427
00:22:04,900 --> 00:22:08,484
and if you don't know that this is how it actually works.

428
00:22:08,484 --> 00:22:10,460
All right?

429
00:22:10,460 --> 00:22:13,800
And so with this, we actually finished this video

430
00:22:13,800 --> 00:22:16,110
which was a pretty important one,

431
00:22:16,110 --> 00:22:18,040
because this is the foundation

432
00:22:18,040 --> 00:22:21,991
of how we organize a modern JavaScript code base.

433
00:22:21,991 --> 00:22:25,410
So make sure to review this lecture thoroughly,

434
00:22:25,410 --> 00:22:27,040
and I would actually like you to play

435
00:22:27,040 --> 00:22:28,518
around a little bit on your own,

436
00:22:28,518 --> 00:22:32,070
with exporting and importing some more values

437
00:22:32,070 --> 00:22:33,710
like we just did here.

438
00:22:33,710 --> 00:22:36,493
And after that, I see you then in the next video.

