Astro's integration ecosystem allows you to seamlessly add popular frameworks, UI libraries, and developer tools to your project. These official integrations provide first-class support for the tools you know and love, while maintaining Astro's performance-first philosophy.
What Are Integrations?
Integrations are official Astro packages that add new functionality to your project. They handle the complex configuration and build process details, letting you focus on building rather than setting up.
Key Benefits
- Official Support: Maintained by the Astro team
- Type Safety: Full TypeScript support out of the box
- Optimized Performance: Built with Astro's performance goals in mind
- Easy Configuration: Minimal setup required
Popular Integrations
UI Framework Integrations
React Integration
Add React components to your Astro project:
npx astro add reactThis command:
- 1Installs necessary dependencies
- 2Updates
astro.config.mjs - 3Creates a React-specific configuration file
// astro.config.mjs
import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
export default defineConfig({
integrations: [react()],
});Use React components:
---
import MyReactComponent from '../components/MyReactComponent.jsx';
---
<div>
<h1>Astro + React</h1>
<MyReactComponent client:load />
</div>Vue Integration
npx astro add vueimport vue from '@astrojs/vue';
export default defineConfig({
integrations: [vue()],
});Svelte Integration
npx astro add svelteimport svelte from '@astrojs/svelte';
export default defineConfig({
integrations: [svelte()],
});Styling Integrations
Tailwind CSS
Tailwind CSS provides utility-first styling with excellent DX:
npx astro add tailwindCreate tailwind.config.mjs:
export default {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
theme: {
extend: {},
},
plugins: [],
};Use Tailwind classes:
<div class="bg-blue-500 text-white p-4 rounded-lg">
<h1 class="text-2xl font-bold">Hello Tailwind!</h1>
</div>Sass/SCSS
npm install sassNo configuration needed. Use .scss files:
---
import styles from '../styles/main.scss';
---
<link rel="stylesheet" href={styles} />Performance Integrations
Image Optimization
Automatically optimize images:
npx astro add imageimport { defineConfig } from 'astro/config';
import react from '@astrojs/react';
import tailwind from '@astrojs/tailwind';
import { imagetools } from 'vite-imagetools';
export default defineConfig({
integrations: [react(), tailwind()],
vite: {
plugins: [imagetools()],
},
});Use the Image component:
---
import { Image } from 'astro:assets';
import myImage from '../assets/photo.jpg';
---
<Image
src={myImage}
alt="Description"
width={800}
height={600}
format="webp"
loading="lazy"
/>SEO and Analytics
Sitemap Integration
Generate XML sitemaps automatically:
npm install @astrojs/sitemapimport sitemap from '@astrojs/sitemap';
export default defineConfig({
site: 'https://example.com',
integrations: [sitemap()],
});Partytown
Run third-party scripts in web workers:
npx astro add partytownimport partytown from '@astrojs/partytown';
export default defineConfig({
integrations: [
partytown({
config: {
forward: ['dataLayer.push'],
},
}),
],
});Deployment Integrations
Vercel
Deploy to Vercel with automatic optimization:
npm install @astrojs/vercelimport vercel from '@astrojs/vercel';
export default defineConfig({
output: 'server',
adapter: vercel(),
});Netlify
npm install @astrojs/netlifyimport netlify from '@astrojs/netlify';
export default defineConfig({
output: 'server',
adapter: netlify(),
});Cloudflare
npm install @astrojs/cloudflareimport cloudflare from '@astrojs/cloudflare';
export default defineConfig({
output: 'server',
adapter: cloudflare(),
});Advanced Configuration
Multiple Frameworks
Use React, Vue, and Svelte together:
import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
import vue from '@astrojs/vue';
import svelte from '@astrojs/svelte';
export default defineConfig({
integrations: [
react(),
vue(),
svelte(),
],
});Integration Options
Configure integrations with options:
import react from '@astrojs/react';
import tailwind from '@astrojs/tailwind';
export default defineConfig({
integrations: [
react({
jsxRuntime: 'automatic',
jsxImportSource: 'react',
}),
tailwind({
applyBaseStyles: false,
}),
],
});Conditional Integrations
Enable integrations based on environment:
import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
export default defineConfig({
integrations: process.env.DISABLE_REACT ? [] : [react()],
});Creating Custom Integrations
Basic Integration
export default function myPlugin() {
return {
name: 'my-plugin',
hooks: {
'astro:build:done': () => {
console.log('Build complete!');
},
},
};
}Vite Plugin Integration
Use Vite plugins:
import myVitePlugin from 'my-vite-plugin';
export default defineConfig({
vite: {
plugins: [myVitePlugin()],
},
});Best Practices
1. Use Official Integrations
Prefer official Astro integrations over manual setup:
# Good
npx astro add tailwind
# Avoid manual configuration
npm install tailwindcss2. Keep Integrations Minimal
Only install integrations you actually use:
// Good - only what you need
export default defineConfig({
integrations: [react(), tailwind()],
});
// Avoid - unnecessary integrations
export default defineConfig({
integrations: [
react(),
vue(),
svelte(),
solid(),
tailwind(),
sass(),
],
});3. Configure for Production
Set appropriate options for each environment:
export default defineConfig({
integrations: [
partytown({
// Disable in development
enabled: import.meta.env.PROD,
}),
],
});4. Test Integration Compatibility
Some integrations may conflict. Test thoroughly:
// Be careful with multiple CSS solutions
// Bad: Tailwind + Sass may conflict
export default defineConfig({
integrations: [tailwind(), sass()],
});5. Monitor Bundle Size
Each integration adds to your bundle. Use source map explorer:
npm run build -- --analyzeCommon Integration Patterns
Authentication
Use Auth.js with Astro:
import auth from '@astrojs/auth';
export default defineConfig({
integrations: [
auth({
providers: [
// Configure providers
],
}),
],
});Database Connections
Use server-side data fetching:
---
const { data } = await fetch('https://api.example.com/posts')
.then(res => res.json());
---
<div>
{data.map(post => (
<div>{post.title}</div>
))}
</div>Internationalization
Use astro-i18next:
npm install astro-i18nextimport i18next from 'astro-i18next';
export default defineConfig({
integrations: [i18next()],
});Troubleshooting
Integration Conflicts
If integrations conflict, check:
- 1Order of integrations: Some integrations need to be loaded first
- 2Version compatibility: Ensure versions are compatible
- 3Configuration conflicts: Check for overlapping options
Build Errors
Common issues:
- 1Missing dependencies: Run
npm install - 2Type errors: Update TypeScript types
- 3Build timeout: Increase build timeout in deployment settings
Conclusion
Astro integrations provide a powerful, flexible way to extend your project's capabilities. By leveraging these official packages, you can add sophisticated features while maintaining Astro's performance benefits.
The key is to use integrations judiciously—only adding what you need—and configuring them appropriately for your use case. With the right combination of integrations, you can build virtually any type of website while maintaining excellent performance.
Next up: Learn about Astro's server-side rendering capabilities.