Skip to content

Core Concepts

ConceptDescriptionKey Features
Nitro Engineเซิร์ฟเวอร์เอนจินสำหรับ NuxtSSR/API routes, ไฟล์ server/, โหมด Hybrid rendering
Viteเครื่องมือ build หลักHot Module Replacement, Build เร็ว, Plugin ecosystem
Composition APIรูปแบบการเขียน Vue componentssetup() function, ref()/reactive(), Composables
Nuxt Layersการแชร์และการขยาย configurationExtend projects, Share components, Unified config
Auto-importsการนำเข้าอัตโนมัติComponents, Composables, Vue APIs
File-based Routingระบบ routing จากโครงสร้างไฟล์pages/ directory, Dynamic routes, Route middleware

Key Features

คุณสมบัติรายละเอียดตัวอย่าง
File-based Routingสร้างเส้นทางอัตโนมัติจากโครงสร้างไฟล์pages/about.vue/about
Server-side Renderingการแสดงผลฝั่งเซิร์ฟเวอร์ใช้ useAsyncData() สำหรับดึงข้อมูลใน SSR
Static Site Generationการสร้างเว็บไซต์แบบสแตติกคำสั่ง nuxi generate
Auto Importsนำเข้า components/composables อัตโนมัติใช้ useFetch() โดยไม่ต้อง import
Modules Systemระบบโมดูลสำหรับเพิ่มความสามารถ@nuxt/image, @nuxt/content
Hybrid Renderingผสมผสาน SSR, SSG และ CSR ในแอปเดียวdefinePageMeta({ static: true })
DevToolsเครื่องมือพัฒนาที่มีในตัวเข้าถึงที่ http://localhost:3000/__nuxt
API Routesสร้าง API endpoints ฝั่งเซิร์ฟเวอร์ไฟล์ใน server/api/ จะกลายเป็นเส้นทาง API
Middlewareการจัดการความปลอดภัยของเส้นทางdefinePageMeta({ middleware: 'auth' })
State Managementการจัดการสถานะที่มีในตัวconst count = useState('counter', () => 0)

Getting Started

  1. Installation

ติดตั้ง Nuxt.js และ dependencies ที่จำเป็นด้วย package manager ที่คุณเลือก:

bash
npm install
npm run dev
bash
pnpm install
pnpm run dev
bash
yarn install
yarn dev
bash
bun install
bun run dev
  1. Run Development Server

เริ่มต้น development server สำหรับการพัฒนาแบบ real-time:

bash
npm run dev
  1. Build for Production

สร้างไฟล์สำหรับ production ที่ optimize แล้ว:

bash
npm run build

Directory Structure

โครงสร้างไดเรกทอรีมาตรฐานของ Nuxt:

  • components/: เก็บ UI components ที่นำกลับมาใช้ได้
  • pages/: สร้าง routes อัตโนมัติจากไฟล์
  • server/: เก็บ API endpoints และ server logic
  • composables/: เก็บ reusable composables
  • แต่ละโฟลเดอร์มีหน้าที่เฉพาะเจาะจง
my-nuxt-app/
├── .nuxt/               # Generated files (auto-generated, don't modify)
│   ├── dist/           # Production build files
│   └── nitro/          # Server build files
├── assets/             # Static assets
│   ├── css/main.css    # Global CSS
│   └── images/logo.png # Site logo
├── components/         # Reusable Vue components
│   ├── AppHeader.vue   # Main navigation
│   └── AppFooter.vue   # Site footer
├── composables/        # Composable functions
│   └── useFetchData.ts # Data fetching logic
├── layouts/            # Layout components
│   └── default.vue     # Default page layout
├── pages/              # Auto-routed pages
│   ├── index.vue       # Home page
│   ├── about.vue       # About page
│   └── products/[id].vue # Dynamic product page
├── public/             # Directly served static files
│   └── favicon.ico     # Site favicon
├── server/             # Server handlers and API routes
│   ├── api/hello.ts    # API endpoint
│   └── middleware/     # Server middleware
└── nuxt.config.ts      # Nuxt configuration file

Rendering

Rendering Modes Comparison

