透過 100 多個技巧的集合來學習 Nuxt!

Nitro

Nuxt Kit 提供了一系列工具,協助您使用 Nitro。這些功能讓您能夠新增伺服器處理常式、外掛模組和預先渲染路由。

Nitro 是一個開放原始碼的 TypeScript 框架,用於建構超快速的網路伺服器。Nuxt 使用 Nitro 作為其伺服器引擎。您可以使用 `useNitro` 來存取 Nitro 實例、`addServerHandler` 來新增伺服器處理常式、`addDevServerHandler` 來新增僅在開發模式下使用的伺服器處理常式、`addServerPlugin` 來新增外掛模組以擴展 Nitro 的執行階段行為,以及 `addPrerenderRoutes` 來新增要由 Nitro 預先渲染的路由。

addServerHandler

新增 Nitro 伺服器處理常式。如果您想要建立伺服器中介軟體或自訂路由,請使用它。

類型

function addServerHandler (handler: NitroEventHandler): void

export interface NitroEventHandler {
  handler: string;
  route?: string;
  middleware?: boolean;
  lazy?: boolean;
  method?: string;
}

參數

handler

類型: NitroEventHandler

必填: true

具有以下屬性的處理常式物件

  • handler (必填)
    類型: string
    事件處理常式的路徑。
  • route (選填)
    類型: string
    路徑前綴或路由。如果使用空字串,將會作為中介軟體使用。
  • middleware (選填)
    類型: boolean
    指定這是一個中介軟體處理常式。中介軟體會在每個路由上被呼叫,且通常應該不回傳任何值,以傳遞給下一個處理常式。
  • lazy (選填)
    類型: boolean
    使用延遲載入來匯入處理常式。
  • method (選填)
    類型: string
    路由方法比對器。如果處理常式名稱包含方法名稱,它將會被用作預設值。

範例

// https://github.com/nuxt-modules/robots
import { createResolver, defineNuxtModule, addServerHandler } from '@nuxt/kit'

export default defineNuxtModule({
  setup(options) {
    const resolver = createResolver(import.meta.url)

    addServerHandler({
      route: '/robots.txt'
      handler: resolver.resolve('./runtime/robots.get.ts')
    })
  }
})

addDevServerHandler

新增僅在開發模式下使用的 Nitro 伺服器處理常式。此處理常式將從生產版本中排除。

類型

function addDevServerHandler (handler: NitroDevEventHandler): void

export interface NitroDevEventHandler {
  handler: EventHandler;
  route?: string;
}

參數

handler

類型: NitroEventHandler

必填: true

具有以下屬性的處理常式物件

  • handler (必填)
    類型: string
    事件處理常式。
  • route (選填)
    類型: string
    路徑前綴或路由。如果使用空字串,將會作為中介軟體使用。

範例

import { createResolver, defineNuxtModule, addDevServerHandler } from '@nuxt/kit'

export default defineNuxtModule({
  setup() {
    const resolver = createResolver(import.meta.url)

    addDevServerHandler({
      handler: () => {
        return {
          body: `Response generated at ${new Date().toISOString()}`
        }
      },
      route: '/_handler'
    })
  }
})
// https://github.com/nuxt-modules/tailwindcss
import { joinURL } from 'ufo'
import { defineNuxtModule, addDevServerHandler } from '@nuxt/kit'

export default defineNuxtModule({
  async setup(options) {
    const route = joinURL(nuxt.options.app?.baseURL, '/_tailwind')

    // @ts-ignore
    const createServer = await import('tailwind-config-viewer/server/index.js').then(r => r.default || r) as any
    const viewerDevMiddleware = createServer({ tailwindConfigProvider: () => options, routerPrefix: route }).asMiddleware()

    addDevServerHandler({ route, handler: viewerDevMiddleware })
  }
})

useNitro

傳回 Nitro 實例。

您只能在 `ready` 鉤子之後呼叫 `useNitro()`。
對 Nitro 實例配置的變更不會套用。

類型

function useNitro (): Nitro

