Our research project was in relationship to adapting cover crops to northern region. We are located just north of Duluth by about 30 miles, so in northern Minnesota, south. North of here, a long ways. And so in relationship to that, I'd like to have Abe introduce himself in a little bit about his operation. I'm Abe Mock. I'm from Sturgeon Lake, Minnesota. Ever since I graduated from the University of Wisconsin River Falls, I have been full-time on our beef cow-calf operation. We have strived to market, beamed directly to customers, and as the grass-fed beef market expands, we have begun to do some of that, not all of our genetics match that market. So we're trying to address that, but more importantly, we feel that it's our access to high-quality forages later into the season that is holding us back in that regard. And then my wife and family farm in Barnum, and we do cow-calf, have some of the similar goals to Abe in relationship to doing direct marketing of grass-fed beef, and that really was kind of the interest in looking at and adapting our system into the aspects of utilizing cover crops in our region. In addition to that, one other farmer that we had involved was a more conventional grain farmer. He was located near Floodwood, Minnesota, and was utilizing wheat, canola, and also growing some very short-season corn varieties, and so in relationship to that, he was the third farmer in this process. This is a picture of our field day. We had a, this is the site of our two-year study. The first year we had oats and peas, and we harvested that. The conditions were right, where I made dry hay, round baled it, and then we came in the fall with the winter rye and purple-top turnips. Some of the data collection that we were looking at were things in relationship to nutrients and biology. What implications did the cover crop have on those soils? If we could produce a forage of quality after our primary crop was harvested so that it could continue to produce a crop and sustain quality long enough so that the cattle, as they were consuming it, would continue to grow well and put finish on, and so we looked at yield and quality in relationship to that, and then we put those numbers into a cost analysis. Okay, as I stated earlier, we had the peas and oats, and we came in with the turnips at three pounds per acre, and the winter rye at three quarters of a bushel per acre, and a quarter bushel of peas. That is in 2014. In 2015, we removed the peas because we really didn't see much growth of the peas in the mixture, and so we kept the turnips the same at three pounds per acre, and I apologize. It should be one bushel of winter rye per acre in relationship to that. There were a little bit differences in iterations with the three different farmers in the second year, and in my case, I actually no-till drilled that into the ground, and in Abe, he took a much different approach. Yeah, I had a back injury in the last early summer, so I got backed up on work, and the winter rye kind of got out of hand, and I was like, well, maybe we'll combine it while I couldn't find anyone to do that, so as well we'll cut her with the disk vine, open up that swath real wide, and see what kind of seed disbursement we can get. It worked really well. I raked up the windrows, bailed it, and then I came with the finishing disc, lightly disked it, then came in with the fertilizer, 30 pounds of AMS, 100 pounds of pot ash, with three pounds of purple top turnips mixed in with the fertilizer, broadcasted that, and then proceeded to drag it, and then we got a timely rain about a day later, and it worked very well. In relationship to that, we collected yield data on the growing cover crop, following that basically at time of when we'd get snow, or when we were about to graze that. The data that is presented in this slideshow is data collected at the same time in both the 2014 and the 2015 data. This here's a photo of some peas and oats growing. This would be a primary crop actually at Abe's place, and in 2014, very comparable in 2015 here on our place. In 2015, this photo was taken. It was a picture of us grazing cattle as mob stock, the peas and oats. In Abe's, he actually bailed his up as drive. Yes, that first year in 2014. This here would be an interceding occurring after the peas and oats occurred in 2014, and then that was actually 830 of 2015 this year. Abe pointed out this year as we looked at this. This area had been an area where we had utilized some supplement during its initial grazing, and the cattle had beat up that area, but a majority of it looked like the remaining fraction there of the stubble where it was. Here was a photo. The winter rye and turnips was planted on 830, which I would generally recommend trying to get that done sooner. We had a very unique fall this year in that it was very warm, very moist, and so we had a tremendous amount of growth. The strips were due to operator error, and I give the credit in my case to my son. He did all of the planting in 2014 this year, so I give him a little bit of latitude to do this, otherwise it may not have gotten done. That was a photo of 921 of this year, and then that's a picture of my daughter's feet, and that was on 1010. What was interesting is due to the season it just continued to grow. It was unreal, the growth. That is a photo also on that same day looking up the hill. You can see in the background we had bales in this particular instant set out for bale grazing on the edge. With this high quality of feed we actually strip grazed it, allowing them to consume hay and a portion of the field as a supplement to the hay to boost the protein. I think that the key to helping make this work even better is that the material is very, very high in moisture, very high quality, but utilizing it as a supplement to hay to get the animals to be able to consume enough dry matter at the same time is extremely valuable in relationship to that. This photo taken on the 23rd of November when we started grazing, so we had just pulled them off of some other pasture, brought them in and would give them the equivalent of two days of feed. This morning I did some calculating and they were consuming on average of approximately three to four pounds of dry matter of the winter rye and turnips and approximately thirty to thirty-five pounds of dry hay at the same time through this process. We would strip all the way across the field perpendicular to the hay and basically move them every other day in that process and was able to manage that pretty nicely in that manner. 2014, you want to cover the yield, say? On the Salzer Farm, Troy's got quite a bit better nutrient availability, higher fertility in his ground and it's very obvious there is total dry matter, three point four six tons per acre. On my place, we had two point seven seven on Peterson's, one point four eight tons per acre. Dave also hosted a tour in the fall of 2014 and a component that Abe's quite modest. I'm very lucky to have the opportunity to work with Abe in this respect, but he did something kind of unique on another portion of a field. He went ahead and planted a similar cover crop, but what he did is he went out there with just garden rain birds and he put on about an inch of rain on that area and for me it was extremely interesting in that it increased his cover crop yield, which would be this column here, that's the yield of the cover crop. This was the primary crop and in Abe's case he increased the yield of the cover crop almost to four, it was like three point nine two tons of dry matter per acre with one application of rain, water, irrigation and so I think that the folks out there that do have the opportunity to irrigate stuff have two distinct advantages. One it allows you to plant perhaps later and still achieve very very respectable yields in that process and secondly to get those sort of yields also gives you a significant advantage in relationship to the potential to produce forage late season of very high quality and allow you to extend your grazing season in that process and I think that in some respects that shows through in relationship to how our yields turned out in year two or 2015. Okay again on the Salzer farm, Troy old performed both the Mock and Peterson's with 4.94 total tons per acre and on our farm around three ton per acre of Peterson's corn was a 3.39 tons per acre. Salzer had oats and peas, we had winter rye, Peterson corn. Part of Scott Peterson's situation is that he utilized the corn, was going to graze it off and he grazed it at that sort of yield but it pushed back his planting date on his cover crop so far that in essence the stand was very irregular, there was a few spots that were very good but a majority of the field was not very good in conjunction with that they had received several rain events throughout the course of the fall and we have a soil moisture meter and when I was out soil testing in fall at Scott's place it I think only one spot did it not peg out and that means that it's over 50% moisture in the ground and so in essence it was flooded a majority of the time that he had that seed in the ground throughout that whole fall growing period and so that was partially due to that I would say most likely contributed to what I would consider nearly a crop failure in that particular instant. In regards to the economics in 2014 the yields there are repeated for the cover crops 1.14 ton, 1.2 ton at ABEs, Peterson's at .3, cost per acre that $43.40. In ABE's case I give ABE a tremendous amount of credit he keeps very detailed records of the amount of time it takes him to prepare fields, the cost, the fuel all of those sort of components are calculated in there and his cost was almost $54 whereas in our case and in Scott's case we use the Iowa custom rates numbers in relationship to what our seeding costs are at the bottom those are the averages with Peterson's with Scott's included and without I think it's important to look at both of those and that's why we included it on the slide because failures happen and so therefore it's important to take that into consideration. ABE pointed out something that I think is really critical as we look at these opportunities to grow cover crops I think it's important to understand that if you can have a little bit better fertility in your soils the rate of success will increase in that perspective so take that into account. One thing I struggle with on our farm is we've got very sandy forest soils what I've noticed is that our commercial dry urea fertilizer that plant isn't there to take it up we get a rain it's lost so we're just seeing where a manure is the preferred nitrogen source on our farm and that's what and I just I can't emphasize enough have the fertility there if you want to capitalize on this cover drop practice just it seems like common sense but have the proper there in the proper form that you can utilize it because it's such a challenge to build organic matter on these sandy soils there's nothing if you're not growing anything it's going to be really hard to do that. When looking at the cost analysis on average with the cost of the seed and such we took into consideration what the local market was for the sort of quality that we saw here and as a standing forage we valued at $80 a ton for dry matter and it looked in our cost analysis to be a net revenue of approximately $27 an acre that doesn't include the value that it's contributing to soil health and or potential soil loss in this process and so I think that those things need to be also considered. The economics for 2015 similar yield ranging from no real yield up to 2.28 tons and our costs were slightly lower in our region for winter rye seed this past year and we had taken the peas out of there and so overall you can see that the cost per ton of dry matter had gone down and so therefore our net revenue per acre had increased to approximately $61 an acre. Now the other thing we didn't have a frost even though we had snow November 23rd thereabouts that snow left and we never had a terminating frost in relationship to our turnips in winter rye virtually until December 14th I'm young old and I don't ever remember a fall quite like this and maybe Abe would be different and so that yield I would not consider normal by any stretch of the imagination it just kept growing and growing it was awesome it was so much fun and so I think this may be an anomaly but I think that it's important to look at or consider those components. In relationship to crop analysis these were scissor cut clippings taken and that's how we analyzed all of our yield data. The scissor cut clippings ranged in protein from about 16 to 21% crude protein very very high our digestible dry matter was about 70 and our relative feed value was in that 200 range and then this year it would be pretty comparable about 18% crude protein 70% digestible dry matter and about just over 200 relative feed value extremely good should be considered a supplement and then finally in relationship to our soils data the F9 is our field and EH is apes and then that's treatment and control and probably the thing that I would like to point out is if you look at nitrate nitrogen availability in the treatment at our place 41 versus control where there's no cover crop growing 56 that's 15 pounds of available nitrogen after a very wet rainy fall where there was probably a lot of nitrogen moving through as it is we are seeing basically an uptake by the crop and then the same is true of the sulfur and so in relationship to that I think it's really critical to think about what we're doing in relationship to environmental benefit in regards to those components the other thing that we still are not fully aware of in the salvita or the carbon dioxide burst test we had excessive numbers we went back to the lab and said is there a decimal place that moved here or something and they said no that that was the case and so honestly that is something that we really need to look further into those numbers are huge and so that's something that we would love to get feedback from or have interest in regards to that with that we'd be happy to take any questions so the question was in relationship to the nitrate nitrogen level when looking at that and comparing those components what is that demonstrating and so as I look at this data it was a soil test that was collected at the same time we were collecting the scissor cuts in fall and so with that in mind there was less potential nitrogen in the treatment where the cover crop was growing available for it to be washing through the soil and the same is true of the available sulfur in that top 6 inches of soil the other component is as we dug down we had roots that were 16 to 18 inches deep on that winter rye and turnips this fall and so it really did grow well the question was did we look at compaction in association with grazing versus the components of just harvesting naturally with harvest equipment and I would say that our soils are significantly different between apes and mine and scots and so I would say that our bulk densities on the lab report were not of what I would consider compacted soil so I can't really address that between our different options for me I don't have equipment to harvest forage and Abe and Scott have that opportunity and so we just don't manage it as such but that would be an interesting component to take into consideration so the question was did we calculate the economic benefit of the forage production and I would say we didn't calculate it directly but indirectly when comparing it to what the local hay markets were and utilizing a figure of 80 tons of dry matter per ton of dry matter yes it's scissor cuts and so I know that that is artificially higher than what you would harvest with livestock but even if you're looking at 75% of it the range was about $27 of net benefit to that $61 of net benefit in my case the production was rather low and then combined with the wet conditions and wanting that winter rye to establish and come back in the spring I chose not to graze it because there wasn't much tonnage there and I didn't want to destroy the field with the traffic from the cattle so in that sense we weren't able to capture what Troy was able to with grazing his cattle getting into the beneficial aspects of what we're doing with the soil, the microbiology, we don't really have a handle on that yet