ModeSEOPerformanceUse CaseConfig
SSR (Universal)ดีเยี่ยมโหลดเร็วครั้งแรกเว็บเนื้อหาssr: true
SSG (Static)ดีเยี่ยมเร็วมากบล็อก, เอกสารnpm run generate
CSR (Client)ต่ำโหลดช้าครั้งแรกแดชบอร์ดssr: false
Hybridดีสมดุลเนื้อหาผสมกำหนดค่าแต่ละหน้า

Configuration Examples

ts
// nuxt.config.ts
export default defineNuxtConfig({
  ssr: true,
  nitro: {
    preset: 'node-server'
  }
})
ts
// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'static'
  }
})
ts
// pages/products/[id].vue
definePageMeta({
  static: true // Pre-render this page
})

Rendering Modes

Nuxt supports multiple rendering modes:

ModeDescriptionCommand
Universal (SSR)Server-side renderingnpm run build
Static (SSG)Pre-rendered static sitenpm run generate
Client-sideSPA mode onlyssr: false in nuxt.config
HybridMix of SSR and SSGdefinePageMeta({ static: true })

Switching Modes

Configure in nuxt.config.ts:

ts
export default defineNuxtConfig({
  ssr: true, // Enable SSR
  nitro: {
    preset: 'node-server' // or 'static'
  }
})

Server

FeatureDescriptionLocation
API Routesจุดเชื่อมต่อ API บนเซิร์ฟเวอร์server/api/
Middlewareตัวกรองการร้องขอ APIserver/middleware/
Pluginsส่วนขยายเซิร์ฟเวอร์server/plugins/
Nitroเครื่องมือเซิร์ฟเวอร์ของ Nuxtnuxt.config.ts
ts
// server/api/hello.ts
export default defineEventHandler((event) => {
  return { message: 'Hello World' }
})
ts
// server/middleware/auth.ts
export default defineEventHandler((event) => {
  // Authentication logic
})
ts
// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'node-server'
  }
})

Middleware

Middleware ใน Nuxt มี 2 ประเภทหลัก:

  1. Route middleware: ตรวจสอบก่อนเข้าหน้าเว็บ
  2. Server middleware: ตรวจสอบ request ก่อนถึง API
  • สามารถสร้างเป็นไฟล์ .ts ในโฟลเดอร์ที่เกี่ยวข้อง
  • ใช้ defineNuxtRouteMiddleware หรือ defineEventHandler
TypeLocationDescription
Routemiddleware/ตัวกรองการนำทางระหว่างหน้า
Serverserver/middleware/ตัวกรองการร้องขอ API
NameddefinePageMetaตัวกรองเฉพาะหน้า
ts
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  if (!isAuthenticated()) {
    return navigateTo('/login')
  }
})
ts
// server/middleware/log.ts
export default defineEventHandler((event) => {
  console.log('Request:', event.path)
})
vue
<script setup>
definePageMeta({
  middleware: ['auth']
})
</script>

Pages and Routing

Nuxt สร้างเส้นทางอัตโนมัติจากโครงสร้างไดเรกทอรี pages/

ConceptDescriptionExample
Basic Routeเส้นทางพื้นฐานจากไฟล์pages/index.vue/
Dynamic Routeเส้นทางแบบไดนามิกด้วยพารามิเตอร์pages/users/[id].vue/users/123
Nested Routeเส้นทางแบบซ้อนจากโฟลเดอร์pages/products/index.vue/products
vue
<!-- pages/index.vue -->
<template>
  <div>Home Page</div>
</template>
vue
<!-- pages/users/[id].vue -->
<template>
  <div>User ID: {{ $route.params.id }}</div>
</template>
vue
<!-- pages/about.vue -->
<template>
  <div>หน้าเกี่ยวกับเรา</div>
</template>

Layer

คุณสมบัติคำอธิบายการกำหนดค่า
Extendsแชร์ components/confignuxt.config.ts
Presetsการตั้งค่าล่วงหน้าextends: ['@nuxt/ui']
Modulesเพิ่มความสามารถmodules: []
ts
// nuxt.config.ts
export default defineNuxtConfig({
  extends: ['github:owner/repo']
})
ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/image']
})
ts
// my-layer/nuxt.config.ts
export default defineNuxtConfig({
  components: {
    dirs: ['~/components']
  }
})

