Turbopack Best Practices
turbopacktypescriptnextjswebpackreact
Description
This rule provides comprehensive best practices for developing with Turbopack, covering code organization, performance, security, testing, and tooling to ensure efficient and maintainable applications.
Globs
**/*.{js,jsx,ts,tsx}
---
description: This rule provides comprehensive best practices for developing with Turbopack, covering code organization, performance, security, testing, and tooling to ensure efficient and maintainable applications.
globs: **/*.{js,jsx,ts,tsx}
---
# Turbopack Best Practices
This document outlines best practices for developing with Turbopack, focusing on code organization, performance, security, testing, and tooling.
## 1. Core Principles
- **Leverage the Turbo Engine:** Turbopack's core strength lies in its Turbo engine for function-level caching. Understand and utilize this for incremental builds.
- **Embrace Incremental Computation:** Be mindful of how changes affect the build process. Design your application to maximize incremental computation benefits.
- **Use TypeScript:** Turbopack has built-in support for TypeScript and JSX, so use them to improve code quality and developer experience. Make full use of TypeScript's features like generics, interfaces and types.
- **Follow Next.js Conventions:** When using Turbopack within Next.js, adhere to Next.js's recommended patterns and practices.
- **Avoid direct webpack configurations:** Turbopack aims to abstract away webpack configurations, prefer using Next.js configurations to customize Turbopack.
## 2. Code Organization and Structure
- **Directory Structure:**
- **`src/`:** All application source code should reside within the `src/` directory.
- **`components/`:** Reusable UI components.
- **`pages/`:** (Next.js) Pages for routing.
- **`api/`:** (Next.js) API routes.
- **`lib/` or `utils/`:** Utility functions and shared logic.
- **`types/` or `interfaces/`:** TypeScript type definitions and interfaces.
- **`styles/` or `css/`:** Global styles and CSS modules.
- **`public/`:** Static assets (images, fonts, etc.).
- **File Naming Conventions:**
- Use descriptive names for files and directories.
- Component files: `ComponentName.jsx` or `ComponentName.tsx`.
- Style files: `ComponentName.module.css` or `ComponentName.module.scss`.
- Utility files: `utilityName.js` or `utilityName.ts`.
- **Module Organization:**
- Group related code into modules with clear responsibilities.
- Export only what is necessary from each module.
- Use ES modules (import/export) for modularity.
- **Component Architecture:**
- **Atomic Design:** Consider using Atomic Design principles to create a scalable and maintainable component architecture.
- **Composition:** Favor composition over inheritance for component reusability.
- **Separation of Concerns:** Separate UI logic, data fetching, and state management within components.
- **Keep components small:** Focus on single responsability principle.
- **Code Splitting Strategies:**
- **Dynamic Imports:** Use dynamic imports (`import()`) to split code into smaller chunks that are loaded on demand.
- **Route-Based Splitting:** (Next.js) Each page in the `pages/` directory is automatically code-split.
- **Component-Based Splitting:** Split large components into smaller, lazily loaded sub-components.
- **Vendor Splitting:** Turbopack automatically splits vendor code (third-party libraries) into separate chunks.
## 3. Common Patterns and Anti-patterns
- **Design Patterns:**
- **Higher-Order Components (HOCs):** Reusable logic for components (use with caution, consider hooks).
- **Render Props:** Sharing code between React components using a prop whose value is a function.
- **Hooks:** Reusable stateful logic for functional components.
- **Context API:** Share data that is considered "global" for a tree of React components.
- **Recommended Approaches:**
- **Data Fetching:** Use `getServerSideProps`, `getStaticProps`, or `getInitialProps` (Next.js) for data fetching depending on your requirements.
- **API Routes:** Use Next.js API routes to create serverless functions for handling API requests.
- **State Management:** Choose a state management library (Redux, Zustand, Jotai, Recoil) based on the complexity of your application.
- **Anti-patterns:**
- **Global State Mutation:** Avoid directly mutating global state, use reducers or state management libraries.
- **Over-Fetching:** Fetch only the data that is needed by a component.
- **Tight Coupling:** Reduce dependencies between modules to improve maintainability.
- **Long Component Files:** Avoid having components larger than 200-300 lines, break down them into smaller components.
- **State Management Best Practices:**
- **Centralized State:** Manage application state in a central store.
- **Immutability:** Treat state as immutable to prevent unexpected side effects.
- **Reducers:** Use reducers to update state based on actions.
- **Selectors:** Use selectors to derive data from the state.
- **Error Handling Patterns:**
- **Error Boundaries:** Use error boundaries to catch JavaScript errors anywhere in a component tree.
- **Centralized Error Logging:** Log errors to a central service for monitoring and debugging.
- **Graceful Degradation:** Handle errors gracefully and provide informative messages to the user.
- **Retry mechanisms:** Implement retry mechanisms for failed requests.
## 4. Performance Considerations
- **Optimization Techniques:**
- **Caching:** Leverage Turbopack's caching capabilities to avoid unnecessary re-builds.
- **Memoization:** Use `React.memo` or `useMemo` to memoize components and values.
- **Debouncing and Throttling:** Use debouncing and throttling to reduce the frequency of function calls.
- **Memory Management:**
- **Avoid Memory Leaks:** Be careful to clean up event listeners and timers when components unmount.
- **Garbage Collection:** Understand how JavaScript garbage collection works and avoid creating unnecessary objects.
- **Rendering Optimization:**
- **Virtualization:** Use virtualization libraries for rendering large lists.
- **Code Splitting:** Split the codebase into smaller chunks using dynamic imports for faster initial load times.
- **Image Optimization:** Optimize images using tools like `next/image` or `cloudinary`.
- **Bundle Size Optimization:**
- **Tree Shaking:** Remove unused code from the bundle by using ES modules and configuring your bundler correctly.
- **Minification:** Minify JavaScript and CSS code to reduce bundle size.
- **Compression:** Compress assets using gzip or Brotli.
- **Lazy Loading Strategies:**
- **Component-Level Lazy Loading:** Lazy load components that are not initially visible.
- **Image Lazy Loading:** Lazy load images that are not initially visible.
- **Route-Based Lazy Loading:** Lazy load routes that are not frequently visited.
## 5. Security Best Practices
- **Common Vulnerabilities:**
- **Cross-Site Scripting (XSS):** Prevent XSS attacks by sanitizing user input and using appropriate escaping techniques.
- **Cross-Site Request Forgery (CSRF):** Prevent CSRF attacks by using CSRF tokens.
- **SQL Injection:** Prevent SQL injection attacks by using parameterized queries or ORMs.
- **Authentication and Authorization Issues:** Secure your API endpoints with proper authentication and authorization mechanisms.
- **Input Validation:**
- **Validate all user input:** Sanitize and validate all user input on both the client and server.
- **Use appropriate data types:** Enforce data types to prevent unexpected values.
- **Authentication and Authorization Patterns:**
- **JSON Web Tokens (JWT):** Use JWTs for authentication and authorization.
- **Role-Based Access Control (RBAC):** Implement RBAC to control access to resources based on user roles.
- **OAuth:** Use OAuth for third-party authentication.
- **Data Protection Strategies:**
- **Encryption:** Encrypt sensitive data at rest and in transit.
- **Data Masking:** Mask sensitive data in logs and reports.
- **Data Retention Policies:** Implement data retention policies to ensure compliance with regulations.
- **Secure API Communication:**
- **HTTPS:** Use HTTPS to encrypt communication between the client and server.
- **Rate Limiting:** Implement rate limiting to prevent abuse and denial-of-service attacks.
- **API Keys:** Use API keys for authentication.
## 6. Testing Approaches
- **Unit Testing Strategies:**
- **Test individual components and functions:** Write unit tests to verify the behavior of individual components and functions.
- **Use mocking and stubbing:** Use mocking and stubbing to isolate components from their dependencies.
- **Test edge cases:** Test edge cases and error conditions.
- **Integration Testing:**
- **Test the interaction between components:** Write integration tests to verify the interaction between components.
- **Test data flow:** Test the flow of data between components and services.
- **End-to-End Testing:**
- **Test the entire application flow:** Write end-to-end tests to verify the entire application flow.
- **Use browser automation tools:** Use browser automation tools like Cypress or Puppeteer.
- **Test Organization:**
- **Keep tests close to the code:** Organize tests in the same directory as the code they test.
- **Use descriptive test names:** Use descriptive test names that clearly describe what the test is verifying.
- **Mocking and Stubbing:**
- **Use mocking libraries:** Use mocking libraries like Jest or Sinon to create mocks and stubs.
- **Avoid over-mocking:** Mock only the dependencies that are necessary.
## 7. Common Pitfalls and Gotchas
- **Frequent Mistakes:**
- **Incorrectly configured `tsconfig.json`:** Ensure paths and baseUrl are correctly configured for absolute imports.
- **Misunderstanding caching:** Not utilizing Turbopack's caching efficiently, leading to slower builds.
- **Not using TypeScript features**: Not leveraging the benefits of Typescript and writing javascript code that misses out on typesafety.
- **Edge Cases:**
- **Complex dependencies:** Be aware of how complex dependencies can affect build times.
- **Large file sizes:** Optimize large file sizes to improve performance.
- **Version-Specific Issues:**
- **Breaking changes:** Be aware of breaking changes in Turbopack and Next.js releases.
- **Compatibility issues:** Ensure that your dependencies are compatible with the versions of Turbopack and Next.js that you are using.
- **Compatibility Concerns:**
- **Browser compatibility:** Test your application in different browsers to ensure compatibility.
- **Device compatibility:** Test your application on different devices to ensure compatibility.
- **Debugging Strategies:**
- **Use debugging tools:** Use browser developer tools and debugging tools to identify and fix issues.
- **Log statements:** Use log statements to track the flow of execution and identify errors.
- **Reproducible steps:** Create reproducible steps to help isolate and fix issues.
## 8. Tooling and Environment
- **Recommended Development Tools:**
- **VS Code:** A popular code editor with excellent support for JavaScript, TypeScript, and React.
- **ESLint:** A linter that helps you identify and fix code style issues.
- **Prettier:** A code formatter that automatically formats your code.
- **Chrome Developer Tools:** Powerful tools for debugging and profiling web applications.
- **Build Configuration:**
- **Configure `tsconfig.json`:** Configure `tsconfig.json` to enable TypeScript features and specify compiler options.
- **Configure ESLint:** Configure ESLint to enforce code style guidelines.
- **Configure Prettier:** Configure Prettier to automatically format code.
- **Linting and Formatting:**
- **Use ESLint and Prettier:** Use ESLint and Prettier to automatically lint and format your code.
- **Integrate with your editor:** Integrate ESLint and Prettier with your code editor to automatically lint and format code on save.
- **Deployment Best Practices:**
- **Use a CI/CD pipeline:** Use a CI/CD pipeline to automate the build, test, and deployment process.
- **Deploy to a CDN:** Deploy static assets to a CDN for faster delivery.
- **Monitor your application:** Monitor your application for errors and performance issues.
- **CI/CD Integration:**
- **Use GitHub Actions, GitLab CI, or CircleCI:** Use a CI/CD platform to automate the build, test, and deployment process.
- **Run tests in CI/CD:** Run tests in your CI/CD pipeline to ensure that code changes do not introduce new bugs.
- **Automate deployments:** Automate deployments to production and staging environments.
## 9. Additional Considerations
- **Experimentation:** Turbopack is rapidly evolving. Experiment with new features and configurations to optimize your build process.
- **Community Engagement:** Participate in the Turbopack community to share your experiences and learn from others.
- **Documentation:** Refer to the official Turbopack documentation for the latest information and guidance.
By following these best practices, you can leverage the full potential of Turbopack to build high-performance, maintainable, and secure applications.