Home / Packages / @sanjeed5/astro

@sanjeed5/astro

This rule provides comprehensive best practices and coding standards for developing Astro projects. It covers code organization, performance, security, testing, and common pitfalls.

prpm install @sanjeed5/astro
2 total downloads

📄 Full Prompt Content

# Astro Library Best Practices and Coding Standards

This document outlines the recommended best practices and coding standards for developing Astro projects to ensure maintainability, performance, and security.

## 1. Code Organization and Structure

### 1.1 Project Structure

-   **`src/` Directory:**  This directory contains the core source code of your Astro project.
    -   **`src/pages/`:**  This directory is crucial for routing. Every `.astro`, `.md`, or `.mdx` file in this directory automatically becomes a route. Use a clear and consistent naming convention for your pages (e.g., `about.astro`, `blog/index.astro`, `blog/[slug].astro`).
    -   **`src/components/`:**  Store reusable UI components in this directory. Organize components into subdirectories based on their functionality or feature area (e.g., `src/components/Header/`, `src/components/Card/`).
    -   **`src/layouts/`:** Layouts define the overall structure of your pages (e.g., header, footer, navigation).  Use layouts to maintain a consistent look and feel across your website.
    -   **`src/content/`:**  (Recommended for content-driven sites) Use the Content Collections feature to manage structured content like blog posts, documentation, or product listings.  Define schemas for your content types to ensure data consistency.
    -   **`src/styles/`:** Store global styles and CSS variables in this directory. Consider using CSS Modules or a CSS-in-JS solution for component-specific styling.
    -   **`src/scripts/`:**  Place client-side JavaScript files in this directory. Use modules and avoid polluting the global scope.
    -   **`src/assets/`:**  Store static assets like images, fonts, and other media files in this directory.
-   **`public/` Directory:** This directory contains static assets that don't need processing, such as `robots.txt`, `favicon.ico`, and other files that should be served directly.  Avoid placing images that require optimization in this directory; use the `src/assets/` directory instead.
-   **`astro.config.mjs`:** This file contains the Astro configuration options, including integrations, build settings, and more.  Keep this file well-organized and documented.
-   **`.env`:** Store environment variables in this file.  Use a library like `dotenv` to load environment variables into your application.

### 1.2 Component Design

-   **Atomic Design Principles:** Consider using Atomic Design principles to structure your components into atoms, molecules, organisms, templates, and pages.  This promotes reusability and maintainability.
-   **Single Responsibility Principle:** Each component should have a single, well-defined responsibility.  Avoid creating large, complex components that do too much.
-   **Props and Slots:** Use props to pass data to components and slots to allow components to accept children.  Define prop types using TypeScript to ensure type safety.

## 2. Common Patterns and Anti-patterns

### 2.1 UI Framework Integration

-   **Island Architecture:** Embrace Astro's island architecture to minimize JavaScript and improve performance.  Only hydrate interactive components.
-   **Client Directives:** Use `client:load`, `client:idle`, `client:visible`, `client:media`, and `client:only` directives appropriately to control when components are hydrated.  Avoid over-hydrating components.
-   **Framework Component Composition:**  Compose components from different frameworks (React, Vue, Svelte, etc.) within the same Astro page.  This allows you to leverage the strengths of different frameworks.
-   **Passing Props and Children:**  Pass props and children to framework components from Astro components.  Use named slots to organize children.
-   **Anti-pattern: Mixing Astro and Framework Components:** Do not import `.astro` components directly into UI framework components (e.g., `.jsx` or `.svelte`). Use slots to pass static content from Astro components to framework components.

### 2.2 Data Fetching

-   **`fetch` API:** Use the `fetch` API to fetch data from external sources or internal APIs.  Handle errors appropriately.
-   **Content Collections API:** Use the Content Collections API to manage structured content like blog posts or documentation.  Define schemas for your content types.
-   **CMS Integration:** Integrate with a headless CMS like Hygraph, Contentful, or Strapi to manage content.  Use the CMS's API to fetch data and display it on your website.
-   **GraphQL:** When using a CMS that supports GraphQL (like Hygraph), use GraphQL queries to fetch only the data you need.  This can improve performance and reduce data transfer.

