Nuxt.js: Vue.js framework SSR aplikacijoms

Kas yra Nuxt.js ir kodėl jis tapo tokiu populiarus

Jei dirbate su Vue.js, tikriausiai jau girdėjote apie Nuxt.js. Tai ne paprastas framework’as – tai pilnateisis Vue.js ekosistemos narys, kuris iš esmės pakeičia požiūrį į tai, kaip kuriame modernias web aplikacijas. Nuxt.js atsirado kaip atsakas į vieną didžiausių Single Page Application (SPA) problemų – server-side rendering (SSR) sudėtingumą.

Įsivaizduokite situaciją: sukūrėte nuostabią Vue.js aplikaciją, bet Google botai jos nemato, o pirmas puslapio įkėlimas trunka amžinybę. Skamba pažįstama? Būtent todėl Nuxt.js tapo tokiu svarbiu žaidėju. Jis ne tik supaprastina SSR implementaciją, bet ir suteikia struktūrą, kuri padeda išvengti chaoso didesniuose projektuose.

Kas įdomiausia – Nuxt.js nėra vien tik apie SSR. Galite kurti statines svetaines (Static Site Generation), tradicines SPA aplikacijas ar net hibridines sistemas, kur kai kurie puslapiai generuojami serveryje, o kiti – kliente. Ši lankstumas ir yra viena iš pagrindinių priežasčių, kodėl komandos renkasi Nuxt.js.

Server-Side Rendering: kodėl tai svarbu 2024 metais

Grįžkime prie SSR pagrindų. Kai kuriate klasikinę SPA aplikaciją, naršyklė gauna beveik tuščią HTML failą ir krūvą JavaScript kodo. Tada JavaScript „atgyja” ir sukuria visą puslapį. Problema? Vartotojas žiūri į baltą ekraną, kol viskas įsikrauna, o paieškos robotai mato tuščią puslapį.

SSR sprendžia šią problemą elegantiškai – serveris iš karto generuoja pilnai suformuotą HTML turinį. Vartotojas mato puslapį akimirksniu, o paieškos sistemoms nereikia vykdyti JavaScript, kad suprastų, kas jūsų svetainėje. Tai kaip skirtumas tarp to, kai jums atneša jau pagamintą maistą ir kai duoda ingredientus su receptu.

Bet SSR turi ir savo iššūkių. Reikia sukonfigūruoti Node.js serverį, tvarkyti duomenų hidrataciją (hydration), spręsti problemas su bibliotekų suderinamumu, kurios tikisi window objekto… Čia ir įsikiša Nuxt.js, kuris visa tai daro už jus. Iš esmės gaunate SSR be skausmo.

Dar vienas svarbus aspektas – Core Web Vitals. Google dabar vertina puslapio greitį kaip reitingavimo faktorių. Nuxt.js su SSR ar Static Generation gali drastiškai pagerinti jūsų Largest Contentful Paint (LCP) ir First Input Delay (FID) rodiklius. Tai ne teorija – tai matoma metrikose.

Nuxt.js architektūra ir pagrindinės savybės

Nuxt.js architektūra yra tikras malonumas dirbantiems su Vue.js. Viskas sukasi apie convention over configuration principą. Tai reiškia, kad daug dalykų veikia automatiškai, jei laikotės tam tikros failų struktūros.

Pavyzdžiui, pages/ kataloge sukuriate failą about.vue – ir automatiškai turite maršrutą /about. Nereikia rankiniu būdu konfigūruoti Vue Router. Norite dinaminių maršrutų? Sukurkite pages/blog/_slug.vue ir viskas veikia. Tai gali atrodyti kaip smulkmena, bet didesnėse aplikacijose tai sutaupo neįtikėtiną kiekį laiko.

components/ katalogas taip pat dirba magiškai – visi komponentai automatiškai importuojami ir prieinami visur. Nebereikia rašyti dešimčių import eilučių kiekviename faile. Tiesiog naudojate <MyComponent /> ir Nuxt.js žino, ką daryti.