It's Logan here back here again with another reaction video and now today we're gonna be reacting to the next member from TXT or TexT or TexT or TexTE or TexTE or TexTE or TexTE or TexTE it's one of them we all know that but yeah the other day we reacted to JunDzun. JunDzun? JunDzun? JunDzun?


The following is a production of New Mexico State University. Welcome to another episode of Long Live La Familia, the nutrition soap opera series that speaks not only to our hearts, but also to our stomachs. I'm Keri Bachman and I'm your host for the series. Today's episode is entitled Esas Tietas No Sirven, Why Weight? And in English that means those diets aren't worth anything. So as you can guess the topic of today's show is weight control and body image. Now our episode today features the daughter in the family whose name is Lisa. Lisa is a single mom, she's got two teenage daughters and she also has a full-time job so she's really busy, she's got a lot going on in her life. Now if you've watched our episodes before you know that there are several things that make them unique. We have three different segments and so we'll be able to get back together and talk about what we've seen and apply it to our own lives. The other thing that's interesting is each segment has a mixture of Spanish and English together. Now don't worry if you don't speak any Spanish you'll still be able to understand everything that's happening and if you're trying to bone up on your Spanish all the better. Today of course we're going to be making a recipe as we always do and because we're looking at teenagers and body image we're going to use a recipe that's very popular with that age. It's a dip that can be used with both fruit and with vegetables. Now as we watch this first segment of the episode I want you to pay particular attention to what the relationship is between good health and good looks. What are you going to eat, Monique? I'm just going to have some chips and ranch. I never get to eat this at home. Here's your water. Oh, no, I'm having a diet soda instead. Girls, do you know what my new bracelet is? The silver bracelet? I think I saw it in the bathroom. I'll go check. Oh, I hope my date lies the way I look. Tia Lisa, trust me, you look great. Don't worry, that's why you're going to think about your friend. And that dress is amazing. Would you believe I bought this dress in 1973? I'm still fine. Maybe Miguel can't find my house. Hello. Oh, hey, hermanito. Oh, I'm doing great. I'm just getting ready for my date. Yeah. I'm going to have dinner with Miguel. No, your dad doesn't know what he's going to do. Yes, he thinks mom is traveling. Hey, Santiago, tell Fidel to come watch videos with his cousins. Raquel has not seen him since the family reunion. Santiago, I gotta go. It's bien chula. Pues me cuido y trato de comer bien. Eating right makes a difference. Look how good your grandma looks in this picture. Sí, ella se ve bien. For her age. Por suerte, mucha de la familia Sierra somos saludables. Your tía Carlota, for one. She has so much energy. Y tío Samal se está mejorando ya que coné como un conejo. Even my mom's healthier now, too, since she's been eating all those baked chips. Los dos se ven mucho mejor ahora. Well, I don't know that your tío Samuela and your mom are your best role models. Sabe lo que dice grandma? Es mejor comer un poco de todo. He's here. Monique, por favor, abre la puerta, mi hijita. I'll be ready in a minute. Ay, ay, ay. Too bad Sylvia's not here to meet him. I wonder what he's like. ¿Qué piensas tú? ¿Qué está guapo? Now, we're going to go ahead and start with our recipe. And as I mentioned, this is something that teenagers really like to eat. Did you notice what Monique was eating for dinner? Graham crackers with peanut butter and then some yogurt. It's not really your typical dinner, and yet it's a healthy choice. And so we're going to build this recipe today around peanut butter. And what I've got here is a kind of peanut butter that is actually lower in sugar and lower in sodium. You think, wow, that's pretty good, isn't it? Well, as we're measuring, we'll talk a little bit about whether that's good or not. We're going to use half a cup of it today. And peanut butter actually is a really healthy food, although you know it's high in fat. It also has a lot of protein, and that's important for growing bodies, like teenagers and children. So it's not a food that you want to cut out of your diet entirely. Here we've got about half of a cup, and dump that in here. But the interesting thing is, as with anything you buy at the grocery store, it's really important to read the labels. Now, if I've got a container of this new kind of peanut butter, I also want to compare it to the same old regular creamy peanut butter. And if you look at the labels on the back, we're not going to do that in detail here today. You'll notice that the regular peanut butter actually doesn't have a lot of sugar or salt in it to begin with. So while this is reduced in sugar and salt, it doesn't actually gain you that much. So what I suggest with products like these is you try them both, whichever one you like. That's the one you should be eating. Now some products, there is a greater difference, and that's when you should choose the product that's lower in fat or sugar or whatever the nutrient is. So we have our peanut butter here. Now this is going to be a dip, and it's kind of a sweet dip. We're going to add now some honey. And you can see what I've got here. I was able to find just at the local grocery store, New Mexico made honey. And this means we're supporting our local beekeepers, which is a lot nicer than having to buy honey from somewhere where we don't know where it's really coming from. This is a good way to keep farming going in the area where you live. Sometimes you can even buy honey at a farmer's market and meet the beekeepers in person. So we'll put in about two tablespoons. The nice thing about honey is it adds a really nice, sweet flavor, but it also adds more than sweetness. It adds also, you know, a nice taste as well. We could add sugar here, but that would just be sweet. Honey, we add a little bit more flavor. Okay. So we've got our honey and our peanut butter. We'll have two more ingredients to add, and we'll set this aside for the moment and add them later. Now as we're looking at this next episode, what I'd like you to focus on, what are the external images, external environmental factors in our lives that affect the way we feel about our bodies? So it's not just how we personally feel about our bodies, but what other people are telling us and what the media is telling us too. Let's take a look.  Yo también podría en la universidad, pero me lastimé el otro día y ya no puedo. Ah, no. I don't know what I'd do if I ever had to stop running. Bueno, pero por lo menos todavía puedo bailar. You dance? Sí, I used to dance more than I do now. Yo bailaba disco todo tiempo, pero ya no tengo tiempo. I know. I hardly dance anymore either. Ever since I had my baby. Sí, tú y la Silvia no más venter a novedas todo el tiempo. Tía Vicky says, Raquel's got to be a real soap opera fanatic. But Monique, on the other hand, she's... Yeah, Tía Lisa always walks during her breaks at work. Y sí, acá temprano es de trabajo. Sale hasta la huerta en bicicleta. Oh sí. Me gusta mantenerme activa. Oh, hi. Te traje esto. I hope you like them. Oh, thank you. That's so sweet of you. Listo? Yes, let's go. Girls, mucho gusto. Nice visiting with you. Now girls, no scary movies, okay? Y no se desvelen. And don't eat all my candy. Mom, no te preocupes. Have a good time. Thank you. Bye. All this talk of exercise makes me feel guilty. Look at this model. ¡Qué flaca! Quisiera estar así. Raquel, what are you worried about? Ser tan flaca como ella no es saludable. To me, she looks too thin. Yeah, but guys like thin. Me voy a poner la dieta. I called in for this really cool hamburger diet I saw on TV. Oh, esa dieta que te deja comer toda la carne que quieras, pero poquito pan. I'll be able to eat as many hamburgers as I want and I'll just throw away the buns. But then what about your beloved cookies? ¿Tampoco vas a poder comerlas? Esas dietes no sirven, Raquel. Don't waste your time and money on these lies. I couldn't resist. ¿Les gusta mi máscara? Sí, te ves mejor así. Mr. Roswell alien. Oh, hi, Raquel. Where's Sylvia? Oh, Sylvia está visitando mi mamá y yo vine para acá. Hey, Fidel. Tell me. So how do you think about these days? ¿Por qué las muchachas se preocupan tanto de su peso? Vamos a ver el video del área o no. What did you notice in that last episode that had an effect on the character's body image? The first thing I saw was the magazine that Raquel was reading. And I brought some magazines today and we're going to take a look at them as well. It's incredible if you take a look at the magazines you have at home, exactly how many images there are in magazines, both in advertising and in the articles themselves, that relate to your body image, whether it's the image of wanting to look thin or trying to buy food that will help you do that. Let's take a look at some of these that we see here in 17. You can find these in any magazine that you have yourself at home. This first advertisement is for a skin scrub. And it looks fairly plain on the surface. It doesn't look like very much, does it? It's got a picture of a mirror with the apricot scrub in the middle and it says, who's the most radiant of them all? Now that recalls to us fairy tales and it also makes us think a little bit, okay, number one, it's important to look good. And number two, it's important to look best of all.  It sets women up for trying to look better than other women and that's not a healthy way to be. It says in the smaller print, it's not your mirror that's magic, it's this scrub. So again, it's as if you need to have some sense of magic or something added to you to make you look better and be a better person. Nothing talking about anything inside yourself such as what you're really like or what your feelings are. Here's another ad from the same magazine and you notice here it's a little bit more risque, isn't it? We will always see if the woman is a little bit of hair and then her long legs sticking out from underneath the picture that she's holding. It's as if the woman herself doesn't matter at all. Only thing that matters is her appearance and her body, her heart, her spirit, her mind, all of that is hidden. This is a very strong message to be sending to teen girls. Now we look at the text underneath. This is an ad for shaving gel. Picture perfect legs. So again, we're looking at perfection and at the picture of something, not reality but a picture. Picture perfect legs in a wild new flavor. That's kind of an odd thing to be associating flavor with shaving gel. But advertisers are very smart. They know that food elicits a lot of emotions in women and so you'll see that a lot of food imagery and words being used in advertisements that aren't even selling food. Let's take a look now. Let's take a look now at another magazine and this is a general women's magazine so the audience is a little bit older woman who has children at home. And the first ad that we see here has a huge picture of a little girl happily munching away on a blueberry muffin. So the child is happy. That's important for parents, isn't it? And the text says the great buttery taste you can feel good about giving your family. So the immediate thought is in order for a woman to feel good she, number one, has to buy this product. Number two, she has to do something for her family. She can't feel that she herself is good as a person without having some connection to other people and that's a trap that women fall into quite a bit. Now in terms of the food part of this advertisement it's interesting that it says it has great buttery taste. This is not butter, this is margarine and for years people have been substituting margarine for butter thinking that it's healthier. Well it's true that butter doesn't have cholesterol but it's true that margarine doesn't have cholesterol but this margarine in fact has a lot of fat in it. The advertisement doesn't tell you that. It just says the flavor says butter. Let's look now at another ad in the same magazine. Here we notice a child who's very happy holding some lunchables which is a kind of fast food snack product and the title at the top, Balanced Fuel That's Cool. So here we're playing to two audiences. Balanced fuel that makes the moms feel good that they're giving the child something healthy. That's cool so the kid thinks that they can go to school and everyone will think that their lunch is really neat. A lot of times advertisements for food are played to children nowadays because children often shop at the grocery stores with their parents. Now what it says in the small print underneath, a balanced lunch with good stuff from four of the food groups. Well it's pretty easy to have a lunch that has things from four of the food groups. The question is are those items in each of the food groups as nutrient dense as they could be and in this case they're not. This meal is fairly high in fat, high in sodium and low in important nutrients that children need. Now I'm not saying that all advertising is bad or that these products in particular are not worthy to be bought. It's just that we need to make sure we're looking at advertisements critically in terms of how they affect our body image and our food purchases. Something else that impacts women's body images and people's body images in general is the family in which they grow up. In our case of this episode, Tia Lisa is a very healthy individual and she's kind of passed on those values to her daughter. But Raquel, the cousin, didn't grow up in such a family.  So it's important for us as adults to kind of recognize that and try to instill in our own selves healthier body images that can then carry through to our children. Now let's go ahead and continue on with our recipe. You remember we've got our peanut butter and our honey already measured in. Now what we're going to do is add another ingredient and this is another thing I like to say. Remember start with something healthy that you like and number two, be adventurous. And in this case we're going to be adding an ingredient you might think is really pretty strange, pumpkin. You see this only at Thanksgiving in most houses. But the thing that's good about pumpkin is as you can see it's bright orange which is a signal to us that it's high in vitamin A and a lot of children and adults both are not getting enough vitamin A in their diets. So this dip is a good way to enjoy your peanut butter and also get a little bit more vitamin A. And you want to use about the same amount of peanut butter and pumpkin. You can actually use twice as much pumpkin if you'd like and it'll give a creamier texture and even more vitamin A to the dish. Okay, so we'll just put that right in here so you can even use the same measuring cup. No need to wash. All right, now our final ingredient. You know me, I like to add spice to everything. And what's a spice that goes well with pumpkin? Well, cinnamon. You could also add nutmeg or allspice. We're going to put in about a quarter of a teaspoon here. Just sprinkle it over the top. So another one of those one-dish recipes. Now what I'm going to do is just mix it up. You can either use your spatula or a spoon. This peanut butter is fairly warm at this point sitting out under these lights. You might want to use a harder spoon, but you can see as it mixes together, it really makes a nice uniform product and also really beautiful color. This is a great party dip too. Something that you might like to serve at holiday time or even in the summer. You can put it in the refrigerator before serving it. It gets nice and thick. There we go. That's all the mixing that it requires. This is something again that children can make on their own at home after school as a snack. Now after we watch the next episode, we'll come back and we'll talk a little bit about how to serve this dip. Now we're going to go into our next episode and continue to think a little bit about healthy lifestyle and how our environment affects us in that way. Now you noticed in the last episode we also talked a bit about exercise and how it's important with exercise too to do something you like and also to be adventurous. In Miguel's case, he used to be a runner, but then he hurt his knee and he wasn't able to run anymore and so now he actually dances and that's kind of an interesting activity. Not a lot of men his age are probably real into dancing. Be healthy and be adventurous. I wish I could have been at the reunion. Get lost, mom. Where put a vegetable on me, papa? I think I heard our truck pull up on the driveway. It's on last 9. La niñera mandó un mensaje del bimbo. Monique, would you show me the other telephone and tell me where is it? Creo que lo dejé en la cocina. Here Monique, would you like some bill parmesan? Gracias, carnet.  Are you sure you're getting the protein? I think I'm fine. Anyways, Raquel y Sibia son las que no comun bien. I hear you say a babysitter called you. Si, yo tengo una hija. Nancy just turned 7 last week. Oh, she's cute. Thank you. Here's the phone. Para felicitarlas por su nuevo hogar. Yeah, dad. Didn't they pick up a great trailer? Manufactured home. Can I borrow the keys and drive while you guys talk? Estas muchachos y los carros. Okay, go. Be careful. Okay. Well, thank you so much for the flowers. Eres tan bueno. Who's that? ¿Cómo puedo yo competir con ese hombre? I better skip lunch tomorrow. Y así empezar a deshacerme de esta panza. Lisa, tengo que irme. ¿Todo bien? Is something wrong at home? No, no es nada serio. Bueno, volvemos. Did I do something wrong? Don't tell me that was your date. I was just being myself. Pues si no me caigo bien, es mejor saberlo ahora, ¿verdad? It's good to see you're so confident in yourself, sis. Ahora estás más segura de ti misma. Thanks, Santiago. It was jealous. Celoso de mí. Santiago, you're going to have to help me fix this. No quieres que Miguel piense que tú y yo estamos saliendo? Pues qué vamos a hacer. No te preocupes, it's a simple plan. Ay, Raquel y sus cookies. What we need to do is this. Did you notice something about that last segment? The girls were sitting watching a video on the couch. Kind of just eating mindlessly. In our culture it's very common to just eat without thinking and that's one reason we tend to be a little heavier than we should be. What I recommend to people is actually sitting down to a smaller plate of food that's really delicious food that you really are looking forward to eating and mindfully eating that. That way you'll enjoy what you're eating. You'll have a sense when you're full and you won't have to keep eating and keep eating to fill another part of you. Now, we're going to go ahead and finish up our dip here. Here's the dip and I've cut up some vegetables to go with it and here we've got some fruit. Fruit is what you might normally think about having with a peanut butter dip. You can take a banana, cut it up into chunks or actually serve a whole banana spread with some of this dip and it's really delicious, especially for young children. Apples can be used as dippers in addition. But now the vegetables you may not have thought about but peanut butter goes really well with vegetables. We've got our carrot, sticks, which is something you normally, a lot of kids like to fill with peanut butter and if you fill them with this dip you'll have been straight peanut butter. You're getting the added benefit of some vitamin A and not quite as much fat as you would otherwise. So that's really a better choice. Here we've got some green pepper strips which tend to be nice and sweet and children like to eat them as well with this type of dip. And here's the real surprise. Here's the adventurousness that I was talking about when we put pumpkin into our dip. You also have turnips. And turnips are wonderful food that kids actually really like.  And so what you can do is just dip them in to the peanut butter, into the peanut butter dip mixture, and just eat. They're not cooked or anything. It's a wonderful snack and a great way to introduce a new vegetable to your kids and possibly to yourself if you're not familiar with it. In fact let me show you what a turnip looks like so if you're in the store you know what to look for. It's got kind of a purple top and a white bottom just like this. Well that's our episode for the day. And as usual I'd like to leave you with a goal for the week that comes. Remember what I've talked about today about healthy eating. First you want to start with something healthy that you like to eat and add something adventurous. So think for a moment what are the things that you like to eat and write them down on a piece of paper, the healthy things. And then set a goal for this next week what is a new food that you're going to try. You may not even know what that food is but at least plan to go to the grocery store and find something healthy and new to try over the next week. I hope you've enjoyed our episode and long live our families.