### 2.3 Routing

-   **File-Based Routing:**  Use Astro's file-based routing to create routes automatically.  Follow a consistent naming convention for your pages.
-   **Dynamic Routes:** Use dynamic routes (e.g., `[slug].astro`) to handle variable segments in the URL.  Access the route parameters using `Astro.params`.
-   **Nested Routes:** Use nested folders within `src/pages/` to create nested routes.
-   **Anti-pattern: Overly Complex Routing:**  Avoid creating overly complex routing structures.  Keep your routes simple and intuitive.

### 2.4 Styling

-   **Scoped CSS:**  Use scoped CSS within Astro components to avoid style conflicts.  This ensures that component styles are isolated.
-   **Global Styles:**  Use global styles for site-wide styling.  Store global styles in `src/styles/global.css`.
-   **CSS Frameworks:** Use CSS frameworks like Tailwind CSS, Bootstrap, or Materialize to speed up development and maintain a consistent look and feel. Install the appropriate integration for your chosen CSS framework.
-   **CSS Modules:** Consider using CSS Modules for component-specific styling.  CSS Modules generate unique class names to avoid naming collisions.

## 3. Performance Considerations

### 3.1 Minimizing JavaScript

-   **Static-First Architecture:**  Embrace Astro's static-first architecture to minimize JavaScript and improve performance.  Render as much as possible as static HTML.
-   **Island Architecture:**  Only hydrate interactive components.  Avoid over-hydrating components.
-   **Code Splitting:**  Use code splitting to break up your JavaScript into smaller chunks.  This can improve initial load times.
-   **Lazy Loading:**  Use lazy loading for images and other assets that are not immediately visible.  This can improve initial load times.

### 3.2 Image Optimization

-   **Astro's `<Image />` Component:**  Use Astro's built-in `<Image />` component to optimize images.  The `<Image />` component automatically optimizes images, resizes them, and generates responsive versions.
-   **Image Formats:**  Use modern image formats like WebP to reduce file sizes. Use AVIF for even better compression, where supported.
-   **Compression:**  Compress images to reduce file sizes.  Use tools like ImageOptim or TinyPNG.
-   **Lazy Loading:**  Use lazy loading for images that are not immediately visible.
-   **Responsive Images:**  Use responsive images to serve different image sizes based on the user's screen size.

### 3.3 Font Optimization

-   **Web Font Formats:** Use modern web font formats like WOFF2.  These formats offer better compression and performance.
-   **Font Loading:**  Use font loading strategies to avoid blocking rendering.  Consider using `font-display: swap`.
-   **Preloading:**  Preload important fonts to improve loading times.

### 3.4 Caching

-   **Browser Caching:**  Configure browser caching to cache static assets like images, fonts, and JavaScript files.  This can improve performance for returning users.
-   **CDN:**  Use a Content Delivery Network (CDN) to serve static assets from geographically distributed servers.  This can improve performance for users around the world.

## 4. Security Best Practices

### 4.1 Input Validation

-   **Validate User Input:**  Validate all user input to prevent injection attacks and other security vulnerabilities.  Use server-side validation in addition to client-side validation.
-   **Sanitize User Input:**  Sanitize user input to remove potentially malicious code.  Use a library like DOMPurify to sanitize HTML.

### 4.2 Cross-Site Scripting (XSS)

-   **Escape Output:**  Escape all output to prevent XSS attacks.  Use Astro's built-in escaping mechanisms or a library like Handlebars.js.
-   **Content Security Policy (CSP):**  Implement a Content Security Policy (CSP) to control the resources that the browser is allowed to load.  This can help prevent XSS attacks.

### 4.3 Cross-Site Request Forgery (CSRF)

-   **CSRF Tokens:**  Use CSRF tokens to protect against CSRF attacks.  Generate a unique CSRF token for each user session and include it in all forms.

### 4.4 Authentication and Authorization

-   **Secure Authentication:**  Use secure authentication mechanisms to protect user accounts.  Use a library like Passport.js or Auth0.
-   **Authorization:**  Implement authorization to control access to resources.  Use roles and permissions to define what users are allowed to do.