Middleware sistema leidžia lengvai valdyti autentifikaciją, autorizaciją ir kitus cross-cutting concerns. Plugins sistema integruoja trečiųjų šalių bibliotekas be problemų. O modules ekosistema? Tai atskira istorija – yra oficialių ir bendruomenės sukurtų modulių praktiškai bet kam: PWA, Axios, i18n, Content Management…

Praktinis pavyzdys: kuriam pirmąją Nuxt.js aplikaciją

Geriausia teorija yra ta, kurią galima išbandyti. Sukurkime paprastą blog’ą su Nuxt.js, kad pamatytumėte, kaip viskas veikia praktikoje.

Pirma, instaliuojame Nuxt.js:

npx create-nuxt-app my-blog
cd my-blog
npm run dev

Instaliacijos vedlys paklaus kelių klausimų – pasirinkite Tailwind CSS stilizavimui ir Axios HTTP užklausoms. Po minutės turėsite veikiančią aplikaciją http://localhost:3000.

Dabar sukurkime blog’o struktūrą. Failas pages/index.vue:

<template>
  <div class="container mx-auto px-4">
    <h1 class="text-4xl font-bold my-8">Mano Blog'as</h1>
    <div class="grid gap-6 md:grid-cols-2">
      <article 
        v-for="post in posts" 
        :key="post.id"
        class="border rounded-lg p-6 hover:shadow-lg transition"
      >
        <nuxt-link :to="`/blog/${post.slug}`">
          <h2 class="text-2xl font-semibold mb-2">{{ post.title }}</h2>
          <p class="text-gray-600">{{ post.excerpt }}</p>
        </nuxt-link>
      </article>
    </div>
  </div>
</template>

<script>
export default {
  async asyncData({ $axios }) {
    const posts = await $axios.$get('https://api.example.com/posts')
    return { posts }
  }
}
</script>

Atkreipkite dėmesį į asyncData metodą – tai Nuxt.js specifinė funkcija, kuri vykdoma serveryje prieš komponentą renderinant. Duomenys jau bus HTML’e, kai puslapis pasieks vartotoją.

Dabar sukurkime individualaus straipsnio puslapį pages/blog/_slug.vue:

<template>
  <article class="container mx-auto px-4 max-w-3xl">
    <h1 class="text-5xl font-bold my-8">{{ post.title }}</h1>
    <div class="prose lg:prose-xl" v-html="post.content"></div>
  </article>
</template>

<script>
export default {
  async asyncData({ $axios, params, error }) {
    try {
      const post = await $axios.$get(`https://api.example.com/posts/${params.slug}`)
      return { post }
    } catch (e) {
      error({ statusCode: 404, message: 'Straipsnis nerastas' })
    }
  },
  
  head() {
    return {
      title: this.post.title,
      meta: [
        { hid: 'description', name: 'description', content: this.post.excerpt }
      ]
    }
  }
}
</script>

Matote head() metodą? Tai dar viena Nuxt.js super galimybė – lengvai valdyti meta tagus kiekvienam puslapiui atskirai. SEO specialistai jus mylės už tai.

Static Site Generation: kai SSR per daug

Viena įdomiausių Nuxt.js funkcijų – galimybė generuoti visiškai statinę svetainę. Tai tarsi SSR, tik vietoj to, kad HTML generuotųsi kiekvieną kartą, kai kas nors apsilanko, jis generuojamas vieną kartą build metu.

Kodėl tai svarbu? Statinę svetainę galite hostinti bet kur – Netlify, Vercel, GitHub Pages, net paprastame Apache serveryje. Nereikia Node.js serverio, nereikia jaudintis dėl serverio apkrovos. Svetainė veikia žaibiškai greitai, nes tai tiesiog HTML failai.

Konfigūracija paprasta kaip du ir du. nuxt.config.js faile:

export default {
  target: 'static',
  
  generate: {
    async routes() {
      const { data } = await axios.get('https://api.example.com/posts')
      return data.map(post => `/blog/${post.slug}`)
    }
  }
}

Tada paleiskite:

npm run generate

Nuxt.js nukrės visus puslapius, įskaitant dinaminius maršrutus, ir sukurs dist/ katalogą su viskuo, ko reikia. Tiesiog įkelkite turinį į bet kurį hostingą ir viskas veikia.

