Expo provides rich development tools and debugging features to help developers improve development efficiency and code quality. Mastering these tools is crucial for Expo development.
Core Development Tools:
- Expo CLI
Expo CLI is the main command-line tool, providing project creation, development server startup, build, and other functions.
Common Commands:
bash# Create new project npx create-expo-app my-app # Start development server npx expo start # Clear cache npx expo start -c # View device info npx expo start --tunnel # Generate app icon npx expo install expo-app-icon
- Expo Dev Tools
Expo Dev Tools is a web-based development tool interface providing visual project management features.
Features:
- Device connection management
- Log viewing
- Performance monitoring
- Fast refresh control
- Network request monitoring
- React Native Debugger
React Native Debugger is a standalone debugging tool that integrates React DevTools and Redux DevTools.
Usage:
bash# Install npm install -g react-native-debugger # Start react-native-debugger
Debugging Techniques:
- Console Debugging
Use console.log to output debug information:
typescriptconsole.log('Debug info'); console.warn('Warning message'); console.error('Error message'); // Use console.group to organize logs console.group('User Data'); console.log('Name:', user.name); console.log('Age:', user.age); console.groupEnd();
- React DevTools
React DevTools provides component tree viewing, props inspection, state monitoring, and other features.
Usage:
typescript// Enable in development environment if (__DEV__) { const DevTools = require('react-devtools'); DevTools.connectToDevTools({ host: 'localhost', port: 8097, }); }
- Flipper
Flipper is a mobile app debugging tool developed by Facebook, supporting network requests, database, layout inspection, etc.
Configure Flipper:
javascript// In metro.config.js const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); module.exports = config;
- Reactotron
Reactotron is a powerful debugging tool supporting Redux, API calls, logs, and other features.
Configure Reactotron:
typescriptimport Reactotron from 'reactotron-react-native'; if (__DEV__) { const tron = Reactotron .configure() .useReactNative() .connect(); console.tron = tron; }
Performance Optimization Tools:
- Performance Monitoring
Use React Native Performance API:
typescriptimport { Performance } from 'react-native'; // Record performance mark Performance.mark('component-start'); // After component renders Performance.mark('component-end'); // Measure performance Performance.measure('component-render', 'component-start', 'component-end');
- Memory Analysis
Use Flipper or React Native Debugger to view memory usage:
- Monitor memory leaks
- Analyze component rendering performance
- Optimize image and resource loading
- Bundle Analysis
Use webpack-bundle-analyzer to analyze bundle size:
bashnpm install --save-dev @expo/webpack-config webpack-bundle-analyzer
Error Handling:
- Error Boundaries
Use React error boundaries to catch component errors:
typescriptclass ErrorBoundary extends React.Component { state = { hasError: false }; static getDerivedStateFromError(error) { return { hasError: true }; } componentDidCatch(error, errorInfo) { console.error('Error caught by boundary:', error, errorInfo); } render() { if (this.state.hasError) { return <Text>Something went wrong.</Text>; } return this.props.children; } }
- Global Error Handling
Listen to global error events:
typescript// JavaScript errors const defaultErrorHandler = ErrorUtils.getGlobalHandler(); ErrorUtils.setGlobalHandler((error, isFatal) => { console.error('Global error:', error); defaultErrorHandler(error, isFatal); }); // Promise errors process.on('unhandledRejection', (error) => { console.error('Unhandled promise rejection:', error); });
Testing Tools:
- Jest
Jest is Expo's default testing framework:
typescript// Example test import { render } from '@testing-library/react-native'; import MyComponent from './MyComponent'; test('renders correctly', () => { const { getByText } = render(<MyComponent />); expect(getByText('Hello')).toBeTruthy(); });
- Detox
Detox is an end-to-end testing framework:
typescriptdescribe('Login Flow', () => { it('should login successfully', async () => { await element(by.id('username')).typeText('user@example.com'); await element(by.id('password')).typeText('password'); await element(by.id('login-button')).tap(); await expect(element(by.id('welcome'))).toBeVisible(); }); });
Best Practices:
-
Development Environment Configuration: Use different environment variables for development, testing, and production environments
-
Log Management: Disable detailed log output in production environment
-
Error Tracking: Integrate error tracking services like Sentry or Bugsnag
-
Performance Monitoring: Regularly monitor app performance metrics
-
Automated Testing: Establish a comprehensive testing system
Mastering these debugging tools and techniques can greatly improve Expo development efficiency and quality.