projectrules.ai

1. Code Organization and Structure:

react-nativetypescriptstate-managementperformancetesting

Description

This rule provides comprehensive best practices and coding standards for React Native development, covering code organization, performance, security, testing, and common pitfalls.

Globs

**/*.{js,jsx,ts,tsx}
---
description: This rule provides comprehensive best practices and coding standards for React Native development, covering code organization, performance, security, testing, and common pitfalls.
globs: **/*.{js,jsx,ts,tsx}
---

- Use TypeScript for type safety and improved code maintainability.
- Prefer functional components with hooks over class components for simplicity and reusability.
- Maintain a clear and consistent project structure for scalability and maintainability.

## 1. Code Organization and Structure:

- **Directory Structure:**
    - Adopt a feature-based or component-based structure. For example:

        src/
        ├── components/
        │   ├── Button/
        │   │   ├── Button.tsx
        │   │   ├── Button.styles.ts
        │   │   ├── Button.test.tsx
        │   ├── Input/
        │   └── ...
        ├── screens/
        │   ├── Home/
        │   │   ├── HomeScreen.tsx
        │   │   ├── HomeScreen.styles.ts
        │   │   ├── HomeScreen.test.tsx
        │   ├── Profile/
        │   └── ...
        ├── navigation/
        ├── services/
        ├── utils/
        ├── types/
        └── App.tsx

    - Separate concerns into distinct directories (e.g., components, screens, navigation, services, utils, types).

- **File Naming Conventions:**
    - Use descriptive names for files and components (e.g., `HomeScreen.tsx`, `useUserData.ts`).
    - Follow a consistent naming convention (e.g., PascalCase for components, camelCase for functions and variables).
    - Use `.styles.ts` for style files and `.test.tsx` for test files to keep components readable and organized.

- **Module Organization:**
    - Group related components and modules into logical units.
    - Use absolute imports and module aliases to avoid long relative paths (e.g., `@components/Button` instead of `../../../components/Button`).
    - Configure module aliases in `tsconfig.json` or `jsconfig.json`.

- **Component Architecture:**
    - Favor small, reusable components with a single responsibility (Single Responsibility Principle).
    - Use composition over inheritance to create complex components.
    - Consider using a UI library like React Native Paper or NativeBase for pre-built components.

- **Code Splitting Strategies:**
    - Implement lazy loading for screens or components that are not immediately needed.
    - Use `React.lazy` and `Suspense` to load components on demand.
    - Utilize dynamic imports for conditional loading of modules.

## 2. Common Patterns and Anti-patterns:

- **Design Patterns:**
    - **Higher-Order Components (HOCs):** Use HOCs for cross-cutting concerns like authentication or logging.
    - **Render Props:** Use render props to share code between React components.
    - **Hooks:** Use custom hooks to encapsulate logic and stateful behavior.

- **Recommended Approaches:**
    - **State Management:**
        - Use React Context for simple state management.
        - Use Redux, Zustand, or Jotai for complex state management.
        - Consider using Recoil for fine-grained state management.
    - **API Calls:**
        - Use `axios` or `fetch` for making API requests.
        - Create a service layer to handle API calls and data transformations.
    - **Navigation:**
        - Use React Navigation for managing app navigation.
        - Define navigation stacks and routes in a separate module.

- **Anti-patterns and Code Smells:**
    - **Long Component Files:** Break down large components into smaller, more manageable pieces.
    - **Deeply Nested Components:** Avoid excessive nesting, which can impact performance.
    - **Mutating State Directly:** Always use `setState` or a state management library to update state.
    - **Unnecessary Re-renders:** Optimize components to prevent unnecessary re-renders.
    - **Global Styles:** Avoid using global styles, as they can lead to conflicts and make it difficult to maintain the application.

- **State Management Best Practices:**
    - Choose a state management solution that fits the complexity of your application.
    - Keep state minimal and derive values when possible.
    - Use selectors to access state and memoize computed values.

- **Error Handling Patterns:**
    - Use `try...catch` blocks to handle errors gracefully.
    - Implement a global error handler to catch unhandled exceptions.
    - Log errors to a remote monitoring service.

## 3. Performance Considerations:

- **Optimization Techniques:**
    - **Memoization:** Use `React.memo` to memoize components and prevent unnecessary re-renders.
    - **Pure Components:** Extend `React.PureComponent` for components that only depend on props.
    - **Debouncing and Throttling:** Use debouncing and throttling to limit the frequency of function calls.
    - **Virtualization:** Use `FlatList` or `SectionList` for rendering large lists of data.

- **Memory Management:**
    - Avoid memory leaks by properly cleaning up event listeners and timers.
    - Use `useCallback` and `useMemo` to prevent creating new functions and objects on every render.

