Important note: Bowser is now re-integrated into Ignite CLI as of version 4.0.0! Head to https://github.com/infinitered/ignite to check it out. This version will continue to work on Ignite 3.x and be supported by the community.
To see it in action, check out the blog post by Robin Heinze here: Creating a Trivia App with Ignite Bowser.
You can also watch a live coding demo at React Live Amsterdam, where Jamon Holmgren codes an Ignite Bowser app in less than 30 minutes.
First, install Ignite CLI globally:
npm install -g [email protected] # or yarn global add [email protected]
Note: Make sure you have CocoaPods installed because otherwise, React Native installation will fail.
Then spin up a new Bowser-powered React Native app:
ignite new MyApp -b bowser
cd into your new app and run
react-native run-ios or
react-native run-android (note: in Android, you'll need an Android emulator running or an Android phone attached).
You should see an app that looks like the screenshot above!
Next step -- follow this tutorial to learn how to create a trivia app with Ignite Bowser: https://shift.infinite.red/creating-a-trivia-app-with-ignite-bowser-part-1-1987cc6e93a1
The true gem of Ignite Bowser. Generators help you scaffold your app very quickly, be it for a proof-of-concept, a demo, or a production app. Generators are there to save you time, keep your code consistent, and help you with the basic structure of your app.
Will give you information on what generators are present.
This is the generator you will be using most often. There are two flavors:
observerfunction - you need this if you pass any mobx-state-tree objects as props to the component, and the component will dereference properties of those objects.
observer. If you're only passing plain values or non-MST objects, this is fine.
ignite generate component awesome-component
You can also bypass the choice by providing which component type you want to create:
ignite generate component awesome-component --function-component
ignite generate component awesome-component --stateless-function
Generates a "hooks enabled" screen.
ignite generate screen awesome-screen
Creates a Mobx-State-Tree model.
ignite generate model awesome-model
The built-in generators aren't enough? Fret not, you can create your own generators that suit your project/company. These generators can live with the default ignite-bowser generators.
Please refer to the documentation on how to create your own generators.
The Ignite Bowser boilerplate project's structure will look similar to this:
ignite-project ├── app │ ├── components │ ├── i18n │ ├── models │ ├── navigation │ ├── screens │ ├── services │ ├── theme │ ├── utils │ ├── app.tsx │ ├── environment-variables.ts | ├── assets/fonts/ ├── storybook │ ├── views │ ├── index.ts │ ├── storybook-registry.ts │ ├── storybook.ts ├── test │ ├── __snapshots__ │ ├── storyshots.test.ts.snap │ ├── mock-i18n.ts │ ├── mock-reactotron.ts │ ├── setup.ts │ ├── storyshots.test.ts ├── README.md ├── android ├── ignite │ ├── ignite.json │ └── plugins ├── index.js ├── ios └── package.json
Included in an Ignite boilerplate project is the
app directory. This is a directory you would normally have to create when using vanilla React Native.
The inside of the
app directory looks similar to the following:
app │── components │── i18n ├── models ├── navigation ├── screens ├── services ├── theme ├── utils ├── app.tsx
This is where your React dumb components will live. Each component will have a directory containing the
.tsx file, along with a story file, and optionally
.props files for larger components. The app will come with some commonly used components like Button.
This is where your translations will live if you are using
This is where your app's models will live. Each model has a directory that will contain the
mobx-state-tree model file, test file, and any other supporting files like actions, types, etc. There's also an extensions directory with useful shared extensions that you can include in your models like
.extend(withEnvironment) to access the root store or environment, respectively.
This is where your
react-navigation navigators will live.
For a walkthrough about how React Navigation v5 works, check out Harris Robin's post: Getting Started with the New React Navigation v5 and Ignite Bowser v5.
This is where your screen components will live. A screen is a React component that will take up the entire screen and be part of the navigation hierarchy. Each screen will have a directory containing the
.tsx file, along with any assets or other helper files.
services Any services that interface with the outside world will live here (think REST APIs, Push Notifications, etc.).
theme Here lives the theme for your application, including spacing, colors, and typography. For help with adding custom fonts to your application, check out the readme in ./assets/fonts/.
utils This is a great place to put miscellaneous helpers and utilities. Things like date helpers, formatters, etc. are often found here. However, it should only be used for things that are truly shared across your application. If a helper or utility is only used by a specific component or model, consider co-locating your helper with that component or model.
app.tsx This is the entry point to your app. This is where you will find the main App component, which renders the rest of the application. This is also where you will specify whether you want to run the app in storybook mode.
ignite directory stores all things Ignite, including CLI and boilerplate items. Here you will find generators, plugins, and examples to help you get started with React Native.
This is where your stories will be registered and where the Storybook configs will live.
This directory will hold your Jest configs and mocks, as well as your storyshots test file. This is a file that contains the snapshots of all your component storybooks.
If you've used Ignite Andross (the first Ignite stack), you know we formerly used Redux for state management, as does much of the community. However, we encountered some pain points with Redux so we went in search of a different solution to meet our needs and landed on
mobx-state-tree. We find that it’s a great middle-ground between completely structured (like
redux) and completely freestyle (like
mobx). It brings more than just state-management to the table as well (such as dependency injection, serialization, and lifecycle events).
actions, it feels familiar for React developers
references(foreign keys), and
mapStateToProps; they are inferred
model.extendallow for easy code-sharing of common patterns
beforeDestroylet you have control over your data at various points in its lifecycle
getEnvallows you to reference your environment (like API or other services)
mobx-react-litemakes React "MobX-aware" and only re-renders when absolutely necessary
We also recognize no state management solution is perfect. MST has some known downfalls:
mobx-state-treeboth seem to have "magic" or "sorcery" that makes issues less straightforward to debug because you don't always have a clear picture of what's happening (but using Reactotron, which has
mobx-state-treesupport built-in, helps a lot). The MobX docs can also help illumitate some of the magic.
MobX and MobX State Tree can be a lot to learn if you're coming from Redux, so here are a few of our favorite resources to learn the basics:
Be sure to check out the official Getting Started guide for MobX State Tree.
There is also a free egghead.io course.
For a great explanation and walkthrough of the basics, check out State Management with MobX State Tree by React Native Training.
And for more in-depth reading, the official documentation is a great resource.
The official docs for MobX are another important resource since MST is built on MobX.
To see example codebases using Bowser (and MST), check out these repositories:
https://github.com/jamonholmgren/PlayerPopularity (simple implementation)
https://github.com/jamonholmgren/TrailBlazers (simple implementation with hooks)
https://github.com/infinitered/ChainReactApp2019 (more in-depth implementation)
To keep your React Native app updated:
To keep your Ignite Bowser based app updated:
In addition to
mobx-state-tree, we've also transitioned to using
TypeScript vs plain
In Bowser, TypeScript is fully set up, so if you know TS, all you need to do is start coding!
If you are new to TypeScript, here are some of our favorite resources:
Bowser is now re-integrated into Ignite CLI as of version 4.0.0! Head to https://github.com/infinitered/ignite to check it out. This version will continue to work on Ignite 3.x and be supported by the community.