export interface Nitro {
  options: NitroOptions;
  scannedHandlers: NitroEventHandler[];
  vfs: Record<string, string>;
  hooks: Hookable<NitroHooks>;
  unimport?: Unimport;
  logger: ConsolaInstance;
  storage: Storage;
  close: () => Promise<void>;
  updateConfig: (config: NitroDynamicConfig) => void | Promise<void>;
}

範例

// https://github.com/nuxt/nuxt/blob/4e05650cde31ca73be4d14b1f0d23c7854008749/packages/nuxt/src/core/nuxt.ts#L404
import { defineNuxtModule, useNitro, addPlugin, createResolver } from '@nuxt/kit'

export default defineNuxtModule({
  setup(options, nuxt) {
    const resolver = createResolver(import.meta.url)

    nuxt.hook('ready', () => {
      const nitro = useNitro()
      if (nitro.options.static && nuxt.options.experimental.payloadExtraction === undefined) {
        console.warn('Using experimental payload extraction for full-static output. You can opt-out by setting `experimental.payloadExtraction` to `false`.')
        nuxt.options.experimental.payloadExtraction = true
      }
      nitro.options.replace['process.env.NUXT_PAYLOAD_EXTRACTION'] = String(!!nuxt.options.experimental.payloadExtraction)
      nitro.options._config.replace!['process.env.NUXT_PAYLOAD_EXTRACTION'] = String(!!nuxt.options.experimental.payloadExtraction)

      if (!nuxt.options.dev && nuxt.options.experimental.payloadExtraction) {
        addPlugin(resolver.resolve(nuxt.options.appDir, 'plugins/payload.client'))
      }
    })
  }
})

addServerPlugin

新增外掛模組以擴展 Nitro 的執行階段行為。

您可以在 Nitro 文件中閱讀更多關於 Nitro 外掛模組的資訊。

類型

function addServerPlugin (plugin: string): void

參數

plugin

類型: string

必填: true

外掛模組的路徑。外掛模組必須匯出一個接受 Nitro 實例作為引數的函式。

範例

import { createResolver, defineNuxtModule, addServerPlugin } from '@nuxt/kit'

export default defineNuxtModule({
  setup() {
    const resolver = createResolver(import.meta.url)
    addServerPlugin(resolver.resolve('./runtime/plugin.ts'))
  }
})

addPrerenderRoutes

新增要預先渲染到 Nitro 的路由。

類型

function function addPrerenderRoutes (routes: string | string[]): void

參數

routes

類型: string | string[]

必填: true

要預先渲染的路由或路由陣列。

範例

import { defineNuxtModule, addPrerenderRoutes } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'nuxt-sitemap',
    configKey: 'sitemap',
  },
  defaults: {
    sitemapUrl: '/sitemap.xml',
    prerender: true,
  },
  setup(options) {
    if (options.prerender) {
      addPrerenderRoutes(options.sitemapUrl)
    }
  }
})

addServerImportsDir

新增一個目錄,供 Nitro 掃描以進行自動匯入。

類型

function addServerImportsDir (dirs: string | string[], opts: { prepend?: boolean }): void

參數

dirs

類型: string | string[]

必填: true

要註冊供 Nitro 掃描的目錄或目錄陣列

範例

import { defineNuxtModule, createResolver, addServerImportsDir } from '@nuxt/kit'

export default defineNuxtModule({
  meta: {
    name: 'my-module',
    configKey: 'myModule',
  },
  setup(options) {
    const resolver = createResolver(import.meta.url)
    addServerImportsDir(resolver.resolve('./runtime/server/utils'))
  }
})

addServerScanDir

新增要由 Nitro 掃描的目錄。它將檢查子目錄,這些子目錄將會像 `~/server` 資料夾一樣被註冊。

類型

function addServerScanDir (dirs: string | string[], opts: { prepend?: boolean }): void

參數

dirs

類型: string | string[]

必填: true

要註冊供 Nitro 作為伺服器目錄掃描的目錄或目錄陣列。

範例

import { defineNuxtModule, createResolver, addServerScanDir } from '@nuxt/kit'
export default defineNuxtModule({
  meta: {
    name: 'my-module',
    configKey: 'myModule',
  },
  setup(options) {
    const resolver = createResolver(import.meta.url)
    addServerScanDir(resolver.resolve('./runtime/server'))
  }
})