### 4.5 Dependency Management

-   **Keep Dependencies Up-to-Date:**  Keep your dependencies up-to-date to patch security vulnerabilities.  Use a tool like `npm audit` or `yarn audit` to identify and fix vulnerabilities.
-   **Lock Dependencies:**  Lock your dependencies to prevent unexpected changes.  Use `package-lock.json` or `yarn.lock`.

### 4.6 Environment Variables

-   **Store Secrets Securely:**  Store secrets like API keys and database passwords in environment variables.  Do not hardcode secrets in your code.
-   **Avoid Committing `.env`:**  Never commit your `.env` file to version control.  Use a `.gitignore` file to exclude it.

## 5. Testing Approaches

### 5.1 Unit Testing

-   **Test Individual Components:**  Write unit tests to test individual components in isolation.  Use a testing framework like Jest or Mocha.
-   **Mock Dependencies:**  Mock dependencies to isolate components during testing.

### 5.2 Integration Testing

-   **Test Component Interactions:**  Write integration tests to test how components interact with each other.  Use a testing framework like Cypress or Playwright.

### 5.3 End-to-End Testing

-   **Test User Flows:**  Write end-to-end tests to test complete user flows.  Use a testing framework like Cypress or Playwright.

### 5.4 Accessibility Testing

-   **Automated Accessibility Testing:**  Use automated accessibility testing tools to identify accessibility issues.  Use a tool like axe-core.
-   **Manual Accessibility Testing:**  Perform manual accessibility testing to ensure that your website is accessible to users with disabilities.  Use a screen reader to test your website.

## 6. Common Pitfalls and Gotchas

-   **Over-Hydration:**  Avoid over-hydrating components.  Only hydrate interactive components.
-   **Incorrect Client Directives:**  Use the correct client directives for your components.  Using the wrong client directive can lead to performance issues or unexpected behavior.
-   **Global Scope Pollution:**  Avoid polluting the global scope with JavaScript variables.  Use modules to encapsulate your code.
-   **Missing `alt` Attributes:**  Always include `alt` attributes for images.  The `alt` attribute is important for accessibility and SEO.
-   **Hardcoded Secrets:**  Never hardcode secrets in your code.  Store secrets in environment variables.
-   **Insecure Dependencies:**  Keep your dependencies up-to-date to patch security vulnerabilities.
-   **Not handling errors:** Always handle errors gracefully, especially when fetching data or interacting with external APIs.

## 7. Tooling and Environment

### 7.1 Code Editor

-   **Visual Studio Code:**  Use Visual Studio Code as your code editor.  VS Code has excellent support for Astro and other web development technologies.
-   **Astro VS Code Extension:**  Install the Astro VS Code extension for syntax highlighting, code completion, and other features.
-   **ESLint and Prettier:**  Install ESLint and Prettier for code linting and formatting.

### 7.2 Package Manager

-   **npm, Yarn, or pnpm:**  Use npm, Yarn, or pnpm as your package manager.  Choose the package manager that best suits your needs.

### 7.3 Build Tool

-   **Astro's Built-in Build Tool:**  Use Astro's built-in build tool to build your website.  The build tool automatically optimizes your code and assets.

### 7.4 Version Control

-   **Git:**  Use Git for version control.  Git allows you to track changes to your code and collaborate with other developers.
-   **GitHub, GitLab, or Bitbucket:**  Use GitHub, GitLab, or Bitbucket to host your Git repository.  These platforms provide a centralized location for managing and collaborating on code.

### 7.5 Deployment

-   **Netlify, Vercel, or Cloudflare Pages:**  Use Netlify, Vercel, or Cloudflare Pages to deploy your website.  These platforms provide easy-to-use deployment workflows and CDN integration.

By following these best practices and coding standards, you can ensure that your Astro projects are maintainable, performant, and secure.

💡 Suggested Test Inputs

Loading suggested inputs...

🎯 Community Test Results

Loading results...

📦 Package Info

Format
cursor
Type
rule
Category
cursor-rules
License
CC0-1.0

🔗 Links