What are the final steps you should do before launching a new React Native app? Gant Laborde, co-owner & CIO of Infinite Red, joins the podcast to talk about his recent article about this topic.
What are the final steps you should do before launching a new React Native app? Gant Laborde, co-owner & CIO of Infinite Red, joins the podcast to talk about his recent article about this topic.
This episode brought to you by Infinite Red! Infinite Red is a premier React Native design and development agency located in the USA. With five years of React Native experience and deep roots in the React Native community (hosts of Chain React and the React Native Newsletter), Infinite Red is the best choice for your next React Native app.
Show Notes:
Helpful Links:
Want to get to know the new hosts of React Native Radio? Follow them on Twitter!
Make sure to subscribe on any the major podcasting platforms (search for "React Native Radio"). And follow us on Twitter at our new handle, @reactnativerdio.
Todd Werth:
Welcome back to React Native Radio Podcast, brought to you by Infinite Red. This week's episode is episode 176, Reactive Native Final Steps.
Jamon Holmgren:
Hey, everyone. Welcome to React Native Radio Podcast. I'm your host, Jamon Holmgren, and today, I am joined by, of course, my three awesome co-hosts, Robin Heinze. Hey, Robin. How you doing this morning?
Robin Heinze:
I'm doing great, Jamon.
Jamon Holmgren:
Awesome. And Adhithi Ravichandran. Hey, you're back this time. I'm really happy to have you back. Are you feeling better?
Adhithi Ravichandran:
I'm feeling much better now, so yeah, happy to be back.
Jamon Holmgren:
Did you bring a doctor's note? That's what I want to know.
Adhithi Ravichandran:
We tested negative for COVID, so yep, we're good to go.
Jamon Holmgren:
Oh, okay. I think we're all good then. So you won't have any viruses coming through your radio-
Adhithi Ravichandran:
Nope.
Jamon Holmgren:
... radio speakers here.
Adhithi Ravichandran:
Nope.
Jamon Holmgren:
Cool. Also, Harris. Harris Robin Kalash, of course. Thanks for coming along. How are you doing?
Harris Kalash:
I'm good. Thank you. A little cold this morning, but it's good here in Canada.
Jamon Holmgren:
Yeah. We're starting to hit fall here. We're recording this early part of October, and it's definitely hitting. We have a ton of fog outside.
Robin Heinze:
It's time for the pumpkin spice lattes to come out.
Jamon Holmgren:
You know, I could go with one of those right now. Today, we have with us the amazing, the one, the only, Gant Laborde. Gant, I got to give a little intro here. By the way, hi, Gant.
Gant Laborde:
Hey, how you doing? Yeah. Just a little intro, if you don't mind.
Jamon Holmgren:
Little intro. Okay. I'll keep this short. Gant is my business partner. He and I have been business partners for I think about two years. Something like that. We've worked together, though, for I guess five years now. I think today.
Gant Laborde:
Wow.
Jamon Holmgren:
I think as of today, we officially became-
Robin Heinze:
Is today your anniversary? That's so cute.
Jamon Holmgren:
Today is our work anniversary.
Gant Laborde:
And I didn't forget. I, actually, I got you some roses here. There you go, Jamon.
Jamon Holmgren:
That's so nice. I don't like roses, though, so you obviously don't know me very well. Maybe at the 10-year.
Gant Laborde:
That's right.
Jamon Holmgren:
Gant is a... From what I understand, you're a collector of titles. Is that correct?
Gant Laborde:
Yeah.
Jamon Holmgren:
You collect titles?
Gant Laborde:
For some reason, this has become what I'm doing now.
Jamon Holmgren:
Well, I'm going to read a few of them, probably maybe 10% of the titles here. You are a Distinguished Toastmaster.
Gant Laborde:
Yes.
Robin Heinze:
Wow.
Jamon Holmgren:
Of course, from the famous Toastmaster Group. You are-
Robin Heinze:
That's quite an accomplishment.
Adhithi Ravichandran:
It is.
Gant Laborde:
Thank you. That was actually-
Robin Heinze:
Distinguished Toastmaster. That's like the highest toastmaster you can get, right?
Gant Laborde:
It took five years.
Robin Heinze:
Wow.
Gant Laborde:
But I will definitely let you know I started off terrible, and I went to Toastmasters, and they helped me out, so it's been a really great adventure. I love that entire setup, and during that way, I had all these titles that made no sense to anybody, like Certified Leader Bronze, Public Speaker Silver, and all these weird things, but the cool thing about it is, yeah, everybody knows Distinguished, if you've ever been to Toastmasters. That's the final level.
Adhithi Ravichandran:
That's pretty awesome.
Robin Heinze:
It's like the black belt of Toastmasters.
Gant Laborde:
Right. Yeah. Yeah. At the end of it, you have to stand on stage and break some bricks that are on fire with just your words.
Jamon Holmgren:
Give us a one sentence of what Toastmasters is. Some people maybe aren't in an area that has it, and aren't-
Gant Laborde:
Okay. One sentence. That's hard for a Toastmaster to do, by the way. In the early 1900s, people decided the best way to get good at anything is to actually practice it, and public speaking, you can only practice in front of other people, so they formed an organization where people could practice speaking publicly with one another and get immediate feedback from their audience so that they can improve, get over their fears, and actually work on public speaking without ever having their first public speaking experience be a real public speaking experience. I went to that organization. I was afraid to get up in front of anybody, and now, y'all can't even shut me up for one sentence.
Adhithi Ravichandran:
It's around the world, right?
Gant Laborde:
Yes. It's a worldwide... It's such a great organization, and the second thing I learned from there that I never expected to get was leadership skills, because when you're doing that, you are working with volunteers, and leading volunteers is its own skill in itself. It actually teaches you so much, because at work, you can say, "I'm the boss," or, "I have this position. You have to do that." If you ever try to do that in Toastmasters, you're just going to get people to un-volunteer.
Adhithi Ravichandran:
Yeah. Yeah.
Gant Laborde:
It's actually a really cool way of testing out a few things, but the one thing I really appreciate is the confidence that they gave me, and the second most is all the experience they gave.
Robin Heinze:
That's really cool.
Gant Laborde:
Thanks.
Robin Heinze:
That was also more than one sentence, Gant.
Gant Laborde:
Oh, no, no. I finished that sentence and y'all asked for more. Okay? You can't do that to me.
Robin Heinze:
Fair enough.
Adhithi Ravichandran:
So you're based out of Portland?
Gant Laborde:
I'm in New Orleans, which is... I love Portland. I used to visit there, what, like three times a year or something like that, but now I'm in New Orleans, and if you ever visit New Orleans, come see me. We have lots of conferences come through here, Super Bowls, worldwide conferences, and I will give you a tour. That's everybody listening here, if you're a Reactive Native nerd and you want to hear about New Orleans, when you come through here, look me up.
Jamon Holmgren:
Definitely take advantage of that. I've done that before, and Gant is an amazing host.
Gant Laborde:
Awwww.
Jamon Holmgren:
So definitely take him up on that. Gant, you're also a Google Developer Expert in Web, and you're a Google Developer Expert in Machine Learning.
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
So you're kind of like a double major here. What's that all about?
Gant Laborde:
Well, I'll say that in the world of Google Developer Experts, you have some people who are amazing in their craft, and actually, there are some people who put me to shame. They're Google Developer Experts in everything Google has ever done, which is hilarious, but I could only find myself in those two categories, web, because basically that's our premise here. JavaScript gets you web. I did Rails. I did Ruby. I did PHP. I did ASP, both .NET and classic, so the whole web world of things was easy enough. As anybody who's looked at my Twitter recently, machine learning's currently my passion. AI, machine learning, getting the computers to do things that they've never done before is wildly exciting for me, so I've been pushing on that really hard for a couple years now.
Adhithi Ravichandran:
Awesome.
Jamon Holmgren:
I thought that Google Developer Expert just meant that you were really good at googling things. That's not correct or something?
Gant Laborde:
That's called a developer, so that's the-
Robin Heinze:
Yeah, we're all Google Developer Experts, if that's what that is.
Jamon Holmgren:
Yeah, I do-
Robin Heinze:
And that's free.
Gant Laborde:
Of course, we look all this stuff up. I think that that's just the funniest part about any of this stuff is that when I was young, it mattered how much you could actually remember. Now, if you get you a job, it's because you're really good at Googling.
Jamon Holmgren:
So we're only about three percent through the ten percent I said I was going to say about his titles, but we'll go ahead and keep forging ahead here. Media Developer Expert. What is Media Developer Expert? Are you developing software for CNN here?
Gant Laborde:
Yeah. Yeah. That's it. I just drive onto Atlanta and I had them some more software every so often. Media Developer Expert is a really, really fun program. I highly recommend everybody joins it. It's a little bit easier bar... I don't know if they want me to say this... to join than the Google Developer Experts, and it's basically, everybody hearing this podcast, worried about media, worried about your microphone, your gear, your presentation, yourself. The software that kind of goes along with that is the Media Developer Expert Program that's sponsored by Cloudinary, and I think if you go to cloudinary.com/mde, you can apply there. One of the most fun groups, because they have Friday drink and chats and stuff like that. Things Google could never do.
Adhithi Ravichandran:
Interesting.
Jamon Holmgren:
Yeah, that's awesome. You also have an Oracle certification here, Oracle Groundbreaker Ambassador.
Gant Laborde:
Yes. Yes.
Jamon Holmgren:
Okay. This one's interesting. Oracle, which from what I understand, since we've worked together, I don't think we've done a lot of Oracle. I guess we have one project that's doing Oracle, but somehow you picked up this certification along the way.
Gant Laborde:
Well, I just want to say I'm a big fan of TikTok, and now Oracle owns TikTok, so that just totally makes sense, right?
Jamon Holmgren:
Wow. Well, it seems like you are going from major tech company to major tech company and picking up certifications along the way. We can't leave aside Amazon.
Gant Laborde:
Yeah.
Jamon Holmgren:
One of the biggest. You are an AWS Community Builder.
Gant Laborde:
Yeah. There's a group called the AWS heroes, which I wanted to join, and I can't join that without being a Community Builder first. The Community Builder stuff, it's awesome. I don't know if anybody's really messed with Amplify. I'm really excited with that most recently. I've seen Nader is talking about it all the time.
Jamon Holmgren:
Nader Dabit.
Gant Laborde:
They've collected so much talent, and the Amplify stack has been really, really cool, especially for people like us who are eager to get into using GraphQL, and we're trying to throw GraphQL into our apps-
Adhithi Ravichandran:
Mm-hmm.
Gant Laborde:
... or do cool stuff like that. But at the same time, you kind of need these serverless functions out there that you can access and that are guaranteed to work with React Native and scale and do all that other stuff. I'm not going to lie... hopefully they don't kick me out of the program for this... but that whole AWS service stack used to suck. I didn't know what those things were. I didn't know the difference between Cognito and DynamoDB's and all these other different... What is IM and all this other stuff? It was not easy, and I really am impressed with the Amplify stack. If you're building something React Native, and you are trying to tie together a whole bunch of Amazon services, definitely try out Amplify. It's fantastic. I've been building stuff with Amplify.
Robin Heinze:
Didn't we use Amplify already in last year's Chain React App?
Gant Laborde:
Yeah. Yeah. We used it for the chat.
Robin Heinze:
Yeah.
Gant Laborde:
We used it for the chat.
Robin Heinze:
We used it for the chat.
Gant Laborde:
That was fun. I built an app for a conference for React Native U that uses Amplify for Who Said It? Which is a game we play at Infinite Red. I used it for Enjoying the Show, which was just featured on the Google TensorFlow YouTube channel, so I've been throwing it around left and right. It's really nice not writing the back-end code and knowing that it's going to work.
Robin Heinze:
It's the way of the future.
Gant Laborde:
Yeah.
Adhithi Ravichandran:
So Gant, using your AI, have you cloned yourself or something? Because how do you do-
Gant Laborde:
I would love to.
Adhithi Ravichandran:
... so many different things?
Gant Laborde:
I really appreciate... I'd say that it's all passion-driven stuff. I'm really lucky to be with... This sounds like a weird plug for Infinite Red, but it really is-
Jamon Holmgren:
Well, you've been plugging everybody else so far, so hey, let's go for it.
Gant Laborde:
There you go. Infinite Red is a place where if you want to be a shooting star, you can be it. No one's going to hold you back or do red tape. If you go to a big box store, sometimes you have to do this, you have to mention that, you have to do these other things, whereas Infinite Red says, "What do you want to do?" And then goes, "Okay. What can we do to help you do that?" I've never been turned down speaking for a conference. If I said I wanted to go somewhere, and I wanted to hear a talk, I wanted to do this one thing, it's absolutely... They're like, "Okay. Absolutely. We'll send you there. You'll get that information." That's also where I get a lot of these ideas from, because if you go to a conference and you meet people and you talk to them in the hallway track, this is where some of the cool stuff comes up.
Adhithi Ravichandran:
Absolutely.
Gant Laborde:
For instance, I came up with this idea of an app that can identify Nicolas Cage or not, and I mentioned that at Chain React, what, 2017 or something, and Jason Langsdorf says, "Gant, you know you have to build that now, right?" So I was on the hook, so I had to figure out how to make that app after that. Such a great and rich connection really helps out.
Robin Heinze:
Didn't Nicolas Cage actually comment on that
Gant Laborde:
I think-
Robin Heinze:
... on Twitter?
Gant Laborde:
That was the guy from Jurassic Park.
Robin Heinze:
No, you're right. That wasn't Nick Cage. That was... Oh, what was his name? Oh, yeah. No, that was Jeff Goldblum. That's right.
Gant Laborde:
That's it. Yes! Jeff Goldblum.
Robin Heinze:
Another one of your AI experiments.
Gant Laborde:
Yeah. Jeff Goldblum shows up. That's hilarious. I still actually bring that up in other talks, and people completely agree. Jeff Goldblum cannot keep his fingers out of his mouth, and it totally messes with AI.
Jamon Holmgren:
Now, we brought you on here not, obviously, to talk about necessarily AI and ML, but you do have a connection to the React Native community. You used to do a ton of React Native for us.
Gant Laborde:
Yes.
Jamon Holmgren:
You are a React Native core contributor. You have built some of the most popular open source that we have that is related to React Native, especially Ignite. Ignite's a big, big thing, and it was created by Gant.
Adhithi Ravichandran:
Oh, wow.
Jamon Holmgren:
So you have that connection with the React Native community. Tell us a little bit about how you've maintained that connection with React Native, while you're kind of going in all of these other directions.
Gant Laborde:
Really, it's my heart that... The React Native community's just a great group. When you kind of come into JavaScript, it's a giant, giant pond, and one of the things that I really like about React Native is it's a smaller, really friendly group. If you message anybody who's a React Native influencer, you get that DM back, you get that message back, so no matter what my passions are, I'm staying inside of React Native forever. It's just a great community.
Adhithi Ravichandran:
It is.
Jamon Holmgren:
I'm going to shift gears and jump into our topic for today, because awhile back... Actually, not that long ago. A few weeks ago, maybe a month ago, you wrote an article, Gant, called "React Native Final Steps," and I'm actually very, very excited about this topic. One of the things that when you build a React Native app, you tend to think as a developer about what stack you have, what's your back end going to look like, the design, front end stuff, but often as developers, we forget about the last mile, so to speak. There are a lot of steps.
Gant Laborde:
Mm-hmm
Jamon Holmgren:
There are a lot of different things that need to be done. It's not just package it up into a binary file and ship it off to the app store. There are so many different things that need to be done. What I'd like to do is open it up to the rest of the panel here, Harris, Adhithi, Robin, as well as Gant, and talk more about those last steps that you take as a React Native developer, in order to get your app ready for production and get it up on the app store, maybe even talking a little bit about the marketing side, but it's really just sort of the last mile of this. Before we go into that, though, I'd like to ask Gant, how did you think to even write this article?
Gant Laborde:
Well, I'll kind of ask everybody here. How many of you have finished an entire React Native app, and then you think that you've crossed this finish line, and then... this happened to all of us, I hope... you look at what's left in order to get that into the app store for Google and iOS, and then you find out that even all the stuff you've done isn't enough? I've seen far too many developers cross the finish line and just, "Whew, I feel good," and you're like, "One more mile to go."
Adhithi Ravichandran:
Yes. Yes. I totally agree with you.
Robin Heinze:
Pretty much every app.
Adhithi Ravichandran:
Yep. Almost always that happens.
Jamon Holmgren:
Yeah.
Gant Laborde:
Yeah.
Adhithi Ravichandran:
Especially being a cross platform application.
Jamon Holmgren:
Mm-hmm.
Adhithi Ravichandran:
You have to test through multiple devices. I would say for us, as far as I've been developing Reactive Native for four or five years now, the biggest challenge has been the testing across multiple devices. There's only so many devices you can physically test on, and there's always this one device, which is a super small screen and the button's missing, or there are plenty of versions of Android. We've seen a lot of Android issues, too, with permissions.
Gant Laborde:
Yeah.
Adhithi Ravichandran:
You have a new library you integrate and then maybe a camera or something.
Harris Kalash:
Yep.
Adhithi Ravichandran:
It just doesn't work. And I'm like, oh jeez, I have to go change my permission setting and all of that stuff, so having a checklist helps. Check off, okay-
Gant Laborde:
Yes.
Adhithi Ravichandran:
... did you do all of these things? I still always do end up seeing something we would've missed.
Gant Laborde:
It's such a painful thing, because we have a bunch of React Native experts, and even then, I think only each person maintains around 80-90% of the final steps in their head at any given time. I think you hit it perfectly there. You said checklist.
Adhithi Ravichandran:
Yeah.
Gant Laborde:
It's what humans are bad at. I've been side swiped by these things. Harris, Robin, what are the things that you've delivered and then been embarrassed about? Tell us all now.
Harris Kalash:
Delivered that I've been embarrassed about. For me, I'm not sure if I'm going to be answering your question directly, Gant, but until this date, I still don't fully understand how the certificates work off the top of my head. I still have to Google that every time. Also, on a few projects at Infinite Red, we have these really cool Fastlane scripts that help us save time, but those have to be maintained, and there's just so many moving parts in those scripts.
Gant Laborde:
Yeah.
Harris Kalash:
Yeah. It's still complicated, even as an expert.
Gant Laborde:
I think there's one person in Utah that knows everything about certificate signing, and we all just ask that person every so often.
Jamon Holmgren:
It's one of those things that you don't do every single day, so you forget about it. I really like an article that Gant wrote a long time ago, has been our go to for these types of things. I forget the name of the article, but we can post it in our show notes. This came from, I don't know, 2017, something like that.
Gant Laborde:
Yeah. Yeah, I think it was "Effortless..." It was a terrible naming for SEO, by the way, but it was great for people. "Effortless iOS Releases with React Native," I believe was the title. Then I had "Effortless Android Releases with React Native" I think are the two. Those are live documents that continue to sort of serve as every time I need to go back and release something, I follow that, and if it breaks, I actually update the blog article.
Jamon Holmgren:
It's actually, I think, "Simple React Native iOS Releases."
Gant Laborde:
Oh, see? I don't even know.
Jamon Holmgren:
It was so effortless that we couldn't remember the name. So little effort, I guess.
Adhithi Ravichandran:
Yeah, Fastlane. Yeah. That really helps a lot.
Robin Heinze:
Match is a game changer, too.
Jamon Holmgren:
Robin, explain what Match is all about. Some people may not have used it before.
Robin Heinze:
Match, it's a tool. It's made by Fastlane, so it's a Fastlane tool, but it essentially manages your certificates and provisioning profiles on iOS for you and sort of streamlines the process of sharing those certificates between the other developers on your team. So not only does it store them all in a central location and handle uploading them to Apple, but your other teammates just have to run Fastlane Match Development or Fastlane Match app store to get those certificates on their machine in order to build the app in a production environment or in order to run on an actual device.
Gant Laborde:
Now, the funny story about that is before Fastlane... Actually, I know some people that have only ever known Fastlane, and they're like, "Oh, this seems-
Robin Heinze:
Yeah.
Gant Laborde:
... like it's still complicated."
Robin Heinze:
Yep. I'm one of those people, Gant.
Gant Laborde:
Well, what's worse is you should've seen what happened when one developer's machine was the only machine that could ever release.
Robin Heinze:
Oh, no
Jamon Holmgren:
Yeah. This happens more than you think.
Gant Laborde:
So back in RubyMotion days, I was releasing an app, and I had a business partner... this is 2013 or so... and his-
Jamon Holmgren:
Gant?
Gant Laborde:
Yes.
Jamon Holmgren:
RubyMotion, just to define for our listeners, it was a Ruby-based tool chain that allowed you to build iOS apps. Later they added Android, but it was primarily iOS apps at the time.
Gant Laborde:
Exactly.
Jamon Holmgren:
Gant and I actually met at a conference-
Gant Laborde:
Yeah
Jamon Holmgren:
... that was a RubyMotion conference. Anyway.
Gant Laborde:
Yeah. Yeah. Absolutely.
Adhithi Ravichandran:
On the same day.
Gant Laborde:
Exactly. That precedes our anniversary, by the way, Jamon. That was even earlier.
Jamon Holmgren:
That does. Yeah.
Gant Laborde:
Yeah.
Jamon Holmgren:
That was probably... Wow. That was probably at least a year.
Gant Laborde:
2014.
Jamon Holmgren:
2014.
Robin Heinze:
You were just casual acquaintances. You had no idea what was in store.
Jamon Holmgren:
That's right. Well, I got to tell the story a little bit. This was my first tech conference ever. I'd never been to one, and I was also speaking. I was also the first speaker, which is a great way. I highly recommend going to your first tech conference and giving the very first talk, but I show up, fish out of water, and there's a gathering at a restaurant or something or a bar or something prior to the conference, I think the night before the conference.
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
And I go there, and I'm looking around, and there's a bunch of people, and I see this giant of a man turn around and just be like, "Jamon!" And he comes over and just huge, huge arms swallowing... And I'm not a small guy, but just this huge hug. I immediately felt like I was part of the community, so that was Gant, and that's how Gant is. That's always been my first impression. I actually met Gant prior to almost anybody else that I now work with.
Gant Laborde:
Yeah. That was super fun, and Jamon had built... You were well-known in open source. I'd say open source really brought our company together.
Jamon Holmgren:
That's true.
Gant Laborde:
Totally a great opportunity. There's so much at the heart of open source that stays at the heart of what we try to do. Like writing.
Jamon Holmgren:
Yeah.
Gant Laborde:
I think it's a continuation, right? Because we feel a pain point releasing apps in React Native. Let's say it. It's not easy. It's easy to screw up, and we're at a point where it's too young for everybody to know all these steps, not only in knowing Fastlane and how to set that up, but also, if you have Fastlane set up, the blog article we're talking about is all the extra steps that are not even very well documented or documented in various places, and I have to say, it feels really nice to have people write comments on Twitter and say stuff like that, because you're meeting your future friends, just like you and I.
Jamon Holmgren:
Before I interrupted you, you were about to talk about how it was with RubyMotion when we would deploy apps.
Gant Laborde:
Oh. Yes, indeed. Yeah. My co-business owner in 2013 or so was trying to release the app, and he continued to do app releases, and then I was going to start maintaining it. We tried to switch the certificates from his machine to my machine, and that's when I fell in love with how important Fastlane and match actually is.
Harris Kalash:
There is one product that I remember that actually handled it really well, and you could get away with not using Fastlane. It was called BuddyBuild. I don't know if any of you have ever-
Gant Laborde:
Oh, yeah. Yep, yep.
Harris Kalash:
Yeah. Unfortunately, Apple bought it then killed it, but it worked really well. It worked really well. Yeah.
Jamon Holmgren:
That happens far too often.
Robin Heinze:
That's like going the way of the Dodo in mobile development. It's Apple buying something and killing it.
Harris Kalash:
There's just nothing like it. It was really smart. You would give it your Git project. It would figure out almost everything. You would log in. You would give it your Apple credentials, your Apple email password. It would do everything. It would handle the certificates. All this certificate stuff, you could get away without really knowing it at all.
Jamon Holmgren:
It would scrape your iMessages for you and upload them to a server, I bet you.
Gant Laborde:
Well, silver lining, Harris, if you build it, someone will buy it and be ready to kill it, so you just keep filling that gap.
Harris Kalash:
That's a good point yeah.
Jamon Holmgren:
In your article, "React Native Final Steps," this was something that was sort of crowd sourced. You had a few unfinished blog articles in draft.
Gant Laborde:
Yeah.
Jamon Holmgren:
And you put that out there on Twitter. This was by far the most picked of all of those.
Gant Laborde:
Yeah.
Jamon Holmgren:
So you launched into it, and I'm just going to read off the eight here, and then we can have sort of a group discussion about what these are all about. First one, remove all your console.logs. I would assume this also goes for any type of logging-
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
... that you wouldn't want to ship to production. Also, Squoosh your images. Squoosh your images. Not squish but squoosh them. Remove default Android permissions. That one sounds kind of really specific, but I'm sure that it's on there because of a pain point.
Gant Laborde:
Yep.
Jamon Holmgren:
I'm sure all of these are on here because of a pain point. Consider enabling ProGuard and Hermes engine. We'll talk about those. Quality assurance walkthroughs. Of course, quality assurance is always important here. Check the startup speed for performance issues. Startup speed is something that's often overlooked, because often, you started up once and then you're just in there working because of fast reload. Bulletproof your app, and lastly, number eight, re-enable ATS, which I forget what ATS even stands for, to be honest.
Gant Laborde:
App transport security.
Jamon Holmgren:
There you go. These are the things that you chose to put into your article, and they're great. I've been releasing iOS apps for years, since 2012, I think, was the first time I released one, maybe 2011. Somewhere in that range, which was not a Native app. That was a PhoneGap app, but you still had to kind of go through that process.
Gant Laborde:
Yeah.
Jamon Holmgren:
And there were a lot of these things that I actually had never thought about before.
Gant Laborde:
Yeah.
Jamon Holmgren:
There were several that were more obvious, but a lot that I hadn't thought of. This is a great article.
Robin Heinze:
It's worth noting that a lot of these are things that you may be able to get your app through the review process and successfully in the store-
Gant Laborde:
Mm-hmm.
Robin Heinze:
... without doing some of these things, but it's going to lead to a worse experience for your users. I think a lot of them would get overlooked, so it's a good reminder that there's things you could do that you may be able to ship without them, but it's really better to do them.
Gant Laborde:
Yeah. You know what's really funny is keeping console logs in there actually doesn't cause any problems except for performance problems.
Adhithi Ravichandran:
Right.
Gant Laborde:
Specifically Android. So you click something, and I have no idea what it's doing once you do a production build or why that was allowed to go out there, but it is trying hard to console down something, and it makes the Android builds unusable.
Jamon Holmgren:
Now, I'm not sure about React Native console logs, but it is possible to pick up on NS logs in production if you hook it up to the device manager in Xcode and kind of scan through that console. It's possible it's trying to write to something like that, but yeah, there's no real point. Most of your users aren't going to be scanning for console logs. This is going to be something that is just doing extra work for nothing, and io is famously slow.
Gant Laborde:
Yeah. Yeah. Absolutely. I would dare say, don't feel bad if you ever look at this article and take a look at these things and you didn't do one or several of these things. Hopefully, look at them and feel excited that you can go grab an app that needs to be released or that's recently been released and then do these checks, and then produce a much faster and efficient app.
Robin Heinze:
Yeah. I think that's really important to mention. Don't feel bad if you read this list and you're like, "I haven't done any of these things." That was definitely one of my first thoughts. I was like, "Oh, I didn't do that one when I released my last one."
Gant Laborde:
Shame-driven development.
Robin Heinze:
Yeah. It's an opportunity for the next time or the most recent time.
Jamon Holmgren:
Totally.
Adhithi Ravichandran:
I was going to ask a general question to everyone. I use TestFlight all the time and have plenty of beta testers on. Do you guys do that, too, at Infinite Red?
Jamon Holmgren:
Yeah. Totally. TestFlight's something that is constantly being used. Now, the number of beta testers really does depend on our client. We had a project that we did just recently where we were kind of begging the founder to bring on more beta testers, because we really needed more testing of it. We never ended up quite getting enough, and we did end up having a few issues that had to be fixed at the front end of launching. It really is important to have lots of beta testers on there early on in the process.
Adhithi Ravichandran:
What do you use for Android? So TestFlight for iOS and Android?
Robin Heinze:
The Play Store will let you release an open beta or a closed beta, so you can either add a specific list of people or you can make it an open beta and just give people a URL.
Adhithi Ravichandran:
Okay. Yeah. We've been using Crashlytics, and I think that got merged with Play Store now. I'm not sure.
Gant Laborde:
Yeah. As a matter of fact, that's one of the biggest pain points is that these formulas, this list, they keep changing.
Adhithi Ravichandran:
Right. Yeah.
Gant Laborde:
The Play Store just recently, I think, changed their entire UI, and you could try to go do something, and you're like I used to know where this was. That's very painful for a developer who's got something, you say to the client, "Hey, I'm going to put this out there. Oh, I know how long it takes me to go ahead and put this out there. Don't worry. The new build will be out in 15 minutes."
Adhithi Ravichandran:
Mm-hmm.
Gant Laborde:
Then you pull up the UI, and nothing is right in the world. You're like, all right, I said 15 minutes. I have an hour's worth of sort of re-finding the things I know. It's an ongoing problem, and I think it's important podcasts talk about it and blog posts talk about it, because otherwise, it does feel like shame-driven development.
Adhithi Ravichandran:
Sure. Yeah.
Harris Kalash:
Yeah. That's actually a pain point of I feel like the entire ecosystem, where we have to keep up with multiple platforms.
Gant Laborde:
Yeah.
Harris Kalash:
But then again, it's a trade-off we've accepted, and I don't see anything better.
Gant Laborde:
Mm-hmm.
Harris Kalash:
Unless maybe you're looking into Flutter, which as its own trade-offs.
Gant Laborde:
Yeah.
Jamon Holmgren:
That's a fair point. Gant has this funny little hack. He simply reassigns console.log to a no op function if you are in production, so then any type that you're calling log, it's simply running a function that does nothing and moving on. I assume that's much, much faster.
Adhithi Ravichandran:
It's smart. Yeah.
Gant Laborde:
Yeah. Well, I like that one. Now, there is a package you can install that will go in and remove your console setups. You can actually have it so it'll conditionally do that for a production build and you don't have to write any code.
Jamon Holmgren:
Babel-plugin-transform-remove-console. That's the name of the package.
Gant Laborde:
Yes. I think that that one requires that you bring in a babelrc, whether you had one or not. There's a bunch of other things. But what I like about changing the control of a patching console.log or console.anything is that if you did use some kind of service, like Crashlytics, or someplace where you would like that information to still end up, you can just write that code and then all the console logs turn into sort of these asynchronous sendoffs to bring this information still to you if you really, really wanted it. So you can null them out or you can send them out to a place where QA people can check them out.
Jamon Holmgren:
What I want to know is if someone's done this and it's introduced a bug in production, where the previous console logs were solving a race condition, because they were slowing it down just enough. When you speed it up, then it shows up. I'm sure this has happened. I've never run into it myself, but it does seem like something that would happen. When you observe it, it fixes itself.
Gant Laborde:
I'm pretty sure you just gave a bunch of people nightmares is what you just did.
Jamon Holmgren:
You also talk about Squooshing your images.
Gant Laborde:
Yeah.
Jamon Holmgren:
This is something I remember. You actually built this thing a long time ago, a website-
Gant Laborde:
Oh, yes.
Jamon Holmgren:
... that you would crunch your images for Rails apps.
Gant Laborde:
Yeah.
Jamon Holmgren:
I think it was some sort of a hack night thing or something.
Gant Laborde:
Yes. Yes, indeed.
Jamon Holmgren:
Tell us about that thing.
Gant Laborde:
I built this one service that was a Git Hub setup, and what it would do is when you would do a commit, it would automatically take that commit and it would run all of your images in the commit through a compression with optimization, and it was called crusher.io. I don't own the domain anymore. Don't go there. I can't trust whatever is there, so have no idea. What would happen is it would resize the images down to optimized and the default configuration is lossless. It would keep them exactly at the same quality. Then if there was an optimization in size, it would do a pull request to your repo for you with those smaller images sizes. I loved this idea.
Gant Laborde:
Truth is it died because I tried to learn Angular. We did the project, I think, using Rails with just Vanilla JavaScript, and then we tried to move it to Angular, and I could not grab Angular I. It was just not sticking in my head. Angular I was like a hockey stick of knowledge. You just suck for six months, and then you know something. The truth is, what we built in 48 hours for the hackathon was infinitely better than what I ended up with trying to add Angular, so the project kind of died. But that intuition is forever important. If you're sending off an image that's 20 times the size and has all the EXIF data that's not being used by your app at all, all that stuff needs to be compressed out. Your SVGs could be simplified. Everything could be simplified down, and that's kind of what the key step is.
Jamon Holmgren:
Since crusher.io is no longer available, it looks like it's for sale now for almost $4,000.
Robin Heinze:
Four-thousand dollars. Wow.
Jamon Holmgren:
But there are other apps out there. I'm going to ask the panel. Do you use apps? What apps do you use to kind of compress your images? Or is there some other way that you get your images compressed already? For example, I think that a lot of times our times, if they're working with our designers, will say, "Can I get an optimized version of this image?" Which is nice, because the designers often can compress images in a way that is acceptable to the designers and not just to a developer's eye.
Adhithi Ravichandran:
We usually do the same. We work with an outsource firm that gives us all the design, and we ask for the compressed version. I've noticed that using SVG improves the performance, too, compared to using PNGs and other things.
Robin Heinze:
That's interesting. Because I remember trying to use SVGs in React Native and having a lot of trouble especially. I think we may have been trying to use network images and network SVGs don't work very well.
Adhithi Ravichandran:
We also had trouble with SVGs maybe a couple years ago, but now, I think with the updated versions, it just seems to work fine, and I like that we have the flexibility to change the colors and all of that stuff through code.
Jamon Holmgren:
Mm-hmm.
Robin Heinze:
Mm-hmm.
Adhithi Ravichandran:
Yeah. It's been real efficient for us using SVG icons.
Jamon Holmgren:
Gant uses squoosh.app, right?
Gant Laborde:
Yes. One of the things that you can do... There are amazing... ImageOptum is perfect, so if you have that just running locally, what a great way to have it automatically optimizing everything. There are some times where playing with the algorithm or the image that you brought in doesn't end up being the size that it actually is in the app. The reason I put this step in here is because it is a manual, drag each image into Squoosh as just a free website.
Gant Laborde:
You can actually play with the different levels of optimization, the different levels of everything, and I even found one that was not optimized at all that I thought I had optimized. There was some kind of edit or mistake that happened to it, so in the blog post, I found one that was 49% smaller after running it through Squoosh. As a final step, it's a final walkthrough of what you're about to ship. It's a great chance for you to remove images you're not even using anymore, resize images that are not at the size that you thought they were going to be, and then finally, play with the different optimization methods that exist to see if you can squeeze out significant portions of your bundle size.
Robin Heinze:
But really, this is about reducing the bundle size. Is that correct?
Gant Laborde:
Yeah.
Robin Heinze:
That's the consequence if you don't do this step is-
Gant Laborde:
Right.
Robin Heinze:
... your app will be bigger.
Gant Laborde:
You've got a bigger app for no good reason. You're slowing down things. You're pulling in more RAM to process this stuff. I know it's starting to feel like... Just like in web, people say, "Oh, well, it doesn't matter. The phones can handle it. This can handle it. That can handle it," but it's pretty easy to nickel and dime yourself into an exceedingly ridiculous bundle size that's embarrassing when someone finally notices.
Adhithi Ravichandran:
Right.
Harris Kalash:
Yep. One way I've noticed if I have really large images is when I use Flipper. There's this plugin that basically just... I think it just tells you the size of everything that's going through the network and the bridge and all this stuff-
Gant Laborde:
Nice.
Harris Kalash:
... on Flipper. Once, I remember opening it up on one of the apps I was working on and seeing these huge images, like not even realizing, because they're local. At some point, they're cached, so I don't even realize how big they are.
Gant Laborde:
Yeah.
Harris Kalash:
Yeah. Flipper's a good way to maybe see if you should probably be looking into optimizing your images.
Gant Laborde:
Nice.
Jamon Holmgren:
There's another one that you added here called remove default Android permissions. This one is something that if you don't do this, the consequence seems to be that Android will ask for far too many permissions. Is that correct, Gant? It's just often kind of the kitchen sink, and you don't need the kitchen sink for your app?
Gant Laborde:
Actually, it's relatively not kitchen sinky. It's kind of nice. Whether you did anything or asked for anything or not, I'd say there's about five or six Android permissions that just get asked for by React Native. You probably need one that's not one of those six, but you also need half of those six. You need like three of them. You can actually lower it, but if you just ship it straight out the door, you're asking for a little bit more than you might even need.
Jamon Holmgren:
Oh, yeah. In your article, you list them out. There's internet. There's system alert. There's read phone state. There's read and write external storage, and there's a check license one as well.
Gant Laborde:
Yeah. For ads, which you may not have.
Jamon Holmgren:
Right. Yeah. It's just a good thing to just jump in there and see-
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
... what exactly your app actually needs. You may have had to add a few more as you're going through it. I would assume things like geo positioning-
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
... location, et cetera.
Gant Laborde:
Yeah. It was surprising to me. I thought it would kind of come in 100% Vanilla, but obviously, it can't, and it makes sense. It kind of needs to, just to set that development wire network it has, it already has to come with a few things anyway.
Jamon Holmgren:
Let's move on to the next one, number four. Consider ProGuard and Hermes for Android. Seems to be quite a few Android-specific things here.
Gant Laborde:
Yeah.
Jamon Holmgren:
I'm sure there are iOS-specific things as well, but as of React Native Version 0.60.4, you can turn on ProGuard, you can also turn on Hermes. Does someone want to take on what... well, first, what Hermes is?
Harris Kalash:
It's a new JavaScript engine for Android. It replaces, I believe, it used to be called JSC, so JavaScript Core, and it's much faster. It mostly optimizes startup times and memory usage, I believe.
Adhithi Ravichandran:
I remember they released this last year at Chain React, right? The first time they talked about it.
Gant Laborde:
Yes.
Harris Kalash:
Yep.
Jamon Holmgren:
That's right.
Gant Laborde:
Yes, indeed.
Jamon Holmgren:
I'm also looking to try to get someone from the Hermes core team on the podcast, so watch for that. Hopefully, we'll get a chance to talk with them about the work that they're doing over. It's very cool stuff, very interesting stuff. That would be something to check to potentially enable it. One of the downsides is that it's still somewhat beta, but Facebook is using it, from what I understand. There's also ProGuard, and to be honest, I don't even know what ProGuard. Someone's going to have to explain to me what ProGuard is here.
Gant Laborde:
Well, ProGuard's a little bit more on specifically the Android side. Android developers, regardless of React Native, have been bringing in these really cool skills and setup for optimizing. Just sort of some of the same concepts we've seen over in web, like tree shaking, obfuscating.
Jamon Holmgren:
Interesting.
Gant Laborde:
Just these really cool optimized builds. When those things get added to Android, they kind of get added as a flag inside of React Native, which is awesome.
Jamon Holmgren:
Interesting. So it goes through and kind of just makes sure everything is tightened up, smaller bundle size, basically, a smaller package. That's interesting. So you turn that on and you check for issues, but you do mention that there's a reason that it's not on by default.
Gant Laborde:
Yeah. I think it's by far, as we're leaning into these things, we want to be a little more careful, and I love the way that the React Native community has these set as flags.
Jamon Holmgren:
Mm-hmm.
Gant Laborde:
The problem I'll say is that no one knows that that's sitting there as a flag for you to go try.
Jamon Holmgren:
Yeah. Yeah.
Gant Laborde:
Not everybody reads every distribution and understands what that means. Sort of like when we look at ProGuard. To someone who's really following the Android development and all the things that are available there, they're like, "Oh, I can't wait for that to be inside React Native," but if you're just a React Native developer all the time, then you kind of would like a little bit of explanation, because, guess what, the platforms are expanding.
Adhithi Ravichandran:
Right.
Gant Laborde:
You have Mac, Windows, iOS, and Android. There's definitely a place that someone could build and bring all that information together, and then Apple could buy them and shut them down.
Adhithi Ravichandran:
You're right, Gant, because a lot of the React Native developers are originally even web developers, so they may not even have that much background-
Gant Laborde:
Yeah.
Adhithi Ravichandran:
... on iOS or Android-specific knowledge, so that would really help.
Gant Laborde:
Right.
Adhithi Ravichandran:
A little bit more documentation on those would help.
Gant Laborde:
Yeah.
Robin Heinze:
We should all have to take a periodic refresher course every couple months.
Adhithi Ravichandran:
Yeah. Absolutely.
Robin Heinze:
Here's what you missed.
Jamon Holmgren:
That's not a bad idea. Well, if people listen to this podcast, hopefully they'll get some good information.
Gant Laborde:
Yeah.
Harris Kalash:
Out of curiosity, on Bowser, do we have ProGuard on by default?
Jamon Holmgren:
No. We should look into that, though. That would be something to look at and see, like if we turned it on... I'm a big believer that if we can craft Ignite Bowser or React Native Boilerplate to fit the 90 percentile, what most people will use. An example of this, I'm actually working on a new version of Bowser that is... I'll talk about it later in maybe a future episode, but one of the things that Bowser does not come with is unimodules already installed. Unimodules is very helpful to be able to run a lot of Expo packages. Now, not every app needles unimodules, but having that flexibility built in, and there's not a lot of downside to enabling unimodules... It's also a little bit annoying to set it up when you do it manually, so I went through the process of actually setting it up for Bowser, for this new version of Bowser, so that in the future, when someone spins up a new Bowser app, they have it already, they don't have to go through that process.
Gant Laborde:
Nice.
Jamon Holmgren:
They don't have all the error-prone things. We can kind of pool our knowledge and whatnot. So something like enabling ProGuard might make sense. Now, we'd have to run it through... One of the concepts behind Ignite and Ignite Bowser is that we're not going to add something unless we've proven it to work in an Infinite Red project, so that's something I would always double check with people and see what was your experience with ProGuard, et cetera?
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
There's also number five is quality check it yourself. Obviously, there's QA. You want to make sure that you're always quality checking, but Gant, you're a big believer in going through it yourself.
Gant Laborde:
Yeah.
Jamon Holmgren:
Actually checking a deep QA right before shipping.
Gant Laborde:
It's ridiculously important, and we hate to do it. It's like listening to yourself after a podcast or watching your own talk. No one likes to QA their own app.
Jamon Holmgren:
I can just see Gant listening to himself on this podcast and hearing that part and cringing.
Gant Laborde:
I think that is exactly what will happen in that part, by the way. It is ridiculous, because when you know where the soft points are, the danger points are, you can poke and prod in ways that normal developers can't, but you can also be familiar for when a bug does come in, because they'll do something you would've never thought of, and then you need to have that fresh familiarity of where they are and what's going on. If you haven't worked on that screen in six months, I don't care, if you haven't worked on it in a week, we forget these things.
Gant Laborde:
I think it's kind of important to do that, and then I kind of know where the problems are going to be. For instance, I like to make the screen as small as possible. I turn on in-screen calling. I increase the font size. I do all kinds of stuff, so there's a certain screen where it's near impossible for that keyboard not to cover something, and then I think to myself, I say, "I think that no one's going to have their font size this big, for this screen, for this moment, and be on that tab and that thing," and I've-
Jamon Holmgren:
Challenge accepted.
Gant Laborde:
Exactly. If I release it and they say, "Hey, I was on the settings screen and I couldn't see what I was entering in," or, "The logo started pushing up over the top," I could be like, "Do you have your text size increased, or were you in a phone call when that happened, or what's your device?" Because I already have a feel of it. And that's just knowing the song you're playing.
Jamon Holmgren:
Yeah.
Gant Laborde:
It's really important, and I know as developers we like to skip this, because no one likes to go and watch and criticize themselves, but that final QA step, where you're really, really harsh, it pays gold when people come in and they finally have something to say.
Adhithi Ravichandran:
I think this one is true for any language, anything you're doing.
Gant Laborde:
Yes.
Adhithi Ravichandran:
It's not even React Native specific. I was that developer, too, initially. I'd be like, "I'm just going to code. You go test it, QA person." And then the QA person comes and like, "Oh, my gosh. Did you not look at what you coded? This is a thousand bugs," and then you realize-
Robin Heinze:
I think we've all had that-
Adhithi Ravichandran:
Right. Yeah.
Robin Heinze:
... experience.
Jamon Holmgren:
The answer is, no, I did not.
Adhithi Ravichandran:
I think that's almost like a moral responsibility, just double check and make sure-
Gant Laborde:
Yeah.
Adhithi Ravichandran:
... there's no obvious things at least. Yeah.
Harris Kalash:
It actually makes you stand out, because so many people don't do this, that if you just do that, you stand out quite a bit.
Adhithi Ravichandran:
Right. Yeah. Wow. That's such an awesome developer. No bugs.
Gant Laborde:
It really is one of those things where it's easy to talk yourself out of it, so actually, that section, I started off with three common reasons why people don't do it. They say like, "Oh, but I have a QA team." Right? That doesn't mean you get by with whatever they didn't catch or stuff like that. It's easy to say I don't have to do it.
Jamon Holmgren:
One of the big criticisms of React Native is that you can often end up with kind of a slow startup time for your app, because it has to load the whole JavaScript bundle, unless you've enabled Hermes, which solves a lot of that problem. Because of that, it is really important to check the startup and check for performance issues. Now, there are things that you can do to mitigate this. Obviously, bundle size is a big deal. Inline requires can often be a huge, huge benefit, and you go over that in your article, Gant. You talk about ABI splitting for Android, and there are a few other techniques that can happen. There are also some things you can do to just make it feel reasonable.
Gant Laborde:
Yeah.
Jamon Holmgren:
Instead of speeding it up, you can have a more interesting splash screen and whatnot. There are some really interesting things. I know we're kind of getting a little later in this podcast, so I want to speed up a little bit, but that's definitely something we should be paying attention to when you launch an app.
Gant Laborde:
Well, what I'll say on that one is I will happily come back on another episode at some point if we want to talk about the UX tricks and the ideas behind that.
Jamon Holmgren:
Yep.
Gant Laborde:
That's a whole episode in itself.
Robin Heinze:
We should have a whole episode on accessibility specifically.
Adhithi Ravichandran:
Uh-huh.
Gant Laborde:
Yes.
Adhithi Ravichandran:
Yeah. Absolutely.
Jamon Holmgren:
Fantastic.
Adhithi Ravichandran:
And I think a whole episode on the keyboard cowering, the text inputs.
Jamon Holmgren:
That's true.
Adhithi Ravichandran:
That never-
Gant Laborde:
That's unfortunately true.
Adhithi Ravichandran:
Yeah. That never seems to end or go away.
Gant Laborde:
Right.
Jamon Holmgren:
It's so true. It's so true. Lastly... No, this isn't last. This is the second from last. You mentioned bulletproofing your app.
Gant Laborde:
Mm-hmm.
Jamon Holmgren:
That is really more about handling crashes and exceptions.
Gant Laborde:
Yeah. If you have a try without a catch, if you have any way the app can sort of create this terrible handoff or this jolting experience, it's like that's great during development. QA loves seeing that. Development loves seeing that. Users will go one star you so fast. Just do anything else. Just be nice about it. The one thing I kind of throw in there is that there's a way for you to wrap your entire app, so that if it crashes, it at least shows a message.
Jamon Holmgren:
The last one is disable arbitrary URLs in iOS. This is actually just an iOS-specific thing. Apple enabled a thing called ATS, app transport security, and from what I understand, this has to do with making sure everything is secured with HTTPS, SSL, so that's something that React Native kind of disables so that there can be a local... There's an exception at least for reading local bundles, JavaScript bundles.
Gant Laborde:
Yeah. Yeah. That's how we get our hot module reloading to work in there, because no one's setting up SSL certificates to serve a file to themselves.
Jamon Holmgren:
It's a little awkward to do this, but you lay out the process, and you have a way to automate it as well.
Gant Laborde:
Yeah. One of the things that is interesting is this... I'm really glad they came out with it. I'm glad this is a problem for React Native, and it's no longer a problem for apps that are going out there. Making non-secure connections or connecting to SSL certs that aren't even really secure is one of the dangers of all these... We release our source code to people, and there's a vulnerability possibly happening in there, so I'm really happy that this is a step, but it's easy to forget, and you just leave it in there, and there's no reason to.
Jamon Holmgren:
Very cool. That was a lot of information, a lot of things that I didn't think of, I didn't really know, so that gives a very good path forward for wrapping up your app. Of course, there are probably 100 other things that should be done before you launch your app. I'm sure that people have their own to-do list, but they can add all of these things that you added. Thanks for writing that article and coming on, Gant.
Gant Laborde:
Mm-hmmxx. Yeah.
Jamon Holmgren:
Now, we have a section called weird bugs, and I have a weird bug. I'm not sure if anybody else does, but I can talk about this one. I don't do a lot of coding, so when I do get an actual weird bug that I can share, I get excited.
Robin Heinze:
Even the bugs are exciting, because you never get to do code.
Jamon Holmgren:
Exactly. This one's kind of just... it's kind of stupid, but it is what it is. I'm working on this new version of Ignite Bowser, and I'm kind of rewriting parts of the setup script, the boilerplate script. I'm actually rewriting most of it, to be honest. I'm supporting both Expo and React Native Vanilla CLI, and there are differences between the two that are a little bit subtle. If you started up and you put in //expo, it will use the Expo CLI to spin up your new app, and if you don't put in Expo or you put in //no/expo, it will use the React Native CLI. I was struggling, because the Expo CLI, it would finish spinning up the app, and then it would just take forever to finish the script, and then pretty soon, it would run out of memory and crash. I went and looked at the repo, there's nothing that stands out.
Jamon Holmgren:
The app was spun up correctly. It looked good. Everything was in there. It seemed like everything was good. Why is it sitting here just hanging and then running out of memory? What could be running away at the end of this thing? It took me a long time, but I finally figured out that Expo's CLI does not copy over the Git ignore, so when I was running Git Commit for everything, it was adding all of Node Modules, and it was committing everything, everything, including every possible thing was getting added to the Git repo, so that was what was crashing it. It wasn't happening on the other side, because the React Native CLI copies over as part of their boilerplate. They copy over, GIT ignore, that gets rid of Node Modules.
Robin Heinze:
Wow. That is a weird bug. So sneaky.
Jamon Holmgren:
Very sneaky. Yeah. I just have to manually copy over that.
Harris Kalash:
And React Native projects are quite big, right?
Jamon Holmgren:
Right.
Harris Kalash:
So that's-
Jamon Holmgren:
Yeah, there are a lot of-
Harris Kalash:
Yeah.
Jamon Holmgren:
... third party modules and whatnot.
Robin Heinze:
Gosh dang Node Modules.
Jamon Holmgren:
Very cool. This episode, of course, is brought to you by Infinite Red. Gant and I are two of the owners of Infinite Red, and Robin works there, and Harris also freelances for us. Of course, thank you to my hosts, Adhithi, Robin, and Harris. Thank you to our guest host, Gant Laborde. It was really nice to have you on here, buddy. I'm sure that we'll have you back in the future. You write about so many different interesting things that we could probably do many episodes with you. We're going to go ahead and put into the show notes links to all of the different things-
Robin Heinze:
Yes.
Jamon Holmgren:
... that we have talked about, included the "React Native Final Steps," the Who Said It app, Chain React app, the different Fastlane Match stuff that we talked about, Squoosh, all these different things, so check the show notes for that. Where can we find you online, Gant?
Gant Laborde:
You can go to gantlaborde.com or you can go to Twitter and look for Gant Laborde. I have all the information, future speaking engagements, and like I said, the React Native Community's really tight knit, so say hi to me there and I'll say hi back.
Robin Heinze:
As long as you're not in Twitter jail.
Gant Laborde:
Oh, no. In my Twitter jail. I was in Twitter jail. For everybody listening, apparently, you can get stuck in Twitter jail for two and a half days because Twitter has a glitch, and then the wonderful people of the community will create a hashtag called #freegant. I'm very happy about that. We sent quite a few messages to Twitter, and they just unapologetically unblocked me one day. It was really weird. As long as I'm not in Twitter jail or Twitter prison, depending on how this case comes up, I will happily respond.
Jamon Holmgren:
Where can people find you, Harris?
Harris Kalash:
Yeah. Twitter as well. My handle is brunostmann, which is B-R-U-N-O-S-T-M-A-N-N, and yeah, I'm not as active as Gant, but I'll respond to any DM's or Tweets.
Jamon Holmgren:
And Robin, where are you at?
Robin Heinze:
I'm on Twitter @robin_heinze, and that's Heinze with an E at the end.
Jamon Holmgren:
And you can find me on Twitter, just @jamonholmgren, my first and last name. Thank you all for coming along with us. Very exciting guests coming up in the future. I can't announce them, but when we come out with the episodes, you'll get a chance, so make sure that you subscribe to our podcast, and all the different places that you can find podcasts, we're there. Let us know what you thought of the episode. Thanks, everybody. See y'all later.
Harris Kalash:
Bye.
Adhithi Ravichandran:
Take care. Thank you.
Gant Laborde:
Bye.
Adhithi Ravichandran:
Bye.