Bet yra niuansas – jei jūsų turinys keičiasi dažnai, reikės regeneruoti svetainę kiekvieną kartą. Čia puikiai tinka Netlify ar Vercel su webhook’ais – kai atnaujinate turinį CMS sistemoje, automatiškai paleidžiamas rebuild’as. Visas procesas užtrunka kelias minutes.

Nuxt 3: kas pasikeitė ir ar verta pereiti

2022 metų pabaigoje oficialiai išleistas Nuxt 3 atnešė didžiulių pokyčių. Jei dar naudojate Nuxt 2, verta suprasti, kas pasikeitė ir ar migracija apsimoka.

Pirmiausia – Nuxt 3 pastatytas ant Vue 3 ir Vite. Tai reiškia drastiškai greitesnį development serverį. Kur Nuxt 2 su Webpack’u galėjo užtrukti 30 sekundžių paleisti projektą, Nuxt 3 su Vite daro tai per 2-3 sekundes. Hot Module Replacement taip pat žaibiškas.

Composition API dabar yra pirmos klasės pilietis. Nors galite naudoti Options API, Nuxt 3 skatina naudoti setup sintaksę:

<script setup>
const { data: posts } = await useFetch('/api/posts')

const filteredPosts = computed(() => {
  return posts.value.filter(post => post.published)
})
</script>

useFetch ir useAsyncData composables yra daug intuityvesni nei senas asyncData. Jie automatiškai tvarko loading būsenas, error handling’ą ir net data caching’ą.

TypeScript palaikymas tapo native. Nebereikia jokių papildomų konfigūracijų – tiesiog pervadinkite .vue į .vue ir pridėkite lang="ts" prie script tag’o. Auto-completion ir type checking veikia iš dėžės.

Nitro serverio variklis – tai kitas game changer. Jis leidžia deploy’inti Nuxt aplikacijas praktiškai bet kur: Node.js, Serverless (AWS Lambda, Cloudflare Workers), Deno, net į edge network’us. Vienas build’as, daugybė deployment galimybių.

Ar verta migruoti? Jei kuriate naują projektą – 100% taip. Jei turite didelę Nuxt 2 aplikaciją – priklauso. Migracija nėra triviali, ypač jei naudojate daug trečiųjų šalių modulių, kurie dar neatnaujinti. Bet ilgalaikėje perspektyvoje Nuxt 3 yra ateitis.

Performance optimizacija ir best practices

Nuxt.js duoda puikų pagrindą, bet yra dalykų, kuriuos turėtumėte žinoti, kad jūsų aplikacija būtų tikrai greita.

Code splitting ir lazy loading – Nuxt.js automatiškai skaido kodą pagal puslapius, bet galite eiti dar toliau. Komponentus, kurie naudojami tik tam tikromis sąlygomis, galite lazy load’inti:

<template>
  <div>
    <LazyHeavyComponent v-if="showComponent" />
  </div>
</template>

Pridėjus Lazy priešdėlį, Nuxt.js automatiškai sukurs atskirą chunk’ą šiam komponentui.

Image optimization – naudokite @nuxt/image modulį. Jis automatiškai optimizuoja paveikslėlius, generuoja skirtingus dydžius ir naudoja modernias formatus kaip WebP:

<nuxt-img
  src="/hero.jpg"
  width="800"
  height="600"
  format="webp"
  loading="lazy"
/>

Caching strategijos – konfigūruokite tinkamus cache header’ius statiniams asset’ams. Nuxt 3 su Nitro leidžia lengvai kontroliuoti cache behavior:

export default defineEventHandler((event) => {
  setHeader(event, 'Cache-Control', 'public, max-age=3600, s-maxage=3600')
  return { data: 'cached for 1 hour' }
})

Bundle size monitoring – naudokite nuxt analyze komandą (Nuxt 2) arba Vite bundle analyzer’į (Nuxt 3), kad pamatytumėte, kas užima daugiausiai vietos jūsų bundle’e. Dažnai rasite netikėtų dalykų – bibliotekų, kurios importuoja visą lodash, nors naudojate tik vieną funkciją.

