Next.js Static Site Generation (SSG) with getStaticProps: Sinhala Tutorial | Next.js SSG SC Guide
Next.js Static Site Generation (SSG) with getStaticProps SC Guide
ආයුබෝවන් යාළුවනේ! අද අපි කතා කරන්න යන්නේ Next.js Framework එකේ තියෙන හරිම වැදගත් සහ ප්රයෝජනවත් සංකල්පයක් ගැන – ඒ තමයි Static Site Generation (SSG). විශේෂයෙන්ම, මේකට අපි පාවිච්චි කරන getStaticProps කියන function එක ගැන අපි විස්තරාත්මකව බලමු. ඔයාලට දැනටමත් Next.js ගැන පොඩි අදහසක් තියෙනවා නම්, මේක තවත් පහසු වෙයි. නැතත්, ගැටළුවක් නෑ! අපි මුල සිටම පටන් ගමු.
වෙබ් අඩවි හදනකොට, Performance සහ SEO (Search Engine Optimization) කියන දේවල් හරිම වැදගත්. Next.js වගේ React Framework එකකින් මේ දේවල් හරි ලේසියෙන් කරගන්න පුළුවන්. ඒකට තියෙන ප්රධානම ක්රමයක් තමයි මේ Static Site Generation (SSG) කියන්නේ.
අද මේ ලිපියෙන් අපි සාකච්ඡා කරන දේවල්:
- Static Site Generation (SSG) කියන්නේ මොකක්ද? (
build timeඑකේදීpre-renderingකරන හැටි) getStaticPropsකියන්නේ මොකක්ද? මේක කවදද පාවිච්චි කරන්නේ? කොහොමද වැඩ කරන්නේ?getStaticPropsපාවිච්චි කරලාdata fetchකරලාpageඑකකටrenderකරන හැටි. (ප්රායෝගික උදාහරණයක්)troubleshooting tipsසහbest practices.
එහෙනම්, අපි පටන් ගමු!
1. Static Site Generation (SSG) යනු කුමක්ද?
සරලවම කියනවා නම්, Static Site Generation (SSG) කියන්නේ අපේ වෙබ් අඩවියේ pages ටික build කරන වෙලාවේදී (build time) සම්පූර්ණයෙන්ම HTML files විදිහට හදන ක්රමවේදයක්. සාමාන්යයෙන් වෙබ් page එකක් user කෙනෙක් request කරනකොට server එකෙන් dynamic විදිහට හදලා (Server-Side Rendering - SSR) නැත්නම් browser එකේදී JavaScript වලින් හදලා (Client-Side Rendering - CSR) render කරනවා. හැබැයි, SSG වලදී, page එක කලින්ම හදලා තියෙන නිසා, user request එකක් ආපු ගමන්, සකස් කරපු HTML file එක serve කරන්න පුළුවන්. හිතන්නකෝ, අපේ ගෙදරට කෙනෙක් එන්න කලින් කෑම හදලා, මේසෙට ගෙනත් තියෙනවා වගේ වැඩක්!
SSG වල වාසි මොනවාද?
- ඉහළ Performance:
pagesකලින්ම හැදලා තියෙන නිසා,userකෙනෙක් ඉල්ලුවමserverඑකට අලුතින්pageඑකක් හදන්න වෙලාවක් යන්නේ නෑ. HTML file එක කෙලින්මserveකරන්න පුළුවන්. මේකෙන්loading timeඑක ගොඩක් අඩු වෙනවා.උදා: Blog posts, documentation, marketing pages. - හොඳ SEO:
Search engines(ගූගල් වගේ) අපේpageඑකට ආවම, සම්පූර්ණ HTMLcontentඑකම ඒ අයට ගන්න පුළුවන්.JavaScript renderවෙනකන් ඉන්න ඕනේ නෑ. මේකෙන්search engine rankingsවැඩි කරගන්න පුලුවන්. - අඩු Server Load:
pageඑකක්requestකරන හැම වෙලාවකමserverඑකටcode executeකරන්න අවශ්ය වෙන්නේ නෑ. ඒ නිසාserverඑකට එනloadඑක අඩු වෙනවා. මේකtrafficගොඩක් තියෙනwebsitesවලට හරිම ප්රයෝජනවත්. - වැඩි Security:
server-sideඑකේruntimeඑකක් නැති නිසා,server-side attacksවලට තියෙන අවස්ථා අඩුයි. - CDN හරහා Scalability: හැදූ HTML files
Content Delivery Network (CDN)එකකcacheකරන්න පුළුවන්. මේකෙන්usersලා කොහේ හිටියත්, ඒ අයට ලඟම තියෙනserverඑකෙන්contentඑක ලැබෙනවා.
2. getStaticProps විස්තරාත්මකව
getStaticProps කියන්නේ Next.js වල තියෙන asynchronous function එකක්. මේක අපිට පුලුවන් අපේ Next.js page එකක component එකක් export කරනවා වගේම export කරන්න. මේ function එකේ ප්රධානම විශේෂත්වය තමයි, මේක build time එකේදී, server-side එකේ විතරක් execute වෙන එක. client-side එකේදී කවදාවත් execute වෙන්නේ නෑ. ඒ කියන්නේ, user කෙනෙක් අපේ වෙබ් අඩවියට ආවට පස්සේ, මේ function එක නැවත run වෙන්නේ නෑ.
getStaticProps කවදාද පාවිච්චි කරන්නේ?
getStaticProps භාවිතා කරන්න පුළුවන් හොඳම අවස්ථා:
- Data ඒ තරම් නිතර වෙනස් නොවන විට: Blog posts, products, documentation, portfolios වගේ දේවල් වලට මේක හරිම ගැළපෙනවා. මේවා නිතර
updateවෙන්නේ නෑනේ. - Data publicly available නම්:
User-specificනොවන (ඒ කියන්නේ හැමෝටම එකම දත්ත පෙන්වන)dataවලට. - SEO ඉතා වැදගත් නම්:
Search enginesවලට අවශ්ය සියලු දත්ත HTMLcontentඑකේම තියෙන නිසාrankingවැඩි කරගන්න පුළුවන්.
getStaticProps කොහොමද වැඩ කරන්නේ?
ඔයාලා Next.js project එක build කරනකොට (npm run build හෝ yarn build) Next.js විසින් getStaticProps function එක තියෙන හැම page එකක්ම හඳුනාගෙන, ඒ function එක execute කරනවා. මේ function එකෙන් return කරන object එකේ props කියන key එකට අදාළ data එක අපි අපේ page component එකට props විදිහට ලබා දෙනවා. ඊට පස්සේ Next.js ඒ data පාවිච්චි කරලා, page එක pre-render කරලා HTML file එකක් විදිහට export කරනවා.
// pages/index.js (උදාහරණයක්)
export async function getStaticProps() {
// මෙතන තමයි data fetch කරන්නේ
// මේ code එක run වෙන්නේ server එකේ build කරන වෙලාවේදී විතරයි
const res = await fetch('https://api.example.com/posts');
const posts = await res.json();
// return කරන object එකේ props කියන key එකට data එක දෙන්න ඕනෙ
return {
props: {
posts, // page component එකට posts කියන prop එක යනවා
},
};
}
function HomePage({ posts }) {
// මෙතනදී posts කියන data එක component එකට ලැබිලා තියෙන්නේ
return (
<div>
<h1>අපේ Blog Posts</h1>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
export default HomePage;
මේ code එක හොඳට බැලුවොත් තේරෙයි, getStaticProps කියන function එක page component එකට උඩින් export කරලා තියෙනවා. මේක හැම විටම async විය යුතුයි.
3. ප්රායෝගික උදාහරණයක්: getStaticProps භාවිතා කර Data Fetch කර Page එකක Render කිරීම
දැන් අපි බලමු getStaticProps පාවිච්චි කරලා API එකකින් data fetch කරලා අපේ Next.js page එකක render කරන්නේ කොහොමද කියලා. මේකට අපි JSONPlaceholder කියන fake online REST API එක පාවිච්චි කරමු. මේක demo කරන්න හරිම පහසුයි.
මුලින්ම, අලුත් Next.js project එකක් හදාගමු (නැත්නම් දැනට තියෙන එකක් පාවිච්චි කරන්න පුළුවන්):
npx create-next-app my-ssg-app
cd my-ssg-app
npm run dev
දැන් pages folder එක ඇතුලට ගිහින් අලුත් file එකක් හදමු: pages/posts.js කියලා.
3.1. දත්ත ලබා ගැනීම (Fetching Data)
pages/posts.js file එක ඇතුලට පහත code එක එකතු කරන්න:
// pages/posts.js
import React from 'react';
// මේක තමයි අපේ Page Component එක
function Posts({ posts }) {
return (
<div style={{ padding: '20px' }}>
<h1>අපේ Latest Posts</h1>
<p>මේ posts ටික build කරන වෙලාවේදී fetch කරපු data.</p>
<ul>
{posts.map(post => (
<li key={post.id} style={{ marginBottom: '15px', border: '1px solid #eee', padding: '10px', borderRadius: '5px' }}>
<h3 style={{ margin: '0 0 5px 0', color: '#333' }}>{post.title}</h3>
<p style={{ margin: '0', color: '#666' }}>{post.body}</p>
</li>
))}
</ul>
</div>
);
}
// getStaticProps function එක
// මේක run වෙන්නේ build කරන වෙලාවේදී server side එකේ විතරයි
export async function getStaticProps() {
console.log('getStaticProps is running on the server at build time!');
// API එකකින් data fetch කරනවා
const res = await fetch('https://jsonplaceholder.typicode.com/posts?_limit=10');
const posts = await res.json();
// return කරන object එකේ props කියන key එකට data එක දෙනවා
return {
props: {
posts, // මේ posts array එක page component එකට prop එකක් විදිහට යනවා
},
};
}
export default Posts;
3.2. දත්ත Page එකේ පෙන්වීම (Rendering Data on the Page)
උඩ තියෙන code එකේදී ඔයාලට පේනවා ඇති, getStaticProps function එකෙන් posts කියන array එක props විදිහට return කරනවා. Posts කියන page component එක posts කියන prop එක destructure කරලා ගන්නවා. ඊට පස්සේ JSX එක ඇතුලේ map function එක පාවිච්චි කරලා හැම post එකක්ම list item එකක් විදිහට render කරනවා.
දැන් ඔයාලගේ project එක build කරලා බලමු. terminal එකේ මේ command එක දෙන්න:
npm run build
මේ command එක execute කරනකොට console එකේ 'getStaticProps is running on the server at build time!' කියලා message එකක් පෙන්වයි. ඒ කියන්නේ අපේ getStaticProps function එක build time එකේදී run වුණා කියන එක. ඊට පස්සේ, build එක ඉවර වුණාම start කරන්න:
npm run start
දැන් browser එකේ http://localhost:3000/posts කියන URL එකට ගිහින් බලන්න. ඔයාලට posts ටික render වෙලා පෙනෙයි! මේ page එක සම්පූර්ණයෙන්ම HTML විදිහට pre-rendered වෙලා තියෙන්නේ.
4. වැදගත් කරුණු සහ ගැටළු විසඳීම (Important Considerations & Troubleshooting)
revalidate option එක (Incremental Static Regeneration - ISR)
getStaticProps වලින් හැදෙන pages සාමාන්යයෙන් build එකක් කරනකම් update වෙන්නේ නෑ. හැබැයි, අපිට data පොඩ්ඩක් වෙනස් වෙන pages වලටත් SSG වල වාසි ගන්න පුළුවන්. ඒකට තමයි revalidate කියන option එක තියෙන්නේ. මේක getStaticProps එකේ return කරන object එකට එකතු කරන්න පුළුවන්:
export async function getStaticProps() {
// ... data fetch ...
return {
props: {
posts,
},
revalidate: 60, // සෑම තත්පර 60කට වරක් page එක re-generate කරන්න
};
}
මේකෙන් වෙන්නේ, user request එකක් ආවම, page එක cache එකෙන් serve කරන ගමන්, background එකේදී අලුත් data තියෙනවද කියලා බලලා, cache එක update කරන එක. මේක Incremental Static Regeneration (ISR) කියලා හඳුන්වනවා.
ගැටළු විසඳීම (Troubleshooting)
- Build Errors:
npm run buildකරනකොටerrorඑනවා නම්,terminalඑකේlogsහොඳට බලන්න. ගොඩක් වෙලාවටnetworkerrors,API endpointඑකේ වැරදි, නැත්නම්codeඑකේsyntax errorsවෙන්න පුළුවන්. - Console Logs:
getStaticPropsඑක ඇතුලේconsole.log()පාවිච්චි කරන්න පුළුවන්debuggingකරන්න. මේlogsපෙන්වන්නේbuildකරන වෙලාවේterminalඑකේ මිසක්browser consoleඑකේ නෙවෙයි. - Incorrect Data Paths:
APIඑකෙන් එනdata structureඑකට හරියටම ගැලපෙන්නpropsවලටdata accessකරනවාද කියලා බලන්න.
5. හොඳම පුරුදු සහ පොදු වැරදි (Best Practices & Common Pitfalls)
- නිතර වෙනස් නොවන දත්ත සඳහා පමණක් භාවිතා කරන්න:
real-time chat messages,user-specific dashboardsවගේ නිතරupdateවෙනdataවලටgetStaticPropsපාවිච්චි කරන්න එපා. ඒ වගේ දේවල් වලටClient-Side Rendering (CSR)හෝServer-Side Rendering (SSR)වඩා හොඳයි. getStaticPropsclient-sideඑකේexecuteවෙන්නේ නෑ: මේක මතක තියාගන්න. ඒ නිසාbrowser-specific API(window,documentවගේ) මේfunctionඑක ඇතුලේ පාවිච්චි කරන්න බෑ.getStaticPropsasyncවිය යුතුයි: හැම විටමasync functionඑකක් විදිහටdefineකරන්න. මේකrequiredඑකක්.- ලොකු
data setඑකක් නම් අවධානය යොමු කරන්න: ගොඩක් විශාලdata setඑකක්fetchකරනවා නම්build timeඑක වැඩි වෙන්න පුළුවන්.pagination,infinite scrollingවගේtechniquesපාවිච්චි කරන්න පුළුවන්. - හැම විටම
propskeyඑකreturnකරන්න:getStaticPropsreturnකරනobjectඑකේpropsකියනkeyඑක අනිවාර්යයෙන්ම තිබිය යුතුයි.
නිගමනය
ඉතින් යාළුවනේ, අපි Next.js වල තියෙන Static Site Generation (SSG) සහ ඒකට පාවිච්චි කරන getStaticProps function එක ගැන සම්පූර්ණයෙන් ඉගෙන ගත්තා. මේ feature එක performance, SEO සහ scalability අතින් විශාල වාසි ලබා දෙනවා. Blog posts, product catalogs (නිතර වෙනස් නොවන), documentation වගේ websites හදනකොට getStaticProps කියන්නේ ඔයාලට තියෙන හොඳම tool එකක්.
Next.js මේ වගේ pre-rendering options ලබා දීම නිසා, අපිට web applications හදනකොට අපේ අවශ්යතාවයට අනුව හොඳම rendering strategy එක තෝරාගන්න පුළුවන්. මේකෙන් developers ලට වගේම users ලටත් ලොකු පහසුවක් සැලසෙනවා.
ඔයාලත් අදම මේක Try කරලා බලන්න. ඔයාලගේ Next.js project එකක getStaticProps පාවිච්චි කරලා static content එකක් render කරන්න. මොනවා හරි ප්රශ්න තියෙනවා නම්, comment section එකේ අහන්න පසුබට වෙන්න එපා. අපි උදව් කරන්න සූදානම්! එහෙනම් තවත් අලුත් tech topic එකකින් හමුවෙමු!