跳至內容

Deno

Deno 是一個基於 V8 建構的 JavaScript 執行時環境。它不是 Node.js。Hono 也可以在 Deno 上運行。

您可以使用 Hono,使用 TypeScript 編寫程式碼,使用 deno 命令執行應用程式,並將其部署到 "Deno Deploy"。

1. 安裝 Deno

首先,安裝 deno 命令。請參考官方文件

2. 設定

Deno 的啟動器已可用。使用 "create-hono" 命令啟動您的專案。

sh
deno run -A npm:create-hono my-app

為此範例選擇 deno 樣板。

移動到 my-app。對於 Deno,您不必顯式安裝 Hono。

sh
cd my-app

3. Hello World

編寫您的第一個應用程式。

ts
import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.text('Hello Deno!'))

Deno.serve(app.fetch)

4. 執行

僅需這個命令

sh
deno task start

變更埠號

您可以透過更新 main.tsDeno.serve 的參數來指定埠號

ts
Deno.serve(app.fetch) 
Deno.serve({ port: 8787 }, app.fetch) 

提供靜態檔案

若要提供靜態檔案,請使用從 hono/middleware.ts 匯入的 serveStatic

ts
import { Hono } from 'hono'
import { serveStatic } from 'hono/deno'

const app = new Hono()

app.use('/static/*', serveStatic({ root: './' }))
app.use('/favicon.ico', serveStatic({ path: './favicon.ico' }))
app.get('/', (c) => c.text('You can access: /static/hello.txt'))
app.get('*', serveStatic({ path: './static/fallback.txt' }))

Deno.serve(app.fetch)

對於上述程式碼,它將與以下目錄結構良好地運作。

./
├── favicon.ico
├── index.ts
└── static
    ├── demo
    │   └── index.html
    ├── fallback.txt
    ├── hello.txt
    └── images
        └── dinotocat.png

rewriteRequestPath

如果您想將 https://127.0.0.1:8000/static/* 對應到 ./statics,您可以使用 rewriteRequestPath 選項

ts
app.get(
  '/static/*',
  serveStatic({
    root: './',
    rewriteRequestPath: (path) =>
      path.replace(/^\/static/, '/statics'),
  })
)

mimes

您可以使用 mimes 新增 MIME 類型

ts
app.get(
  '/static/*',
  serveStatic({
    mimes: {
      m3u8: 'application/vnd.apple.mpegurl',
      ts: 'video/mp2t',
    },
  })
)

onFound

您可以使用 onFound 指定當找到請求的檔案時的處理方式

ts
app.get(
  '/static/*',
  serveStatic({
    // ...
    onFound: (_path, c) => {
      c.header('Cache-Control', `public, immutable, max-age=31536000`)
    },
  })
)

onNotFound

您可以使用 onNotFound 指定當找不到請求的檔案時的處理方式

ts
app.get(
  '/static/*',
  serveStatic({
    onNotFound: (path, c) => {
      console.log(`${path} is not found, you access ${c.req.path}`)
    },
  })
)

precompressed

precompressed 選項會檢查是否有擴展名如 .br.gz 的檔案可用,並根據 Accept-Encoding 標頭提供它們。它優先考慮 Brotli,然後是 Zstd 和 Gzip。如果沒有可用的壓縮檔,則提供原始檔案。

ts
app.get(
  '/static/*',
  serveStatic({
    precompressed: true,
  })
)

Deno Deploy

Deno Deploy 是 Deno 的邊緣執行時平台。我們可以在 Deno Deploy 上廣泛發佈應用程式。

Hono 也支援 Deno Deploy。請參考官方文件

測試

在 Deno 上測試應用程式很容易。您可以使用 Deno.test 編寫程式碼,並使用來自 @std/assertassertassertEquals

sh
deno add @std/assert
ts
import { Hono } from 'hono'
import { assertEquals } from '@std/assert'

Deno.test('Hello World', async () => {
  const app = new Hono()
  app.get('/', (c) => c.text('Please test me'))

  const res = await app.request('https://127.0.0.1/')
  assertEquals(res.status, 200)
})

然後執行命令

sh
deno test hello.ts

npm: 指定符

npm:hono 也可用。您可以使用它來修正 deno.json

json
{
  "imports": {
    "hono": "jsr:@hono/hono"
    "hono": "npm:hono"
  }
}

您可以使用 npm:honojsr:@hono/hono

如果您想將 TypeScript 類型推斷與第三方中介軟體(例如 npm:@hono/zod-validator)一起使用,則需要使用 npm: 指定符。

json
{
  "imports": {
    "hono": "npm:hono",
    "zod": "npm:zod",
    "@hono/zod-validator": "npm:@hono/zod-validator"
  }
}

以 MIT 許可證發佈。