Best Practices

This section covers best practices for building production-ready SaaS applications with Fireact.dev.

Categories

Code Organization

Performance

Security

Error Handling

Testing

Deployment

General Principles

1. Follow TypeScript Best Practices

Always use TypeScript for type safety:

// ✅ Good: Explicit types
interface UserData {
  name: string;
  email: string;
  role: 'admin' | 'user';
}

const updateUser = async (userId: string, data: UserData): Promise<void> => {
  // Implementation
};

// ❌ Bad: Using 'any'
const updateUser = async (userId: any, data: any): Promise<any> => {
  // Implementation
};

2. Handle Errors Gracefully

Always handle potential errors:

// ✅ Good: Proper error handling
try {
  const result = await functionCall();
  return result;
} catch (error) {
  console.error('Operation failed:', error);
  throw new Error('User-friendly error message');
}

// ❌ Bad: No error handling
const result = await functionCall();
return result;

3. Optimize Performance

Use React best practices for performance:

// ✅ Good: Memoization
const ExpensiveComponent = React.memo(({ data }) => {
  const processedData = useMemo(() => {
    return expensiveCalculation(data);
  }, [data]);

  return <div>{processedData}</div>;
});

// ❌ Bad: No optimization
const ExpensiveComponent = ({ data }) => {
  const processedData = expensiveCalculation(data); // Runs on every render
  return <div>{processedData}</div>;
};

4. Secure Your Application

Implement proper security measures:

// ✅ Good: Check permissions
const deleteSubscription = functions.https.onCall(async (data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError('unauthenticated', 'Must be logged in');
  }

  const isOwner = await checkSubscriptionOwnership(
    context.auth.uid,
    data.subscriptionId
  );

  if (!isOwner) {
    throw new functions.https.HttpsError('permission-denied', 'Not authorized');
  }

  // Proceed with deletion
});

// ❌ Bad: No permission checks
const deleteSubscription = functions.https.onCall(async (data, context) => {
  await admin.firestore().collection('subscriptions').doc(data.subscriptionId).delete();
});

5. Write Maintainable Code

Keep code clean and maintainable:

// ✅ Good: Small, focused functions with clear names
const validateEmail = (email: string): boolean => {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
};

const sendWelcomeEmail = async (userEmail: string): Promise<void> => {
  if (!validateEmail(userEmail)) {
    throw new Error('Invalid email address');
  }
  // Send email logic
};

// ❌ Bad: Large function doing multiple things
const processUser = async (data: any) => {
  // Validation
  if (!data.email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email)) {
    throw new Error('Invalid email');
  }
  // Database operation
  await db.collection('users').doc(data.id).set(data);
  // Send email
  await emailService.send(data.email, 'Welcome!');
  // Log event
  console.log('User processed:', data.id);
};

Quick Reference Checklist

Before Deploying

  • All TypeScript errors resolved
  • Security rules tested and deployed
  • Environment variables configured
  • Error handling implemented
  • Loading states added to UI
  • Performance optimized
  • Tests passing
  • Documentation updated

Code Quality

  • Consistent naming conventions
  • Comments for complex logic
  • No console.logs in production
  • Proper error messages
  • TypeScript types defined
  • Code formatted with ESLint

Security

  • Authentication required for protected routes
  • Permissions checked in Cloud Functions
  • Firestore rules properly configured
  • Sensitive data not exposed
  • API keys in environment variables
  • Input validation implemented

Performance

  • Images optimized
  • Code splitting implemented
  • Database queries optimized
  • React components memoized where needed
  • Unnecessary re-renders eliminated

Contributing

Have best practices to share? See our Contributing Guide to submit your suggestions.


Code Organization

Best practices for organizing your Fireact.dev codebase.

Performance Optimization

Best practices for optimizing performance in Fireact applications.

Error Handling

Best practices for error handling and recovery in Fireact applications.

Testing Strategies

Best practices for testing Fireact applications including unit, integration, and E2E tests.


Last modified October 12, 2025: add documentation (dac84c6)