aicode8
Hands-onUpdated: 2026-09-08

Astro best practices: engineering conventions for production

Field-tested Astro practices from production, avoiding the common anti-patterns.

On this page

Quick answer

Which Astro version stabilized @tailwindcss/vite integration?

Astro 5 officially recommends the @tailwindcss/vite plugin over the legacy PostCSS pipeline. Before upgrading, lock the major versions of astro and tailwind together so the new plugin does not silently ignore v3 config.

Machine-readable page data: /data/astro-best-practices.json

In-depth analysis

Astro's Islands Architecture ships zero client-side JavaScript by default and pushes first-paint performance to the limit; content sites use it to pre-render static HTML at build time and serve it directly from edge nodes. Production engineering conventions revolve around "single source of truth + explicit boundaries", steering clear of the common anti-patterns.

Astro · Config example
// astro.config.mjs — static SSG + Cloudflare Pages edge delivery
import { defineConfig } from 'astro/config';
import tailwindcss from '@tailwindcss/vite';

export default defineConfig({
  site: 'https://aicode8.com',
  output: 'static',
  vite: { plugins: [tailwindcss()] },
});
Best practices:One package manager (pnpm), lockfile in version control. Secrets stay as placeholders — docs and code stay cleanly separated.
Pitfalls:Components are pure HTML by default. Add an explicit client directive (client:*) only when you actually need interactivity — otherwise the reactive logic is never bundled and silently does nothing. Lock the package manager to one choice (pnpm), commit the lockfile, and never mix npm/yarn.

Astro Best Practices · Key takeaways

  • Config centralized in a single source
  • CI uses --frozen-lockfile
  • Secrets are placeholders, never real values in code
  • Docs and code live in separate places

FAQ & pitfalls

How do I invalidate cache after deploying an Astro static site to Cloudflare Pages?

Each git commit triggers an atomic rebuild that replaces the full static output as a whole. Set HTML to must-revalidate and static assets to immutable long cache — no manual CDN purge required.

Share & save

My shelf0
← Back to homeTopic: Astro Best Practices

What readers are asking

Questions that keep coming back in reader feedback, already answered.

  1. 01
    Why is my Astro component's interactivity not working?

    Components ship as zero-JS HTML by default, so an interactive one needs a client:* directive (client:load, client:visible, …). Without it the script is never bundled into the page.

    See the full guide →
  2. 02
    Which Astro version supports the @tailwindcss/vite integration reliably?

    Astro 5 and later officially recommend the @tailwindcss/vite plugin over the old PostCSS route. Pin the astro and tailwind major versions before upgrading, or the new plugin silently ignores your v3 config.

    See the full guide →
  3. 03
    Why is my custom Tailwind v4 brand colour not applied?

    Colours must be declared in @theme (for example --color-brand). A missing @tailwindcss/vite plugin, or a leftover v3 config, makes bg-brand silently render nothing.

    See the full guide →
All questions →

Follow along as I build with AI

Get the honest, real-time record: what I build, what breaks, and what I learn — from a non-technical founder. No jargon, no fluff.

We respect your inbox. One click to unsubscribe, anytime.