Dar vienas svarbus patarimas – prefetching. Nuxt.js automatiškai prefetch’ina puslapius, kai <nuxt-link> pasirodo viewport’e. Tai reiškia, kad kai vartotojas paspaudžia nuorodą, puslapis įsikrauna akimirksniu. Bet jei turite daug nuorodų, tai gali apkrauti tinklą. Galite išjungti arba kontroliuoti:

<nuxt-link to="/about" no-prefetch>About</nuxt-link>

Kaip Nuxt.js keičia žaidimo taisykles realybėje

Teorija ir pavyzdžiai yra puiku, bet kas iš tikrųjų svarbiausia – kaip Nuxt.js veikia realiuose projektuose? Po kelių metų darbo su šiuo framework’u galiu pasakyti, kad jis fundamentaliai keičia development workflow’ą.

Pirmiausia, developer experience yra fenomenalus. Kai dirbi su Nuxt.js, jauti, kad framework’as dirba su tavimi, o ne prieš tave. Auto-imports, file-based routing, built-in TypeScript palaikymas – visa tai sumažina cognitive load’ą. Galite susikoncentruoti į business logiką, o ne į boilerplate kodą.

Komandose Nuxt.js suteikia aiškią struktūrą. Naujas developeris gali prisijungti prie projekto ir iš karto suprasti, kur kas yra. pages/ – puslapiai, components/ – komponentai, composables/ – reusable logika. Nereikia ilgų onboarding sesijų, kad paaiškintum custom architektūrą.

SEO rezultatai būna įspūdingi. Vienas projektas, kurį migravome iš klasikinės Vue SPA į Nuxt.js su SSR, pamatė 40% organinio traffico augimą per tris mėnesius. Google tiesiog pradėjo geriau indeksuoti turinį, o puslapių įsikrovimo greitis pagerėjo nuo 4-5 sekundžių iki 1-2 sekundžių.

Bet ne viskas rožėmis kvepiantis. Yra situacijų, kai Nuxt.js gali būti overkill. Jei kuriate paprastą admin dashboard’ą, kuris niekada nebus Google indeksuojamas, klasikinė SPA gali būti paprastesnis sprendimas. Taip pat reikia atsiminti, kad SSR aplikacijos reikalauja serverio – tai papildomi kaštai ir maintenance, palyginus su statine svetaine.

Hosting pasirinkimas taip pat svarbus. Nors Nuxt.js gali veikti bet kur, geriausia patirtis yra su platformomis, kurios sukurtos tam – Vercel, Netlify, Cloudflare Pages. Jos supranta Nuxt.js specifiką ir suteikia optimizuotą aplinką su edge caching, automatic deployments ir kitomis goodies.

Kalbant apie ekosistemą – ji nuolat auga. Nuxt.js bendruomenė yra aktyvi ir draugiška. Yra modulių praktiškai bet kam: authentication (nuxt-auth), content management (@nuxt/content), PWA funkcionalumas (@nuxtjs/pwa), analytics, sitemap generation… Dažniausiai nereikia reinvent the wheel.

Ateities perspektyvos atrodo šviesios. Su Nuxt 3 ir Nitro serveriu, framework’as juda edge computing kryptimi. Galimybė deploy’inti į Cloudflare Workers ar Deno Deploy reiškia, kad jūsų aplikacija gali veikti arčiau vartotojų, su dar mažesniu latency. Tai ypač svarbu globaliniams projektams.

Galiausiai, Nuxt.js nėra tik technologija – tai filosofija. Filosofija, kad developer experience ir end-user experience nėra priešingybės, o viena kitą papildantys dalykai. Kai developeriai yra laimingi ir produktyvūs, jie kuria geresnius produktus. Kai produktai kraunasi greitai ir veikia sklandžiai, vartotojai yra patenkinti. Nuxt.js padeda pasiekti šią pusiausvyrą geriau nei daugelis kitų sprendimų Vue.js ekosistemoje.

Daugiau

Logstash grok patterns: logų parserinimas

E-komercijos platformos: WooCommerce ar Shopify?