Welcome, EmberCrafts. All right. So a fun thing about prerecorded talks is that this talk is really being given simultaneously by me here in the past and present me, who's available to heckle myself in the chat and answer your questions. But you should listen to that guy, he knows things I don't. All right, I want to motivate this talk by starting with a side-by-side comparison. The scenario is this. You just joined a new team, you cloned their Ember app for the first time, you've got no cache, no dependencies, you've just got the source code, you probably got node, but that's about it. So on the left, we're going to watch you follow today's normal steps to launch into development and on the right, you should use a new approach that I'm going to go into in this talk. So let's let that play. So we'll watch as we do yarn install on the left and we do a new thing on the right and the app is ready on the right. It's already fully booted in development. It's working, we can get a really fast reload of it and we're off to the races. Meanwhile, on the left-hand side, we are waiting for yarn install. Let's let that catch up. Now we're compiling some native packages. Okay, we're ready to start Ember CLI. Our app is available. It's self-reported about nine seconds, but that's not really the full cost. And we made it. We are now also up with a fully running development environment and it also has very fast reloading. Okay, so that was our summary of the two scenarios and here's our waiting time. So here I was careful to measure the waiting time and not the interactive bits. The point of course is that there's a big difference, right? For some weird reason, the new scenario didn't even have to do a yarn install. We'll get into why that is in a second. That was a huge win. But even if we even setting that aside, even if we just look at the actual build times, we were still significantly faster. What's going on there? So that's what I wanna intrigue you with for this talk. We're gonna get into, when your development tools respond instantly, software development's not just faster, right? It can be more fun and qualitatively more creative. So this is a talk about how the tools we used to do web development can be fast and fun without sacrificing the features we need to build reliable, long-lived, stable software on teams that are small and teams that are big. So let's start with some fundamentals. So the fastest build tool is no build tool. You don't really need anything more than a text editor to develop for the web. And of course, this is how most friend and development was done for a long time. And some people still do it that way when they can. Ember first got started in this era, right? You would wire apps together entirely. You could do it entirely in a single HTML file, right? This is an Ember 2 app being developed with no web server at all, just serving the files right off the skin to the browser. And the simple setup and the immediacy are nice, right? But in practice, this gets tedious pretty fast, right? As apps and teams grow and you want to keep the code well organized into modules and packages and test suites, browsers just couldn't help you with that very much, right? And plus the desire to make apps run faster, boot faster, pushed frameworks like us toward ahead of time compilation and bundle optimization, right? And so even around the end of the Ember 2, the early, very early Ember 2 era that this is demonstrating, this was already on its way out. It was already becoming much more favorite to use build tools, right? And that turned out to be the right call, right? Ember was among the first projects to really commit very strongly to requiring a build tool. And that was not a decision without controversy, right? Because the elegance and immediacy with having no setup and just working in the browser was really nice, right? There's a trade-off. We made the right call, right? And in the era that followed with Ember CLI and other framers too doing the same thing, everybody basically accepted that they needed build tools because it gave them a lot of power to develop apps that could just go much beyond what apps could do before that. Build tools and package mentors, right? Gave a lot of power and a lot of sharing of code. So Ember CLI does a lot for you. There's a lot of great docs teaching how to use it. That's the current standard. That's what you should be doing if you're starting a new Ember app today. But I wanna talk about what comes next, right? Here in 2021, browsers and web standards have come a long way since then, right? So it's worth re-asking the question, right? How far can we push in browser development now? How much can we do in the browser by itself, right? So let's take a quick tour together and see what breaks. So you probably already know that browsers support ES modules natively, right? So here we're gonna put a script in type module and we could just import some stuff into it. In this case, we're gonna import off a CDN coming from Skypack and we're gonna use that code and it will work, right? And so this works in browsers, like all modern browsers already. And tools like Snowpack and Veet take advantage of that fact to do a lot less work in their build server and more in the browser and that's a positive development, right? But here I'm asking a more radical question, right? Can we stop doing anything on the server? Can other than maybe just serving up our files and telling us when they change, right? So how far can we push that, right? For example, what about package management, right? So package management isn't really important, right? It's deliberately indirect, right? When you wanna keep your package versioning choices altogether in one place, in a package JSON file accompanied by a yarn lock file or a package lock JSON file, right? And then you want the code you authored to not worry about that stuff. You wanna be able to use abstract names for things, right? That keeps your code much more long-lived, right? It's more maintainable, it's more robust to use to have a real package management system, right? Browsers don't support bearing ports like this, right? So maybe we've hit the dead end, right? Maybe it's time to say we need a server to rewrite this stuff. Well, maybe, but something you might not realize is that browsers are already shipping some features that get around this problem. Now, this particular one is new and not very stable yet and you shouldn't really rely on it. But it works today in Chrome and it's called import maps and there's a draft proposal for a web standard that's not yet really a standard. And it works today and it's cool, right? It lets us say where we're gonna get our libraries from. Again, caution, it's not really a standard yet. Some folks at Chrome are trying to make it V1 and maybe they'll succeed. It hasn't been to details to figure out yet. It has a bunch of good ideas in it and we're gonna use those ideas in this talk. Even without relying on having it natively in the browser, we're gonna use the good ideas from here. The in-browser implementation that works in Chrome right now makes this example, this example really does run. It doesn't support all the features in the draft spec. One of those is called scopes and it's a really important feature. So scopes is the idea that you don't just get to say what your own imports mean or where they come from but you get to say that about your dependencies too, right? So you get control over your transitive dependencies and that's a really critical capability that we've never had on the web before. NPM can do it, right? Like somewhat, right? We wish it had maybe better control and better optimization but it does it, right? Real package managers have to solve this problem, right? You don't want your packages to be statically linked. You don't want all your libraries always statically linked. This is a general concept for all software engineering, right? Not just JavaScript. The idea of static and dynamic linking is the idea that if you statically link things, you're basically building them together into one piece and then they're gonna be one piece forever more. When you dynamically link them, you're leaving the choice till later, right? What libraries your libraries are using is something that you can swap out. You could patch a security vulnerability in one of your deeper dependencies without the intermediate libraries having to act first, right? Or you can deduplicate the choices among transitive dependencies so that they can all share one version, right? That's really critical stuff that you need from package management that you lose when you're trying to get dependencies like completely pre-cooked statically linked off of places like unpackage or sky pack. So let's set aside import maps though for a sec and talk about another problem with our little setup here if we're developing it in the browser, right? Let's move our JavaScript into a separate file, a separate module, right? Which is more realistic anyway. People don't wanna put everything in line in one HTML file. So we're gonna make a separate file and we're gonna keep, continue trying to develop the way we were, which is just reloading things off disk. So let's load this file and uh-oh, it doesn't work. It turns out you can't load modules from file origin. So I guess we're up at the limit here and we can't serve off disk anymore. So we really need a web server. So let's start one up. And I don't think this is a big deal. I think we're still true to our basic story of let's just do in the browser development because web browsers need web servers and a static web server is a very simple thing that runs, it boots up instantly. It's very easy to get and set up. It's basically not a big deal. I still think we're still on our path here of doing pure browser development if we just need a static web server.  It's just weird. Browsers want to be speaking HTTP, right? So let's move on to the next reason people think they might need to build server. Languages, right? People like TypeScript. We like handlebars meaning glimmer templates in Ember, right? Lots of people like SAS. And this is not Ember specific problem because people like view templates and people like JSX and people like spell and browsers don't understand any of this, right? So I guess that's it, right? If you want to use any of these nice things, I guess you can't develop in the browser. I guess we need a build tool. Well, let's just see how far we can get, right? Let's make, let's take our little toy app and convert it to TypeScript. So let's rename our file from JS to TS. Let's add some TypeScript annotations that are just not valid JavaScript, right? Let's change our import of it. And of course this doesn't work, right? In fact, our little web server we started thinks that TS files are MPEG 2 video. So bad guess web server, no, no. So it looks like this is the end of our little adventure of in browser development, right? It's really too bad that we can't just like ask the browser really nicely, like please browser please understand TypeScript. Wouldn't it be nice if that worked, right? Alas. Oh, well, it does work. That's the punchline. What's going on here, right? We're not cheating. There's no, there's nothing going on in this tab that is running that is doing anything weird. If we try to load up the source, we see JavaScript. We don't see TypeScript. Where did the TypeScript go, right? Somehow in between our completely ignorant web server and our plain browser tab, our TypeScript is going away, right? How could we possibly do that? Let's go look at the implementation of this library. Do you see the magic word? Service worker, service worker is the key. So I bet you didn't think this was yet another service worker talk, did ya? That's because most people think service workers are only for offline apps. You've probably sat through talks before called offline apps with service worker, right? But service worker is not about offline apps, right? Service worker is a fully programmable place inside the browser. And you can put whatever you want in there, right? People usually put in offline app support, but instead you can put in a TypeScript compiler. It turns out service worker is an excellent place to put development tools, right? Dev tools play directly into service worker's strengths, right? Service workers are persistent, right? Across page reloads, all your stuff is still there. Just like Ember CLI, just like your dev server is persistent, no matter how many times you reload that tab, right? They're excellent at caching, right? Far better than anything you're gonna be able to do in Node. Browsers are just the best at caching and nothing's gonna get stuff into your browser faster than the browser's own cache. Service workers, when you're doing them with dev tools, actually also avoid service worker's biggest pitfalls, right, which is things like they're not available on the very first page load. In dev, that doesn't matter. It just means you get to see a couple seconds of loading screen while the tools boot up, right? If you're managing version skew in a deployed application with service workers all across the web, that's hard, but that's not the case here. It's just on your machine. You can shut it down when you're done. You could kill it and start it again. And service workers don't support legacy browsers, but that's not such a big deal either, right? The whole current crop of development tools in JavaScript, like Veet and Snowpack, all of them are very, all in on modules, all in on ES modules and modern browsers, and it's really where things are going, right? This is very much in line with that. You can, of course, take the output of these apps and run them through a slower production build that brings them down to working in all browsers, but that's not where you do your development, your daily work, right? You can do that in a browser that supports modules without loss of generality. So that's the core idea in this talk, right? Having build tools in the service worker feels magical. It's like we just taught the browser to natively understand TypeScript, and from the apps perspective, it really does, right? So that's the core idea. I think the next-stage in JavaScript tools is service worker-based, right? So how do we bring that to Ember apps now? That's where Embroider comes in, right? I'm pretty sure at this point in the conference, you have already heard some success stories about apps going to production with Embroider. So I'm not gonna spend a lot of time trying to prove that it works, I'll tell you that it's real. I expect by the time you're watching this, there's probably already an official flag in Ember CLI for generating new apps with Embroider out of the box and a plan for making that flag become the default, right? So Embroider is real. It is not future tech, it's now. I'm already looking forward. I'm moving on, right? Here, I do wanna explain though that Embroider is not strictly speaking a new build system for Ember apps, okay? Incorrect. This is not about replacing one idiosyncratic Ember specific build system with a new one, right? This is, there's a different story here. This is the more nuanced picture, right? Embroider is really a combination of two things. It's a spec for how to share well-behaved JavaScript packages, even when those packages wanna do ambitious things, like be a fully-featured Ember add-on, okay? And it's a compiler for converting our large existing ecosystem of add-ons and apps into that spec, so you get the benefits today without waiting for anybody else to rewrite anything. We've been waiting to make sure that everything you do in Ember has an underlying vanilla representation as standards-confined JavaScript that could be understood by a browser, understood by an arbitrary build tool, and basically making sure that all of the secret sauce or special semantics are all things that you could just say in JavaScript, right? Let me give you an example, right? So you probably know that when you have a JS file and HBS file side-by-side in your components folder, Ember mashes them together somehow and makes a component for you, right? Well, this is the vanilla representation of that, right? And this is not even Embroider-specific. This is the thing that's core in Ember already. This is stable and shipped, right? Under the hood, this is what Ember is doing. This is what it looks like to put together a template and a component, right? And the fact that this exists as a kind of intermediate step in your build, whether or not this file ever actually gets written or whether it kind of gets glossed over in some build tool is really important because it means we're designing a system that is understandable in terms of nothing but web standards, right? You could give these things on the screen, including the template compilation and the component template. They can have runtime implementations or not, right? They can have compiler implementations and that's fine too. The point is though that they, this makes sense as JavaScript, right? And a general JavaScript tool understands it, right? One such tool is Webpack, right? And so if you've already been using Embroider, you've probably been using the Embroider Webpack package. So Embroider Webpack takes care of automatically setting a Webpack for you in a way that's most compatible with Ember and takes care of like lots of the little details of making sure that your app is gonna do all the things you want, right? Your test suite's gonna work right, your fast boot server-strived rendering is gonna work right, et cetera, right? All that though is just a convenience, right? You could just run Webpack separately. Let me show you what that looks like. So this is an example of the changes you'd have to make to go from delegating to Embroider Webpack to doing it yourself. So here we're just gonna drop the Embroider Webpack as a dependency. We're gonna stop setting up a final stage package during Embroider telling it to just leave things alone. We're also gonna customize where Embroider is doing its work because this is where we want Embroider to place the vanilla application for us. Now that we're not getting Embroider Webpack to set things up for us, we're gonna have to set up a few things on our own. So we're gonna add a Webpack loader for handlebars. We're gonna add a Babel loader so that we can transpile stuff that doesn't work in browsers, particularly things like decorators. We're gonna be able to drop Embroider-Scali Live Reload because we're gonna get the native Live Reload out of Webpack. And of course we need a Webpack config, right? It's not that big. You can see the scale of it. It's not that complicated. Certainly it's nice to not have to write it at all if you use Embroider Webpack. The point here though is that if you needed to go down a level, if you needed to try something out or you just wanted to experiment, you could, right? And it works. You can see here, setting up the basics of template compilation, Babel, making sure our index.html file has the right references in it and then we're off to the races. You know, that one screen for the code is all it takes for Webpack to understand arbitrary Ember apps now. Let's see how you would run this, right? So we would still tell Embroider-Scali to start up and it's gonna do a relatively short build because it's only doing the translation from all traditional semantics, all legacy behaviors of all add-ons up to the vanilla spec, right? It's gonna output that for us and then we could take it forward from there with whatever we want, in this case, Webpack. So here we're booting up Webpack. I had to type the full path out just because there's a weirdness going on with yarn and sim linking right there. And then we can boot it up. And here's our app being served natively by Webpack staff server, right? Works fine. And we can make some edits and notice we're editing here the original source, right? We're not editing that vanilla app because we can make a change to the original app and it'll flow very quickly and incrementally through both systems. It'll get translated from classic to vanilla and then Webpack picks it up and we're off to the races. So it works. And we aren't limited to Webpack, of course, because there's lots of other build tools. Let's try to swap into something like Snowpack. Snowpack's different, right? Snowpack's newer and it goes all in on native modules and modern browsers. And it does less work in the build server and more in the browser and let's watch what that looks like. So here I didn't share the setup piece. I'll share some links with it. There's a small number of bugs ahead to fix to get this all working. This really does stress that all of our stuff is truly following the module spec because here it will really run as modules in the browser. So where you were cheating or using compatibility doesn't work here anymore. And there's just like a handful of places in the ecosystem where that pops up just because nothing was checking it before. Even Webpack is more permissive than a true browser running modules. So here you can see the build output of an Ember app built with Snowpack. You can see we still have all our inputs there. The browser's natively doing the imports file to file one at a time. Our dependencies are getting rewritten by, all of those import statements are being rewritten by Snowpack to point at that it's pre-bundled packages. And it all works pretty good, right? One thing you might have noticed that the initial page load here was a little slow, right? And that's actually just because work is being moved around, right? The starting of the Snowpack server is basically instant because it doesn't have to do that much. And that work has moved here into the browser. So the very first time you load the page in the browser is when Snowpack is discovering files one by one and transpiling them. So it's a trade-off that ends up being worth it. And one we'll see again. So the point is not to make every new Ember user choose their own tool chain, of course, right? We always wanna ship with a great out-of-the-back experience that that's just a given, that's basics of why Ember is Ember and what we're trying to achieve here. It's having a really community-curated bunch of things that work well together, right? But it should be possible for people to experiment and for the community to shift naturally over time as new things become possible, right? So that brings me back to the service worker-based build stuff, right? Just like we can swap in Webpack or Snowpack, we can swap in something entirely new, right? So the new, the thing I demonstrated in our opening comparison is a tool I wrote that is brand new, not really production-ready yet, but I'm really excited about how much it can already do and I'm happy excited to show it with you. I'm calling it Moe, and that's the symbol of a Moe, actually. Moe is a kind of not very much used anymore unit of measurement for the opposite of resistance, and I hope that's what Moe is in your development, right? It's something that is the opposite of resistance stopping you from what you wanna do. Moe is not for building Ember apps. It's a general-purpose tool for building JavaScript apps, right? Just like a Webpack or a Snowpack. It just so happens that it's also great at building Ember apps because Ember apps are good web citizens post-embrider, let me switch into my demo of Moe. So just like we did in the little comparison video, we're gonna boot it with NPX, and that was it, that's the whole booting, and even if it was downloaded, it's basically imperceptible because the whole package is one file. That one file is a web server, a pretty small web server written in Rust. It's pure Rust, and all it does is HTTP and it's very good at HTTP and it doesn't understand a thing about JavaScript. It does have embedded inside of it some pre-baked JavaScript files that it can serve, and that's what puts Trap up to the next phase of capability. Let's, oh, so the one other thing it can do though, right, is other than just serving our files, which of course it can do. So if I wanted to look at a file, I could. All right, there's my application template. It serves a manifest of all my files. Very, very quickly it can crawl the files in my project and give me versioning of them. And so the idea here is this really becomes foundational tech within the build tool to do really efficient caching, really efficient interdependent builds, and even efficiently query things like tell me about all of the templates or tell me about all of the files in this subdirectory. We can do that very, very effectively with something like a manifest. So let's take a look at what happens when we visit the root index.html page, and I'm actually gonna disable JavaScript here because otherwise it'll happen too fast for us to talk about it. So when you ask this web server for index.html, you get really just a script, one page that says launching service worker with a script tag, right? And this is the client side library of Moe, Moe client. And there's not much in it, right? It's really just the beach head. All it's here to do is to cause the service worker to load and then wait for it to load and then refresh the page. And that's all it has to do. So most of the interesting stuff's going on here in the worker. And the worker is about nine megabytes of JavaScript, which sounds kind of big if you're used to shipping apps on the web. But it sounds kind of small if you compare it to what it's replacing, which is all the development tools that you have in node modules, which add up to megs and megs of stuff. It also only downloads once, caches forever, and it doesn't even have to reevaluate when you refresh the page because it's living in the service worker, right? So it's extremely efficient. Let's actually let this boot now and we'll turn JavaScript back on. We will let that code run. And we'll see actually how long it takes for that to load in. It's not very long. Now we're already in the initial page load of the Ember app. And just like in the Snowpack case, you can see that the very first one takes a little while. That's because we made a similar trade-off, actually even more extreme trade-off, which is that we're doing nothing in terms of transpilation or package management on the server.  Doesn't transpile them at all, right? All of the work of discovering the files in our app had to happen here in the browser, right? And so let's look at all of a sudden, we're still on index.html, the same page we were on before, but now it has different content, right? So what's going on there, right? Now that the service worker has taken over, it can intercept that request for index.html and decide what to put there. And in this case, Mo has an Ember plugin that knows, oh, I'm gonna put an Ember app here. I see that you have an index.html file. I see that I need to compile your JavaScript and make sure that I have an entry point module that I'm gonna insert in right here where your other JavaScript used to be and serve that back, right? So let's take a look at some of our specific files in this app, right? They're all still here. So app templates, application, HBS, we can go see it. What we see when we load it is the compiled version of it, because this is what our app will see when we load it. The service worker has compiled this template into the compiled form for us. Mo has a little option we can include for debugging where we can ask it to please lay off and let us see what's actually going on in the network. And this lets me see what is really coming off the web server before it has been transpiled. Here you can see the raw HTML, raw HBS that's being served into the browser, right? Let's do the same thing for a JavaScript file. We have a sample Ember data model here. Let's look at the network version first because that's the simple thing that we authored. So here we've got an Ember data model with one attribute. We've got a bunch going on though because we're importing things from a library and we're using a decorator, right? So when we look at what that has turned into, well, it turned into a bit, Babel had to get rid of things like decorators for us because this app's configured to transpile those. Well, everybody else has to have hands about decorators. They're one of the things that browsers really can't do yet because we're really hoping those will standardize. We got some new imports because Babel has implementation that actually is coming from a library. All of a sudden we see that our libraries are now coming from the web somewhere out on an S3 bucket. We'll talk about that in a moment about how we're controlling that. But here's Ember data too. Here's our Ember data import. Notice it's still a real import, right? The browser's doing the modules for us. We didn't, we never had a step where we had to crawl all the modules and find them all because browsers do that, right? They're good at it. And when those modules are being served out of a service worker cache, it's so fast that it's fine to let the browser do it. So in this case, we're getting Ember data off of this S3 bucket. Let's go see what it looks like over there, right? Here we can see, well, untranspiled stuff. We're seeing bare imports. These aren't gonna run, of course, if we try to run them. So what's going on, right? Well, what's going on here is that I've just left my service worker scope, right? My service worker does not have permission to rewrite everything coming off of amazon.az.com. So we're seeing the raw network version of the thing here, but when my app asks for it, it's gonna go through that same translation process and that translation process includes an import map, right? So even though this is a third-party package coming off of, you know, this is, I depend on a certain version of Ember data. This is part of Ember data. Once it loads into my app, it's gonna run through my import map. The service worker takes care of that for me so that by the time the app sees it, these are turned into URLs. Let's take a look at that import map. Again, it's just a number of files sitting in here. So when you would develop an app this way with Moe, the import map is really the equivalent of Yarnlock. And in fact, this one was generated by translating Yarnlock into the new thing. This is the secret to why was I possibly able to skip running npm install or yarn install to get the app booting? The idea is that when your team is working this way, your team only really needs to do that step once. When you get a new dependency, somebody's gotta npm install it, run the importing tool, get the packages published to your S3 bucket or eventually we hope to a publicly shared one so that you can skip the whole npm stuff entirely, right? With a little bit more package management stuff around that, we can get to the point where all of this is native all the time and nobody has to stop and run npm install, right? We could really use a package manager that's native to the web. That's a bigger project. Keep an eye on this space. The folks at Cardstack are doing interesting work on this area with kind of trying to take on the whole package management problem that would interact well with, that would integrate great with this build tool. Let's also take a look at, I mentioned the entry point file. This is an example of a file that is totally made up, right? And it's Ember specific. So of course, so what's going on here is there's an Ember specific plug into Moe that knows how to synthesize the entry point to your JavaScript. And in an Ember app, that means we've gotta do things like register with Ember, a bunch of stuff that is just Ember expects to exist. So add-ons, for example, can stick stuff in here. So Ember data is registering things into our app, right? This is the tree for app feature that add-ons use. How can that possibly work on the web, right? Add-ons need to stick things in here. Well, all of our packages up on that F3 bucket, they still have their package JSON files. And critically, all of them have already run through Emberator, right? Emberator turned them into spec compliant packages. And Emberator V2 packages have to declare explicitly in package JSON in a very static and easily defined form, exactly what features they're using, including their app.js exports, right? It means that we can very cheaply in the browser crawl those package JSON files once and then cache them and know exactly what features all of our add-ons are using. So for example, how does our familiar toaster graphic work here, right? That's coming out of an add-on. How does it boot in my browser here? I can go to this URL and have an image, but why? This is that kind of feature, right? The Ember plugin to Moe knows how to find all my add-ons find their package JSONs, see what features they're using. In this case, Ember welcome page, right? Is an add-on that we're using. We know that it's in our list of add-ons. We can, our import map can resolve where do I find out about Ember welcome page? It's here. If I go there, here's the package JSON. I can look very statically, this is a V2 Ember add-on. Emberator has converted for me. And when we did that, as part of that build, as part of the import step, when this package was first sucked into this new world of how we do development, it did have to run all kinds of compatibility code to get it up to this point. From here forward, it's all legible and static and easy to find, right? And in particular, this package declares that it has a public asset we need, right? It says, you know, I contain this particular file and I want it to be mounted at this URL in the app. And so that's what we do in our build and that's why it works, right? So we can do lots of those kind of features, very ambitious features of automatically integrating stuff all done here in the browser. And rebuilds, of course, were great. You know, if I come and rewrite this page and I save, I get a very fast rebuild. And if I open up the dev tools here, we can actually see, we got a single cache eviction for that one file. And if we looked at our web server, we would see two requests, right? We refetched the manifest and the manifest would reflect one changed file and then the service worker's gonna fetch that one file, transpile it, serve it back to us and that's it. That's all the work that has to happen. Everything else in this app, when you look at the network tab of loading this app, right? Everything's location is service worker, service worker, service worker, service worker. We download nothing to boot this app, right? That's what keeps it fast despite having so many independent files. And of course, having the independent files is great, right? Because we can debug them the same way we authored them. We don't need a source map to tell us what file something came from. It's still in that file, right? It's very nice. So the last thing I'll say about it is that service workers can get real confusing if you forget they're there and you stop doing development. So this one makes it sure that if we shut down our web server, the service worker code will pretty soon realize that it's server has gone away and shut itself down and unregister itself after which point our browser is back to normal and all of that magical rewriting of our stuff goes away. Cause otherwise it could be very confusing if you switch to a new project and it was still there, it's a mega troll. So one of those little niceties you really wanna get right with service workers. So that concludes the demo piece and just to wrap up, the key takeaways I have for you is really that the future of web build tooling is exciting and very bright and we're gonna make it good now and it's gonna get even better. And that embroider is the Ember community is bridging to that future, right? And we're gonna keep shipping, keep stabilizing, keep making it even easier and more default until every Ember app just works with all of these things I'm showing you without extra effort, right? That's the goal. So thank you all for your attention. I will make sure that I have supporting materials and links from this talk at this permalink. Even if you're viewing this far in the future, you can check in here to see what was the next step in the story. And so I'll leave that on the screen a sec. EF4.com EmberConf 2021 and that's it. Can't wait to see you all next year. Thank you so much. Goodbye.