SaaS Landing Page
Optimized conversion funnels with component composition, SSG/ISR, and accessible form layouts built for maximum performance.
01
Principle
Landing pages must be statically generated for SEO and performance. Use a section-based component architecture where each section is an independent, lazily-loaded unit. Avoid client-side data fetching for above-the-fold content.
lightbulb
Use ISR (Incremental Static Regeneration) for pricing and content sections that update occasionally without requiring a full rebuild.
02
Rules
- check_circleAtomic Section ComponentsEach section (Hero, Features, Pricing) is a standalone component with no shared state.
- check_circleMobile-First CSSDesign for 375px first. Scale up with sm:, md:, lg: breakpoints.
- check_circleStatic GenerationUse generateStaticParams or SSG — never getServerSideProps — for landing pages.
- check_circleLazy Load Below FoldDynamically import sections below the fold to reduce initial bundle size.
03
Pattern
components/landing/SectionFactory.tsx
import dynamic from 'next/dynamic'; const SECTIONS = { hero: dynamic(() => import('./HeroSection')), features: dynamic(() => import('./FeaturesSection')), pricing: dynamic(() => import('./PricingSection')), } as const; export function SectionFactory({ type, props }: SectionProps) { const Section = SECTIONS[type]; return <Section {...props} />; }
04
Implementation
info
Version Compatibility
Requires React 19+ and the latest stable versions of all dependencies shown.
Use Next.js static generation with revalidation for dynamic pricing data while keeping the page fast.
app/page.tsx
export const revalidate = 3600; // ISR: revalidate hourly export default async function LandingPage() { const pricing = await fetchPricingPlans(); return ( <> <HeroSection /> <FeaturesSection /> <PricingSection plans={pricing} /> <CTASection /> </> ); }