透過 100 多個技巧學習 Nuxt!

Nitro

Nuxt Kit 提供一組實用工具,幫助您使用 Nitro。這些函式可讓您新增伺服器處理常式、外掛程式和預先渲染路由。

Nitro 是一個開放原始碼的 TypeScript 框架,用於建置超快速的 Web 伺服器。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'))
  }
})