View

คุณสมบัติคำอธิบายตัวอย่าง
Templatesโครงสร้างเลย์เอาต์layouts/default.vue
Componentsองค์ประกอบ UI ที่นำกลับมาใช้ใหม่ได้components/
Pagesองค์ประกอบเส้นทางpages/
Dynamic Importsการโหลดแบบล่าช้าdefineAsyncComponent
vue
<!-- layouts/default.vue -->
<template>
  <div>
    <AppHeader />
    <slot />
    <AppFooter />
  </div>
</template>
vue
<script setup>
const Component = defineAsyncComponent(
  () => import('@/components/HeavyComponent.vue')
)
</script>

<template>
  <Component />
</template>
ts
// nuxt.config.ts
export default defineNuxtConfig({
  app: {
    pageTransition: { name: 'page', mode: 'out-in' }
  }
})

Styling

MethodDescriptionConfiguration
UnoCSSระบบ Atomic CSSuno.config.ts
SCSSภาษา CSS ขั้นสูงnpm install -D sass
CSS Modulesสไตล์แบบเฉพาะที่*.module.css
ts
// uno.config.ts
export default defineConfig({
  presets: [presetUno(), presetIcons()]
})
vue
<style lang="scss">
$primary: #00dc82;

.button {
  background: $primary;
}
</style>
vue
<template>
  <div :class="$style.container">Content</div>
</template>

<style module>
.container { color: var(--primary) }
</style>

SEO and Meta

Nuxt มี utilities สำหรับจัดการ SEO และ meta tags:

  • useHead: สำหรับตั้งค่า meta tags พื้นฐาน
  • useSeoMeta: สำหรับ meta tags ของโซเชียลมีเดีย
  • @nuxtjs/sitemap: สร้าง sitemap.xml อัตโนมัติ
  • Meta tags จะถูก inject ใน SSR/SSG mode
เทคนิคคำอธิบายการใช้งาน
Basic Metaเมตาแท็กพื้นฐานSEO ทั่วไป
Social MetaOpenGraph/Twitter cardsการแชร์บนโซเชียล
Sitemapการสร้างแผนผังเว็บไซต์การจัดทำดัชนีโดยเสิร์ชเอนจิน
vue
<script setup>
useHead({
  title: 'หน้าแรก',
  meta: [
    { name: 'description', content: 'คำอธิบายเว็บไซต์' },
    { name: 'keywords', content: 'nuxt, vue, javascript' }
  ]
})
</script>
vue
<script setup>
useSeoMeta({
  title: 'หน้าแรก',
  ogTitle: 'หน้าแรก | เว็บไซต์ของฉัน',
  ogDescription: 'คำอธิบายเว็บไซต์สำหรับ social media',
  ogImage: 'https://example.com/image.jpg'
})
</script>
ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/sitemap'],
  sitemap: {
    hostname: 'https://example.com',
    routes: ['/', '/about']
  }
})

Data Fetching

วิธีคำอธิบายเหมาะสำหรับ
useFetchคอมโพเซเบิลที่นำเข้าโดยอัตโนมัติการร้องขอฝั่งไคลเอนต์
useAsyncDataการดึงข้อมูลที่เข้ากันได้กับ SSRการเรนเดอร์แบบสากล
$fetchไคลเอนต์ HTTP โดยตรงการเรียก API แบบแมนนวล
vue
<script setup>
const { data: posts } = await useFetch('/api/posts')
</script>
vue
<script setup>
const { data: user } = await useAsyncData('user', () => 
  $fetch('/api/user')
)
</script>
ts
// server/api/posts.ts
export default defineEventHandler(async () => {
  return await database.query('SELECT * FROM posts')
})

State Management

การจัดการสถานะใน Nuxt มีหลายวิธี:

  • useState: สำหรับสถานะระดับ component
  • Pinia: สำหรับสถานะ global
  • Shared State: สำหรับสถานะที่แชร์ระหว่าง components
  • สามารถใช้ร่วมกับ server-side rendering ได้
