Announcing Ignite 9.0: “Exp[ress]o”

From “Expo-friendly” to “Expo-focused”

Jamon Holmgren
Red Shift

--

We’re really happy to announce that Ignite 9, code-named “Exp[ress]o”, is now released!

Why “Exp[ress]o”? It’s “Expo”, but with extra shots of caffeine mixed in!

After 68 commits, 219 files changed, net -3,383 lines of code (less code!), and over a hundred developer-hours, Ignite 9 is coming to a project near you! In Ignite 8.0 “Maverick”, we made Ignite Expo-friendly. In this newest release of Ignite, we are now making Ignite Expo-focused.

If you’d rather listen to the changes, we did a podcast episode about this release in September on React Native Radio; check it out: https://reactnativeradio.com/episodes/rnr-276-announcing-ignite-v9-expresso

What is Ignite?

Ignite is Infinite Red’s battle-tested React Native project starter kit / boilerplate, along with a CLI, component/model generators, and more. In our experience, it not only cuts two to three weeks of development time off the front of a project, but also continues to provide structure and tools throughout development. It’s been in continuous development since early 2016 and is the most widely-used project boilerplate for serious React Native apps worldwide.

Quick Start

As always, you can start a new Ignite project with this command:

npx ignite-cli new PizzaApp

Ignite has a new walkthrough that more clearly explains your options. You can use Expo Go (easiest), Expo Prebuild (recommended), or DIY (advanced).

Once you choose a workflow, it’ll generate your new project.

Read more about how to get started in our Guide.

What’s new in Exp[ress]o?

Ignite 9 builds upon Ignite 8 in some key ways, almost entirely related to developer experience.

  • Full Expo integration
  • React Native 0.72
  • FlashList
  • New ListView component
  • TypeScript strict mode
  • Experimental New Architecture support
  • Streamlined codebase
  • EAS Build compatibility
  • Expo SplashScreen
  • Reactotron v3
  • Bun support
  • Enhanced developer experience

Full Expo integration

It’s no secret that we are Expo fans here at Infinite Red. I’ve always felt that Expo is the future of React Native, and as of 2022, we started recommending it to our clients for new greenfield projects.

In Ignite 8, we introduced “Expo unification”, which attempted to serve Expo Go, Expo Prebuild, and non-Expo in one boilerplate. However, the implementation ended up being a bit confusing, especially to developers newer to React Native or Expo.

With Ignite 9, we removed the baked-in ios and android folders and instead generate them on-command, depending on the workflow you choose.

  • The Expo Go workflow doesn’t need them at all
  • The Expo Prebuild workflow uses “Continuous Native Generation” (CNG) to generate those folders on command
  • The DIY workflow generates them once and then lets you manage them going forward manually

This solves a lot of problems with the old approach and makes Ignite more Expo-focused out of the box.

React Native 0.72 (and 0.73-ready)

React Native 0.72 brings a lot of developer experience upgrades and we’ve incorporated those into Ignite 9. In addition, we will bring in 0.73 when it lands soon — keep an eye out for that.

We also bumped Expo to SDK 49.

FlashList

We’ve started recommending FlashList from Shopify for rendering lists in React Native. FlashList uses view recycling to achieve far better performance on lists, which are a critical (and ubiquitous) part of React Native apps.

New ListView component

While FlashList is fantastic for most situations, there are some issues, especially with RTL (right-to-left) languages.

To get around this, we created a higher-order component called ListView that detects RTL languages and falls back to the regular FlatList instead. Hopefully in future versions of Ignite we can remove this and go back to using FlashList directly.

This is the sort of developer experience improvement that Ignite provides, based on Infinite Red’s real-world experience building React Native apps every day.

TypeScript strict mode

In the past, we were reluctant to turn on TypeScript strict mode in order to serve a wider audience. Many of the developers using Ignite were transitioning into TypeScript and having strict mode on often resulted in a more painful experience.

But it’s 2023 and TypeScript has gotten much more mature and widely adopted. We have now upgraded Ignite to fully support strict TypeScript.

Experimental New Architecture support

While we do not (yet) recommend turning on the New Architecture for new projects, for those who want to play with bleeding edge technologies, we introduced an experimental option to turn it on. We anticipate the New Architecture to be enabled by default at some point in the next year.

Streamlined codebase

Not only did we remove the ios and android folders (which cleans up the code base considerably), we also removed some extraneous dependencies and cleaned up a lot of deprecated features.

expo-splash-screen

In past versions of Ignite, we used react-native-bootsplash, and in version 8 we introduced expo-splash-screen as well. In this version, we removed react-native-bootsplash and fully settled on expo-splash-screen.

EAS Build compatibility

We now include a default eas.json in new Ignite projects. This includes the settings that we recommend for EAS Build, which is our favorite way to build and release React Native apps (whether Expo or not). (Listen to our RNR episode about EAS!)

This in addition to recommending Continuous Native Generation via Expo Prebuild and config plugins makes for a much smoother out-of-the-box EAS experience.

Reactotron 3

Reactotron is our favorite companion for developing React Native apps, and Ignite 9 includes Reactotron 3 (beta) support. Look for a future announcement about Reactotron 3!

Bun support

We really like what we’ve seen from Bun, the Node and npm competitor. Ignite 9 now includes an option to use Bun (if it’s installed) instead of yarn and npm to install your packages.

Bun is much faster than Yarn 1 and npm, and in our testing seems fully compatible. In the future, we may even build in support for Bun’s runtime instead of Node for running Metro and other scripts.

Enhanced developer experience

A few other DX improvements:

  • Updated the scripts in package.json to be more consistently named and user friendly
  • Uses bun in CI for faster test runs
  • Updated tests in general
  • App.js is renamed to App.tsx to take advantage of TypeScript
  • New withSplashScreen Expo plugin
  • Updated types

What’s next?

We have a couple things planned for future versions of Ignite already:

  • Enhanced monorepo support — we have had a lot of requests to make Ignite work better with monorepos, and we’re working on it!
  • Remove MobX-State-Tree — we still love MST (and I think you would too if you’d give it a chance!), but so many developers have told us that they already have a state management solution and would like Ignite to be less opinionated on that. We’re listening and will remove MST in the next version.

Come join the discussion!

We’re talking about Ignite in the Infinite Red community Slack!

Come join us and let us know how you’re using Ignite. If you run into issues, file an issue.

Here’s a link to the release notes!

Acknowledgements

  • Frank Calise: — Frank is the mastermind behind Ignite 9 and our resident Expo expert at Infinite Red. Without Frank this would never have happened! 💜
  • Josh Yoes: Helped with the CLI improvements and other aspects
  • Mazen Chami: Contributed to TypeScript strict mode implementation and other refinements
  • Kate Kim: Worked on the Expo Config Plugin for the Android 12 Splash Screen and other significant contributions.
  • Robin Heinze & Jamon Holmgren: Technical and strategic oversight
  • Others at Infinite Red and the Ignite community: Testing, bug reporting, and pairing

Please hold that “Clap” button and ⭐️ star the Github repo to show support.

We’re excited to see what you build!

--

--

Co-founder & CTO @infinite_red. Lutheran, husband, dad to 4, React Native Radio podcast host, Twitch streamer, hockey goalie. Talking shop!