Placement of files within a project repository is important, especially as the project scales. Below are our patterns for file structure organization:
Components
Location
- Global:
src/components
- Contained/In one route only:
src/routes/:routeName/components
Creation
As noted in the adding features we use the component subgenerator like so:
yo react-firebase:component
Handles
- All view layout/styling
Patterns
- Should be stateless (just a function instead of a Class)
Example
src/components/SomeComponent.js
:
import React, { PropTypes } from "react";
function SomeComponent({ someProp }) {
return <div>Some Component</div>;
}
SomeComponent.propTypes = {
someProp: PropTypes.func.isRequired,
};
export default SomeComponent;
Approved file names by component
These are the only authorized files, anything that doesn’t have a clear home should go in *enhancer.js. (Need to update the generator)
Name | Purpose |
---|---|
Component.enhancer.js |
Adds data and handling to the Component, importing the following files to do so: (ALSO THE CATCHALL) |
Component.js |
Functional React Component |
Component.spec.js |
Unit tests per component |
Component.styles.js |
JS Styles / MUI V1 stylesheets |
index.js |
Exports the enhanced Component |
Routes
Async vs Sync definitions
Location
- Route Folder:
src/routes/SomeRoute
- Components:
src/routes/SomeRoute/components/SomeComponent/SomeComponent.js
Creation
Create a new container name “SomeRoute” by running yo react-firebase:route SomeRoute
What they Handle
- Pages/Routes/Locations within app
- They can contain components, and modules
Children
Components
components/SomeComponent/SomeComponent.js
Routes
index.js
Assets
Location
`src/static`
Patterns
Import in javascript, then use import as ref
Example
To import asset.png
:
import Asset from "static/asset.png";
// Then later
<img src={Asset} />;
Why
This allows Webpack to handle chunking of asset files, which means in the case of files like pngs, it can be converted to a BASE64 string when being imported. Also, it reads nice to have all dependencies/content imported with the same syntax.
Styles
Location
Global/Shared: src/theme
Patterns
Styles for components are within .styles
file within the component folder