วิธีคำอธิบายเมื่อไหร่ควรใช้
useStateสถานะ reactive ในตัวสถานะ component อย่างง่าย
Piniaการจัดการสถานะอย่างเป็นทางการแอปพลิเคชันที่ซับซ้อน
Shared Stateสถานะ reactive แบบ globalสถานะข้าม component
ts
// composables/useCounter.ts
export const useCounter = () => {
  return useState('counter', () => 0)
}
ts
// stores/counter.ts
export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  actions: {
    increment() { this.count++ }
  }
})
ts
// composables/useSharedState.ts
export const useSharedState = () => {
  return useState('shared', () => ({
    user: null,
    theme: 'light'
  }))
}

Deployment

เป้าหมายคำสั่งการกำหนดค่า
Node Servernuxt buildnitro.preset: 'node-server'
Static Hostingnuxt generatenitro.preset: 'static'
Edge Functionsnuxt buildnitro.preset: 'vercel-edge'
Dockerdocker buildDockerfile
bash
npm run generate
dockerfile
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["npm", "run", "start"]
ts
// nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: 'vercel'
  }
})

Optimizing

เทคนิคคำอธิบายการนำไปใช้
Lazy Loadingโหลดคอมโพเนนต์เมื่อต้องการdefineAsyncComponent
Image Optimizationการประมวลผลภาพอัตโนมัติ@nuxt/image
Code SplittingแยกบันเดิลโดยอัตโนมัติBuilt-in
Compressionการบีบอัด Gzip/Brotlinitro.compressPublicAssets
ts
const Component = defineAsyncComponent(
  () => import('@/components/HeavyComponent.vue')
)
ts
// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxt/image'],
  image: {
    provider: 'ipx'
  }
})

Environment Variables

การจัดการ environment variables ใน Nuxt:

  • ตัวแปรสาธารณะ (public): เข้าถึงได้ทั้งฝั่ง client และ server
  • ตัวแปรส่วนตัว (private): เข้าถึงได้เฉพาะฝั่ง server
  • runtimeConfig: สำหรับการกำหนดค่าที่สามารถ override ได้
  • ควรเก็บค่าลับในไฟล์ .env ที่ไม่ถูก commit
ประเภทตัวแปรการใช้งานตัวอย่าง
Publicเข้าถึงได้ฝั่งไคลเอนต์NUXT_PUBLIC_API_BASE
Privateเฉพาะฝั่งเซิร์ฟเวอร์DATABASE_URL
Runtime Configการเข้าถึงแบบ type-saferuntimeConfig
sh
# Public (client-side)
NUXT_PUBLIC_API_BASE=https://api.example.com

# Private (server-only)
DATABASE_URL=postgres://user:pass@localhost:5432/db
ts
// nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    apiSecret: '', // Can be overridden by NUXT_API_SECRET
    public: {
      apiBase: '/api' // NUXT_PUBLIC_API_BASE
    }
  }
})
vue
<script setup>
const config = useRuntimeConfig()

// Client-side
const apiBase = config.public.apiBase

// Server-side (API routes)
// const apiSecret = config.apiSecret
</script>


## Best Practices

| Category | Recommendation | Implementation |
|----------|----------------|----------------|
| Composables | ใช้คอมโพเซเบิลที่นำเข้าโดยอัตโนมัติ | `useFetch`, `useAsyncData` |
| Structure | ใช้โครงสร้างไดเรกทอรีมาตรฐาน | `components/`, `composables/` |
| Type Safety | ใช้ TypeScript | `tsconfig.json` |
| Modules | ใช้โมดูล Nuxt | `modules: []` |
| Configuration | ใช้ไฟล์กำหนดค่า | `nuxt.config.ts` |

::: code-group

```ts [Composables Example]
<script setup>
const { data } = await useAsyncData('users', () => {
  return $fetch('/api/users')
})
</script>
ts
// โครงสร้างมาตรฐาน
components/
  AppHeader.vue
composables/
  useAuth.ts
pages/
  index.vue
ts
// tsconfig.json
{
  "compilerOptions": {
    "strict": true
  }
}

Last updated: