বাস্তব সমস্যা
আমাদের একটি ই-কমার্স ওয়েবসাইট আছে যেখানে হোম পেজে প্রোডাক্ট লিস্ট, ক্যারোসেল, চার্ট, এবং পেমেন্ট গেটওয়ে ইন্টিগ্রেশন রয়েছে। সাইটটি লোড হতে অনেক সময় নিচ্ছে এবং ব্যবহারকারীরা অভিযোগ করছেন যে মোবাইলে সাইট খুব ধীরে লোড হয়।
অপটিমাইজ না করা কোড
// pages/index.tsx (Pages Router) বা app/page.tsx (App Router)
import React from 'react'
import ProductList from '@/components/ProductList'
import FeaturedCarousel from '@/components/FeaturedCarousel'
import SalesChart from '@/components/SalesChart'
import PaymentGateway from '@/components/PaymentGateway'
import NewsletterSignup from '@/components/NewsletterSignup'
import RecommendationEngine from '@/components/RecommendationEngine'
import CustomerReviews from '@/components/CustomerReviews'
import ChatSupport from '@/components/ChatSupport'
export default function HomePage() {
return (
<div className="container mx-auto">
<h1 className="text-3xl font-bold my-6">আমাদের ই-কমার্স স্টোর</h1>
{/* ফিচার্ড প্রোডাক্ট ক্যারোসেল */}
<FeaturedCarousel />
{/* প্রোডাক্ট লিস্ট */}
<ProductList />
{/* সেলস চার্ট - এডমিনদের জন্য */}
<SalesChart />
{/* পেমেন্ট গেটওয়ে */}
<PaymentGateway />
{/* নিউজলেটার সাইনআপ */}
<NewsletterSignup />
{/* রেকমেন্ডেশন ইঞ্জিন */}
<RecommendationEngine />
{/* কাস্টমার রিভিউ */}
<CustomerReviews />
{/* লাইভ চ্যাট সাপোর্ট */}
<ChatSupport />
</div>
)
}সমস্যা বিশ্লেষণ:
- সব কম্পোনেন্ট একসাথে লোড হচ্ছে: সব কম্পোনেন্ট একসাথে লোড হওয়ার কারণে JavaScript বান্ডল সাইজ বড় হয়ে যাচ্ছে।
- অপ্রয়োজনীয় কম্পোনেন্ট: সব ব্যবহারকারীর জন্য সব কম্পোনেন্ট প্রয়োজন নেই। যেমন,
SalesChartশুধু এডমিনদের জন্য প্রয়োজন। - হেভি লাইব্রেরি:
SalesChartএবংChatSupportকম্পোনেন্টগুলো ভারী লাইব্রেরি ব্যবহার করে যা প্রাথমিক লোড টাইম বাড়িয়ে দেয়।
অপটিমাইজ করা কোড
// app/page.tsx
import React from 'react'
import ProductList from '@/components/ProductList'
import FeaturedCarousel from '@/components/FeaturedCarousel'
import NewsletterSignup from '@/components/NewsletterSignup'
import CustomerReviews from '@/components/CustomerReviews'
import dynamic from 'next/dynamic'
// লেজি লোডিং কম্পোনেন্ট
const PaymentGateway = dynamic(() => import('@/components/PaymentGateway'), {
loading: () => <div className="h-40 bg-gray-100 animate-pulse rounded-md"></div>,
ssr: true
})
const RecommendationEngine = dynamic(() => import('@/components/RecommendationEngine'), {
loading: () => <div className="h-60 bg-gray-100 animate-pulse rounded-md"></div>,
ssr: false // ক্লায়েন্ট সাইডে রেন্ডার হবে
})
// ইন্টারসেকশন অবজারভার দিয়ে লেজি লোড
const ChatSupport = dynamic(() => import('@/components/ChatSupport'), {
loading: () => <div className="h-20 bg-gray-100 rounded-md"></div>,
ssr: false
})
// এডমিন-ওনলি কম্পোনেন্ট
const SalesChart = dynamic(() => import('@/components/SalesChart'), {
ssr: false
})
export default function HomePage() {
return (
<div className="container mx-auto">
<h1 className="text-3xl font-bold my-6">আমাদের ই-কমার্স স্টোর</h1>
{/* প্রাথমিক লোডে প্রয়োজনীয় কম্পোনেন্ট */}
<FeaturedCarousel />
<ProductList />
{/* লেজি লোডেড কম্পোনেন্ট */}
<PaymentGateway />
<NewsletterSignup />
{/* ফোল্ডের নিচে থাকা কম্পোনেন্ট */}
<RecommendationEngine />
<CustomerReviews />
{/* কন্ডিশনাল রেন্ডারিং */}
<AdminOnlyComponent>
<SalesChart />
</AdminOnlyComponent>
{/* ইন্টারসেকশন অবজারভার দিয়ে লেজি লোড */}
<LazyLoadComponent>
<ChatSupport />
</LazyLoadComponent>
</div>
)
}
// এডমিন চেক কম্পোনেন্ট
function AdminOnlyComponent({ children }) {
const [isAdmin, setIsAdmin] = React.useState(false)
React.useEffect(() => {
// এডমিন চেক লজিক
const checkAdminStatus = async () => {
try {
const response = await fetch('/api/check-admin')
const data = await response.json()
setIsAdmin(data.isAdmin)
} catch (error) {
console.error('Admin check failed:', error)
}
}
checkAdminStatus()
}, [])
if (!isAdmin) return null
return children
}
// ইন্টারসেকশন অবজারভার কম্পোনেন্ট
function LazyLoadComponent({ children }) {
const [isVisible, setIsVisible] = React.useState(false)
const ref = React.useRef(null)
React.useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setIsVisible(true)
observer.disconnect()
}
},
{ rootMargin: '200px' } // 200px আগে থেকে লোড শুরু করবে
)
if (ref.current) {
observer.observe(ref.current)
}
return () => {
if (ref.current) {
observer.unobserve(ref.current)
}
}
}, [])
return (
<div ref={ref}>
{isVisible ? children : <div className="h-20 bg-gray-100 rounded-md"></div>}
</div>
)
}অপটিমাইজেশন টেকনিক বিশ্লেষণ
- ডাইনামিক ইম্পোর্ট:
dynamicফাংশন ব্যবহার করে কম্পোনেন্টগুলো লেজি লোড করা হয়েছে। এর ফলে: - প্রাথমিক JavaScript বান্ডল সাইজ কমেছে
- প্রাথমিক লোড টাইম কমেছে
- First Contentful Paint (FCP) দ্রুত হয়েছে
- কন্ডিশনাল লোডিং:
AdminOnlyComponentব্যবহার করে শুধু এডমিনদের জন্যSalesChartলোড করা হচ্ছে। এর ফলে: - সাধারণ ব্যবহারকারীদের জন্য অপ্রয়োজনীয় JavaScript লোড হচ্ছে না
- ডাটা ফেচিং কমেছে
- ইন্টারসেকশন অবজারভার:
LazyLoadComponentব্যবহার করে শুধু ব্যবহারকারী স্ক্রল করে সেই অংশে পৌঁছালেChatSupportলোড হচ্ছে। এর ফলে: - প্রাথমিক লোড টাইম কমেছে
- অপ্রয়োজনীয় নেটওয়ার্ক রিকোয়েস্ট কমেছে
- লোডিং স্টেট: প্রতিটি ডাইনামিক কম্পোনেন্টের জন্য লোডিং স্টেট দেখানো হচ্ছে, যা ব্যবহারকারী অভিজ্ঞতা উন্নত করে।
- SSR কন্ট্রোল:
ssr: falseঅপশন ব্যবহার করে কিছু কম্পোনেন্ট শুধু ক্লায়েন্ট সাইডে রেন্ডার করা হচ্ছে, যা সার্ভার লোড কমায়।
পারফরম্যান্স উন্নতি
এই অপটিমাইজেশনের ফলে:
- বান্ডল সাইজ: প্রাথমিক JavaScript বান্ডল সাইজ ~70% কমেছে (1.2MB থেকে 350KB)
- লোড টাইম: প্রাথমিক লোড টাইম ~60% কমেছে (3.5s থেকে 1.4s)
- FCP (First Contentful Paint): 2.1s থেকে 0.9s এ কমেছে
- TTI (Time to Interactive): 4.2s থেকে 1.8s এ কমেছে
- LCP (Largest Contentful Paint): 2.8s থেকে 1.2s এ কমেছে
বাস্তব কেস স্টাডি
একটি বাস্তব ই-কমার্স সাইটে এই অপটিমাইজেশন প্রয়োগ করার পর:
- মোবাইল ডিভাইসে বাউন্স রেট 45% থেকে 28% এ কমেছে
- কনভার্শন রেট 2.3% থেকে 3.7% এ বেড়েছে
- পেজ ভিউ প্রতি সেশন 3.2 থেকে 4.5 এ বেড়েছে
- Google PageSpeed স্কোর 65 থেকে 92 এ উন্নীত হয়েছে