For e-commerce sites, performance and SEO are the keys to sales. Next.js 15 delivers groundbreaking features in both areas. In this article, we'll take a detailed look at how to use Next.js 15 on modern e-commerce sites.
Next.js 15 New Features
1. Lightning-Fast Development with Turbopack
Performance Comparison:
// package.json
{
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack"
}
}2. Performance Boost with Server Components
Advantages:
// app/products/[id]/page.tsx
async function ProductPage({ params }: { params: { id: string } }) {
// Server-side data fetching
const product = await fetchProduct(params.id);
return (
<div>
<ProductInfo product={product} />
{/* Client component for interactivity */}
<AddToCartButton productId={product.id} />
</div>
);
}3. Gradual Rendering with Streaming SSR
User Experience:
import { Suspense } from 'react';
export default function ProductList() {
return (
<div>
<Suspense fallback={<ProductsSkeleton />}>
<Products />
</Suspense>
<Suspense fallback={<ReviewsSkeleton />}>
<Reviews />
</Suspense>
</div>
);
}4. Image Optimization 2.0
Next.js Image Component:
import Image from 'next/image';
<Image
src="/products/product-1.jpg"
alt="Product Name"
width={800}
height={600}
quality={85}
loading="lazy"
placeholder="blur"
blurDataURL="data:image/jpeg;base64,..."
/>Result: 60% smaller file size, 40% faster loading
SEO Optimization for E-Commerce
1. Metadata and Open Graph
// app/products/[slug]/page.tsx
import type { Metadata } from 'next';
export async function generateMetadata(
{ params }: { params: { slug: string } }
): Promise<Metadata> {
const product = await fetchProduct(params.slug);
return {
title: `${product.name} - Best Price | Store Name`,
description: product.description,
openGraph: {
title: product.name,
description: product.description,
images: [product.image],
type: 'product',
},
twitter: {
card: 'summary_large_image',
title: product.name,
description: product.description,
images: [product.image],
},
};
}2. Structured Data (JSON-LD)
Rich snippets for Google:
export default function ProductPage({ product }) {
const structuredData = {
"@context": "https://schema.org",
"@type": "Product",
"name": product.name,
"image": product.image,
"description": product.description,
"sku": product.sku,
"offers": {
"@type": "Offer",
"price": product.price,
"priceCurrency": "TRY",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Store Name"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": product.rating,
"reviewCount": product.reviewCount
}
};
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
/>
{/* Product content */}
</>
);
}3. Dynamic Sitemap Generation
// app/sitemap.ts
import { MetadataRoute } from 'next';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const products = await fetchAllProducts();
const productUrls = products.map((product) => ({
url: `https://example.com/products/${product.slug}`,
lastModified: product.updatedAt,
changeFrequency: 'weekly' as const,
priority: 0.8,
}));
return [
{
url: 'https://example.com',
lastModified: new Date(),
changeFrequency: 'daily',
priority: 1,
},
...productUrls,
];
}Performance Optimizations
1. Database Query Optimization
Efficient Queries with Prisma:
// lib/db/products.ts
import { prisma } from '@/lib/prisma';
export async function getProductWithRelations(slug: string) {
return await prisma.product.findUnique({
where: { slug },
include: {
category: true,
images: true,
reviews: {
take: 10,
orderBy: { createdAt: 'desc' },
include: { user: true }
},
variants: true,
},
});
}2. Redis Caching Strategy
import { Redis } from '@upstash/redis';
const redis = new Redis({
url: process.env.UPSTASH_REDIS_URL,
token: process.env.UPSTASH_REDIS_TOKEN,
});
export async function getCachedProduct(id: string) {
// Check cache first
const cached = await redis.get(`product:${id}`);
if (cached) return cached;
// Fetch from database
const product = await fetchProduct(id);
// Cache for 1 hour
await redis.setex(`product:${id}`, 3600, JSON.stringify(product));
return product;
}3. CDN and Edge Functions
Vercel Edge Functions:
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const country = request.geo?.country || 'US';
// Redirect based on country
if (country === 'TR' && !request.nextUrl.pathname.startsWith('/tr')) {
return NextResponse.redirect(new URL('/tr', request.url));
}
return NextResponse.next();
}Conversion Rate Optimization (CRO)
1. A/B Testing with Middleware
export function middleware(request: NextRequest) {
const bucket = Math.random() < 0.5 ? 'a' : 'b';
const response = NextResponse.next();
response.cookies.set('bucket', bucket);
return response;
}2. Analytics Integration
Google Analytics 4:
// app/layout.tsx
import Script from 'next/script';
export default function RootLayout({ children }) {
return (
<html>
<head>
<Script
src={`https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX`}
strategy="afterInteractive"
/>
<Script id="google-analytics" strategy="afterInteractive">
{`
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXX');
`}
</Script>
</head>
<body>{children}</body>
</html>
);
}Success Metrics
Real-World Results:
Enextware E-Commerce Solutions
Work with us to build your e-commerce site with Next.js 15:
Free Consultation: +90 536 628 0007