- **Rendering Optimization:**
    - Minimize the number of re-renders by optimizing component updates.
    - Use `shouldComponentUpdate` (for class components) or `React.memo` to control re-renders.
    - Avoid using inline styles, as they are re-created on every render.

- **Bundle Size Optimization:**
    - Use code splitting to reduce the initial bundle size.
    - Remove unused code and dependencies.
    - Use a bundler like Metro or Webpack with tree shaking enabled.
    - Compress images and other assets.

- **Lazy Loading Strategies:**
    - Implement lazy loading for images and other assets using `React.lazy` and `Suspense`.
    - Use dynamic imports to load modules on demand.

## 4. Security Best Practices:

- **Common Vulnerabilities:**
    - **Cross-Site Scripting (XSS):** Sanitize user input to prevent XSS attacks.
    - **SQL Injection:** Use parameterized queries to prevent SQL injection attacks.
    - **Cross-Site Request Forgery (CSRF):** Implement CSRF protection tokens.
    - **Man-in-the-Middle (MITM) Attacks:** Use HTTPS to encrypt communication.

- **Input Validation:**
    - Validate user input on both the client and server sides.
    - Use regular expressions or validation libraries to enforce input constraints.

- **Authentication and Authorization Patterns:**
    - Use a secure authentication protocol like OAuth 2.0 or JWT.
    - Implement role-based access control (RBAC) to restrict access to sensitive resources.

- **Data Protection Strategies:**
    - Encrypt sensitive data at rest and in transit.
    - Use secure storage mechanisms for storing API keys and other secrets.

- **Secure API Communication:**
    - Use HTTPS for all API communication.
    - Implement API rate limiting to prevent abuse.
    - Validate API responses to prevent data injection attacks.

## 5. Testing Approaches:

- **Unit Testing Strategies:**
    - Write unit tests for individual components and modules.
    - Use a testing framework like Jest or Mocha.
    - Mock dependencies to isolate the component being tested.

- **Integration Testing:**
    - Write integration tests to verify the interaction between components and modules.
    - Test the integration with external APIs and services.

- **End-to-End Testing:**
    - Write end-to-end tests to verify the entire application flow.
    - Use a testing framework like Detox or Appium.

- **Test Organization:**
    - Organize tests into separate directories based on component or module.
    - Use descriptive names for test files and test cases.

- **Mocking and Stubbing:**
    - Use mocking and stubbing to isolate components and control their behavior during testing.
    - Use a mocking library like Jest or Sinon.

## 6. Common Pitfalls and Gotchas:

- **Frequent Mistakes:**
    - **Directly Mutating State:** Always use `setState` or a state management library to update state.
    - **Ignoring Platform Differences:** Test your application on both iOS and Android devices.
    - **Over-Optimizing:** Optimize only when necessary, as premature optimization can lead to complex code.
    - **Not Using a Debugger:** Utilize the React Native debugger for efficient debugging.

- **Edge Cases:**
    - **Handling Device Orientation Changes:** Implement logic to handle device orientation changes gracefully.
    - **Handling Network Connectivity Issues:** Implement error handling for network connectivity issues.
    - **Handling Different Screen Sizes and Densities:** Design your UI to adapt to different screen sizes and densities.

- **Version-Specific Issues:**
    - Be aware of breaking changes in React Native and its dependencies.
    - Test your application with different versions of React Native.

- **Compatibility Concerns:**
    - Ensure that your application is compatible with the target operating systems and devices.
    - Use polyfills to support older browsers and devices.

- **Debugging Strategies:**
    - Use the React Native debugger to inspect the component tree and state.
    - Use the console to log messages and debug code.
    - Use a remote debugging tool to debug on a physical device.

## 7. Tooling and Environment:

- **Recommended Development Tools:**
    - **VS Code:** Use VS Code with the React Native Tools extension for debugging and code completion.
    - **React Native CLI:** Use the React Native CLI for creating and managing React Native projects.
    - **Expo CLI:** Use the Expo CLI for developing and testing React Native applications without native code.
    - **Android Studio:** Use Android Studio for building and debugging Android applications.
    - **Xcode:** Use Xcode for building and debugging iOS applications.

- **Build Configuration:**
    - Use a build system like Gradle (Android) or CocoaPods (iOS) to manage dependencies.
    - Configure build variants for different environments (e.g., development, staging, production).

- **Linting and Formatting:**
    - Use ESLint and Prettier to enforce code style and catch potential errors.
    - Configure ESLint and Prettier to automatically format code on save.

- **Deployment Best Practices:**
    - Use a continuous integration and continuous deployment (CI/CD) pipeline to automate the deployment process.
    - Use a service like App Center or Bitrise for building and deploying React Native applications.

- **CI/CD Integration:**
    - Integrate your code repository with a CI/CD service like GitHub Actions or CircleCI.
    - Configure the CI/CD pipeline to run tests and build the application on every commit.
1. Code Organization and Structure: