Tyrinėkite Next.js statinį eksportavimą kliento pusės aplikacijoms. Sužinokite privalumus, apribojimus ir technikas, kaip sukurti greitas ir saugias svetaines.
Next.js statinis eksportavimas: tik kliento pusės aplikacijų kūrimas
Next.js yra galinga React karkaso sistema, leidžianti programuotojams kurti našias, išplečiamas ir SEO draugiškas interneto aplikacijas. Nors Next.js yra žinomas dėl savo serverio pusės generavimo (SSR) ir statinių svetainių generavimo (SSG) galimybių, jis taip pat suteikia lankstumo kurti tik kliento pusės aplikacijas naudojant statinį eksportavimą. Šis metodas leidžia jums pasinaudoti Next.js įrankių ir struktūros privalumais, diegiant grynai kliento pusės aplikaciją. Šis įrašas padės jums suprasti viską, ką reikia žinoti apie tik kliento pusės aplikacijų kūrimą su Next.js statiniu eksportavimu, aptariant privalumus, apribojimus, diegimo procesą ir pažangias technikas.
Kas yra Next.js statinis eksportavimas?
Statinis eksportavimas Next.js sistemoje reiškia procesą, kurio metu sukuriama visiškai statinė jūsų aplikacijos versija kompiliavimo metu. Tai reiškia, kad visi HTML, CSS ir JavaScript failai yra iš anksto sugeneruoti ir paruošti tiesiogiai pateikti iš statinių failų serverio (pvz., Netlify, Vercel, AWS S3 ar tradicinio interneto serverio). Skirtingai nuo serverio generuojamų aplikacijų, nereikalingas Node.js serveris gaunamoms užklausoms apdoroti. Vietoj to, visa aplikacija pateikiama kaip statinių išteklių rinkinys.
Kuriant tik kliento pusės aplikaciją, Next.js generuoja šiuos statinius išteklius, darydamas prielaidą, kad visas dinaminis elgesys bus tvarkomas kliento pusės JavaScript. Tai ypač naudinga vieno puslapio aplikacijoms (SPA), kurios daugiausia remiasi kliento pusės maršrutizavimu, API iškvietimais ir vartotojo sąveikomis.
Kodėl verta rinktis statinį eksportavimą kliento pusės aplikacijoms?
Kliento pusės aplikacijų kūrimas su Next.js statiniu eksportavimu suteikia keletą svarių privalumų:
- Geresnis našumas: Statiniai ištekliai gali būti pateikiami tiesiogiai iš CDN (turinio pristatymo tinklo), todėl greičiau įkeliami puslapiai ir pagerėja vartotojo patirtis. Nereikalingas joks serverio pusės apdorojimas, o tai sumažina delsą ir pagerina mastelį.
- Padidintas saugumas: Be serverio pusės komponento, jūsų aplikacijos pažeidžiamumo plotas yra žymiai sumažintas. Yra mažiau potencialių spragų, kurias galima išnaudoti, todėl jūsų aplikacija yra saugesnė.
- Supaprastintas diegimas: Statinės svetainės diegimas paprastai yra daug paprastesnis nei serverio generuojamos aplikacijos diegimas. Galite naudoti platų statinio talpinimo paslaugų teikėjų spektrą, iš kurių daugelis siūlo nemokamus planus arba prieinamas kainas.
- Ekonomiškas talpinimas: Statinis talpinimas paprastai yra pigesnis nei serverinis talpinimas, nes mokate tik už saugojimo vietą ir duomenų srautą.
- Geresnis SEO (su išlygomis): Nors tradiciškai kliento pusės aplikacijos turi SEO iššūkių, Next.js statinis eksportavimas tai sušvelnina iš anksto generuodamas pradinę HTML struktūrą. Tačiau dinamiškam turiniui, labai priklausomam nuo kliento pusės generavimo, vis tiek gali prireikti papildomų SEO strategijų (pvz., naudojant išankstinio generavimo paslaugą robotams).
- Programavimo patirtis: Next.js suteikia puikią programavimo patirtį su tokiomis funkcijomis kaip „hot module replacement“, greitas atnaujinimas ir integruotas maršrutizavimas, todėl lengviau kurti ir prižiūrėti sudėtingas kliento pusės aplikacijas.
Statinio eksportavimo apribojimai
Nors statinis eksportavimas siūlo daugybę privalumų, svarbu žinoti jo apribojimus:
- Serverio pusės generavimo nebuvimas: Statinis eksportavimas netinka aplikacijoms, kurioms reikalingas serverio pusės generavimas dėl SEO ar našumo priežasčių. Visas generavimas vyksta kliento pusėje.
- Ribotas dinaminis turinys: Aplikacijos, kurios labai priklauso nuo serverio pusės duomenų gavimo ar dinaminio turinio generavimo, gali netikti statiniam eksportavimui. Visi duomenų gavimo ir apdorojimo procesai turi būti tvarkomi kliento pusėje.
- SEO aspektai dinaminiam turiniui: Kaip minėta anksčiau, SEO gali būti iššūkis, jei jūsų aplikacijos turinys yra daugiausia generuojamas kliento pusėje. Paieškos sistemų robotai gali nesugebėti įvykdyti JavaScript ir tinkamai indeksuoti turinio.
- Kompiliavimo laikas: Statinės svetainės generavimas gali užtrukti ilgiau nei serverio generuojamos aplikacijos kompiliavimas, ypač dideliems ir sudėtingiems projektams.
Next.js paruošimas statiniam eksportavimui
Štai žingsnis po žingsnio vadovas, kaip paruošti Next.js statiniam eksportavimui:
1. Sukurkite naują Next.js projektą
Jei dar neturite Next.js projekto, sukurkite jį naudodami šią komandą:
npx create-next-app my-client-app
Diegimo proceso metu pasirinkite parinktis, kurios geriausiai atitinka jūsų poreikius (pvz., TypeScript, ESLint).
2. Konfigūruokite `next.config.js`
Atidarykite `next.config.js` failą savo projekto šakninėje direktorijoje ir pridėkite šią konfigūraciją:
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export',
trailingSlash: true,
// Pasirinktinai: pakeiskite nuorodas /me -> /me/ ir generuokite /me.html -> /me/index.html
// žr. https://nextjs.org/docs/app/api-reference/next-config#trailing-slash
// experimental:
// {appDir: false}
}
module.exports = nextConfig
Parinktis `output: 'export'` nurodo Next.js generuoti statinį jūsų aplikacijos eksportą. Nustatymas `trailingSlash: true` paprastai yra rekomenduojamas, siekiant užtikrinti nuoseklią URL struktūrą ir išvengti galimų SEO problemų.
3. Atnaujinkite `package.json`
Pakeiskite `scripts` skyrių savo `package.json` faile, kad įtrauktumėte kompiliavimo scenarijų statiniam eksportavimui:
{
"scripts": {
"dev": "next dev",
"build": "next build && next export",
"start": "next start",
"lint": "next lint"
}
}
Šis scenarijus pirmiausia sukompiliuos jūsų Next.js aplikaciją, o tada eksportuos ją į statinę direktoriją.
4. Įdiekite kliento pusės maršrutizavimą
Kadangi kuriate kliento pusės aplikaciją, turėsite įdiegti kliento pusės maršrutizavimą naudodami `next/router` modulį arba trečiosios šalies biblioteką, tokią kaip `react-router-dom`. Štai pavyzdys naudojant `next/router`:
import { useRouter } from 'next/router';
import Link from 'next/link';
function HomePage() {
const router = useRouter();
const handleClick = () => {
router.push('/about');
};
return (
<div>
<h1>Pradinis puslapis</h1>
<p>Sveiki atvykę į pradinį puslapį!</p>
<button onClick={handleClick}>Eiti į „Apie“ puslapį</button>
<Link href="/about">
<a>Eiti į „Apie“ puslapį (naudojant „Link“)</a>
</Link>
</div>
);
}
export default HomePage;
Nepamirškite naudoti `Link` komponento iš `next/link` vidinei navigacijai, kad užtikrintumėte sklandžius kliento pusės perėjimus.
5. Tvarkykite duomenų gavimą kliento pusėje
Kliento pusės aplikacijoje visas duomenų gavimas turi būti atliekamas kliento pusėje, naudojant technikas, tokias kaip `useEffect` arba `useState` „hooks“. Pavyzdžiui:
import { useState, useEffect } from 'react';
function DataPage() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP klaida! būsena: ${response.status}`);
}
const jsonData = await response.json();
setData(jsonData);
} catch (e) {
setError(e);
} finally {
setLoading(false);
}
}
fetchData();
}, []);
if (loading) return <p>Kraunama...</p>;
if (error) return <p>Klaida: {error.message}</p>;
if (!data) return <p>Nėra duomenų, kuriuos būtų galima rodyti</p>;
return (
<div>
<h1>Duomenų puslapis</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
export default DataPage;
6. Sukompiliuokite ir eksportuokite savo aplikaciją
Paleiskite kompiliavimo scenarijų, kad sugeneruotumėte statinį eksportą:
npm run build
Tai sukurs `out` (arba `public`, priklausomai nuo Next.js versijos) direktoriją, kurioje bus statiniai HTML, CSS ir JavaScript failai jūsų aplikacijai.
7. Įdiekite savo statinę svetainę
Dabar galite įdiegti `out` direktorijos turinį į statinio talpinimo paslaugų teikėją, pvz., Netlify, Vercel, AWS S3 ar GitHub Pages. Dauguma teikėjų siūlo paprastą „drag-and-drop“ diegimą arba komandinės eilutės įrankius procesui automatizuoti.
Pažangios technikos kliento pusės Next.js aplikacijoms
Štai keletas pažangių technikų, skirtų optimizuoti jūsų kliento pusės Next.js aplikacijas:
1. Kodo padalijimas ir vėlusis įkėlimas (Lazy Loading)
Naudokite dinaminius importus (`import()`), kad padalintumėte savo kodą į mažesnes dalis, kurios įkeliamos pagal poreikį. Tai gali žymiai pagerinti pradinį įkėlimo laiką, ypač didelėms aplikacijoms.
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function MyPage() {
return (
<Suspense fallback={<div>Kraunama...</div>}>
<MyComponent />
</Suspense>
);
}
2. Paveikslėlių optimizavimas
Naudokite `next/image` komponentą paveikslėlių optimizavimui. Šis komponentas automatiškai optimizuoja paveikslėlius skirtingiems įrenginiams ir ekrano dydžiams, gerindamas našumą ir vartotojo patirtį. Jis palaiko vėlųjį įkėlimą, prisitaikančius paveikslėlius ir įvairius paveikslėlių formatus.
import Image from 'next/image';
function MyComponent() {
return (
<Image
src="/images/my-image.jpg"
alt="Mano paveikslėlis"
width={500}
height={300}
/>
);
}
3. Service Workers
Įdiekite „service worker“, kad įgalintumėte funkcionalumą neprisijungus ir pagerintumėte našumą. „Service worker“ yra scenarijus, kuris veikia fone ir gali perimti tinklo užklausas, talpinti išteklius ir siųsti pranešimus. Bibliotekos, tokios kaip `next-pwa`, gali supaprastinti „service worker“ pridėjimo procesą į jūsų Next.js aplikaciją.
4. Aplinkos kintamieji
Naudokite aplinkos kintamuosius, kad konfigūruotumėte savo aplikaciją skirtingoms aplinkoms (pvz., kūrimo, testavimo, produkcijos). Next.js teikia integruotą aplinkos kintamųjų palaikymą per `.env` failą ir `process.env` objektą. Būkite atsargūs ir neatskleiskite slaptos informacijos kliento pusės kode. Aplinkos kintamuosius naudokite pirmiausia konfigūracijos nustatymams, kuriuos saugu atskleisti.
5. Stebėsena ir analitika
Integruokite stebėsenos ir analitikos paslaugą (pvz., Google Analytics, Sentry ar New Relic), kad galėtumėte stebėti našumo metrikas, identifikuoti klaidas ir gauti įžvalgų apie vartotojų elgseną. Tai padės jums optimizuoti aplikaciją ir laikui bėgant pagerinti vartotojo patirtį.
6. SEO optimizavimas kliento pusės aplikacijose
Nors statinis eksportavimas suteikia pradinę HTML struktūrą, apsvarstykite šias strategijas geresniam SEO kliento pusės aplikacijose:
- Išankstinio generavimo paslaugos: Naudokite paslaugą, tokią kaip prerender.io, kad paieškos sistemų robotams pateiktumėte visiškai sugeneruotą HTML.
- Dinaminiai svetainės žemėlapiai: Dinamiškai generuokite ir atnaujinkite savo svetainės XML žemėlapį pagal jūsų aplikacijos turinį.
- Struktūrizuoti duomenys: Įdiekite struktūrizuotų duomenų žymėjimą (Schema.org), kad padėtumėte paieškos sistemoms suprasti jūsų turinį.
- Meta žymos: Dinamiškai atnaujinkite meta žymas (pavadinimą, aprašymą ir t.t.), naudodami bibliotekas, tokias kaip `react-helmet`, atsižvelgiant į dabartinį maršrutą ir turinį.
- Turinio pristatymas: Užtikrinkite, kad jūsų turinys būtų greitai įkeliamas visame pasaulyje. Naudokite CDN. Vartotojas Australijoje turėtų turėti tokią pat greitą patirtį kaip ir vartotojas JAV.
Tarptautinimo (i18n) aspektai
Kuriant kliento pusės aplikaciją pasaulinei auditorijai, tarptautinimas (i18n) yra labai svarbus. Štai keletas geriausių praktikų:
- Vertimų failai: Saugokite savo vertimus atskiruose failuose kiekvienai kalbai. Naudokite biblioteką, tokią kaip `i18next` ar `react-intl`, vertimams valdyti.
- Lokalės nustatymas: Įdiekite lokalės nustatymą pagal vartotojo naršyklės nustatymus ar IP adresą.
- Maršrutizavimas: Naudokite URL priešdėlius arba subdomenus, kad nurodytumėte dabartinę kalbą (pvz., `/lt/`, `/en/`, `lt.example.com`, `en.example.com`). Nuo 10 versijos Next.js turi integruotą i18n maršrutizavimo palaikymą.
- Skaičių ir datos formatavimas: Naudokite lokalėms būdingą skaičių ir datos formatavimą, kad užtikrintumėte, jog duomenys būtų rodomi teisingai skirtingoms kultūroms.
- Palaikymas iš dešinės į kairę (RTL): Palaikykite iš dešinės į kairę rašomas kalbas, tokias kaip arabų ir hebrajų, naudodami CSS logines savybes ir krypties atributus.
- Valiutos formatavimas: Rodykite valiutas naudodami teisingus simbolius ir formatus skirtingoms lokalėms. Bibliotekos, tokios kaip `Intl.NumberFormat`, gali būti itin naudingos.
Tinkamo požiūrio pasirinkimas: statinis eksportavimas prieš serverio pusės generavimą
Sprendimas, ar naudoti statinį eksportavimą, ar serverio pusės generavimą, priklauso nuo konkrečių jūsų aplikacijos reikalavimų. Apsvarstykite šiuos veiksnius:
- Turinio tipas: Ar jūsų turinys yra daugiausia statinis ar dinaminis? Jei jis daugiausia statinis, statinis eksportavimas yra geras pasirinkimas. Jei jis labai dinamiškas ir reikalauja serverio pusės duomenų gavimo, serverio pusės generavimas gali būti tinkamesnis.
- SEO reikalavimai: Kiek svarbus SEO jūsų aplikacijai? Jei SEO yra kritiškai svarbus, serverio pusės generavimas gali būti būtinas, siekiant užtikrinti, kad paieškos sistemų robotai galėtų tinkamai indeksuoti jūsų turinį.
- Našumo reikalavimai: Kokie yra jūsų aplikacijos našumo reikalavimai? Statinis eksportavimas gali užtikrinti puikų našumą statiniam turiniui, o serverio pusės generavimas gali pagerinti dinaminio turinio našumą, sumažindamas kliento pusės apdorojimą.
- Sudėtingumas: Kiek sudėtinga yra jūsų aplikacija? Statinį eksportavimą paprastai yra lengviau nustatyti ir įdiegti, o serverio pusės generavimas gali pridėti sudėtingumo jūsų kūrimo procesui.
- Biudžetas: Koks jūsų biudžetas talpinimui ir infrastruktūrai? Statinis talpinimas paprastai yra pigesnis nei serverinis talpinimas.
Realūs pavyzdžiai
Štai keletas realių pavyzdžių aplikacijų, kurios gali pasinaudoti Next.js statiniu eksportavimu:
- Nukreipimo puslapiai: Paprasti nukreipimo puslapiai su statiniu turiniu ir minimalia interaktyvumu.
- Dokumentacijos svetainės: Dokumentacijos svetainės su iš anksto sugeneruotu turiniu ir kliento pusės paieškos funkcionalumu.
- Tinklaraščiai (su TVS): Tinklaraščiai, kurių turinys valdomas per „headless“ TVS ir gaunamas kliento pusėje.
- Portfolio: Asmeniniai ar profesionalūs portfolio su statine informacija ir kliento pusės maršrutizavimu.
- E. prekybos produktų katalogai: Mažos ir vidutinės e. prekybos parduotuvės, kurios gali iš anksto sugeneruoti produktų detales, o dinaminiai krepšelio ir atsiskaitymo procesai tvarkomi kliento pusėje.
Pavyzdys: Tarptautinės įmonės svetainė
Įsivaizduokite įmonę, turinčią biurus Niujorke, Londone ir Tokijuje. Jie nori svetainės, prieinamos anglų, prancūzų ir japonų kalbomis. Next.js statinis eksportavimas, kartu su „headless“ TVS ir i18n bibliotekomis, galėtų būti idealus sprendimas. TVS saugotų išverstą turinį, Next.js jį gautų ir generuotų kliento pusėje, o statinė svetainė galėtų būti įdiegta visame pasaulyje CDN tinkle greitai prieigai.
Išvada
Next.js statinis eksportavimas suteikia galingą būdą kurti tik kliento pusės aplikacijas, pasinaudojant Next.js karkaso privalumais. Suprasdami privalumus, apribojimus, diegimo procesą ir pažangias technikas, galite sukurti greitas, saugias ir visame pasaulyje prieinamas interneto patirtis, atitinkančias jūsų specifinius reikalavimus. Nesvarbu, ar kuriate paprastą nukreipimo puslapį, ar sudėtingą SPA, statinis eksportavimas gali būti vertingas įrankis jūsų interneto programavimo arsenale.