React Native Folder Structure — For Simplicity (Part 1)
npx react-native init, then what?
After 6 months of coronavirus attack, react native becomes less popular than covid19, so i want to share to you guys how to make simple structure folder for mobile app development and make react native being popular again (lol kidding). React native is one of the most popular cross-platform mobile framework based on statista survey. What is the main reason of it? It is because the freedom for developer to create structure folder according to the needs of each developer and requirements itself.
This is the default Android native structure folder. As we can see, the structure folder is generated completely after we create new project in Android Studio.
- manifest (contains the
AndroidManifest.xml
file). - java (contains the Java source code files, separated by package names, including JUnit test code).
- res (contains all non-code resources, such as XML layouts, UI strings, and bitmap images, divided into corresponding sub-directories. For more information about all possible resource types, see Providing Resources.) and
- gradle scripts (library and another configuration).
Meanwhile, this is the default react native structure folder. It is generated after we run npx react-native init MyTestApp. This structure folder is really confusing for react native developer because there are only platform folder (Android/iOS), node_modules and another files. index.js file becomes the head when it is running and app.js becomes the view of index.js.
Then, we have to create our own structure folder, because the default folder just gives index.js and app.js, no clue for the structure folder. Actually, there are many example of easy and simple structure folder for react native, but sometimes, it needs more understanding, depends on the react fundamentals.
- assets
Assets is a folder to store static resources, like fonts and images. Sometimes, an app can use more than 1 font, just put them in this folder. Images folder is used to store images for local, maybe for icon, app launcher, etc. - src
Src is a folder to store all of source code that is used. It is the most general structure folder for react native, usually there are actions, components, pages/screens, reducers and routes/navigations. In this case, i use react-redux for reducers, it connects the actions, constants and reducers folder.
- actions
It is used to store all the function to call API or set Asyncstorage.
- components
It is used to store all the granule or compound level items here like atoms (for smallest components like custom button, input etc) or mixed of small components if needed (it is the best way for reusable components rather than we import and code one by one just for the same components). In the next post i will explain how to create the reusable components for the better performance and faster coding.
- config
It is used to store all the configurations. In this case, i have the configuration for channels, colors, fonts, images and strings. Why do we have to create config folder? it is to simplify for exporting the resource files. For example we want to export all images that we store in the assets/images folder.
- constants
It is used to store all uri link API that will be imported in actions. For example in the actions folder (image above), there is the function of postVersion, the link uri is imported from constants folder, so it calls
- pages
It is used to store all pages/screens or the UI that user will interact with, using class component or functional component. If there are many pages, just create folder for each page to make it easier for development.
- reducers
It is used to store all the reducers state that connect to actions. Just like i explained before, in this case i use react-redux for reducers. Let’s take the example in postVersion function, there is the state reducer calls
We must create all types in reducers using switch-case logic based on action type.
- routes
It is used to store all the stack navigation. Firstly, we import all the pages like this
Secondly, createStackNavigator and createAppContainer to construct all the pages.
Lastly, export them and store in const Stack.
- utility
It is used to store all the repeated functions which related to data (not UI), like sorting, calculating, filtering, etc. The way to use it is just import the utility file and point to the function which we want to use.
3. index.js
This is the head file when we running the react native project. The start point where we will define our app that brings all modules together here to link and start navigation of the application. In index.js, i set some configuration:
a. Environment. It is for the environment that we use for development either it is development or production. If development, i set the logger to display all the logs for debugging (it is because react native doesn’t have IDE tool like Android Studio)
b. Middleware. I store reducers for calling API and create middleware
c. AppRegistry. In AppRegistry, i call AppContainer that renders all the views, in this case, i call the Stack component which is the routes folder that i import
4. react-native.config.js
Actually, it is just additional file if we want to use custom fonts. Set the assets path where fonts are stored, for example in assets/fonts/. More explanation of this.
So, those are all explanations of each folder. Of course there are some pros and cons to the folder structure.
[PROS]
1. The config folder can be used to set dual language, dark/light mode (theme colors), etc. It is like the settings of our app.
2. Reducers are separated based on each function, that’s why there are folder for actions (for calling API), constants (for storing uri link API), and reducers itself.
3. It is easy for maintenance and tracking the issue that happens to our app.
[CONS]
1. In actions and reducers folder, we have to create one by one for each action type, even though all states are same (i will fix it, maybe for the next post?).
2. It is not recommended for the complex app (has many features/modules) because of the cons number 1, it will produce long lines of code. The alternative is it can be put in the same folder, so there is 1 page + 1 redux for each page or each API function.
3. In redux management, the using of 1 file. If more than 1 developer working simultaneously, there will be conflict when put API for the reducer.