Deno
Deno 是一個基於 V8 建構的 JavaScript 執行時環境。它不是 Node.js。Hono 也可以在 Deno 上運行。
您可以使用 Hono,使用 TypeScript 編寫程式碼,使用 deno
命令執行應用程式,並將其部署到 "Deno Deploy"。
1. 安裝 Deno
首先,安裝 deno
命令。請參考官方文件。
2. 設定
Deno 的啟動器已可用。使用 "create-hono" 命令啟動您的專案。
deno run -A npm:create-hono my-app
為此範例選擇 deno
樣板。
移動到 my-app
。對於 Deno,您不必顯式安裝 Hono。
cd my-app
3. Hello World
編寫您的第一個應用程式。
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hello Deno!'))
Deno.serve(app.fetch)
4. 執行
僅需這個命令
deno task start
變更埠號
您可以透過更新 main.ts
中 Deno.serve
的參數來指定埠號
Deno.serve(app.fetch)
Deno.serve({ port: 8787 }, app.fetch)
提供靜態檔案
若要提供靜態檔案,請使用從 hono/middleware.ts
匯入的 serveStatic
。
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
選項
app.get(
'/static/*',
serveStatic({
root: './',
rewriteRequestPath: (path) =>
path.replace(/^\/static/, '/statics'),
})
)
mimes
您可以使用 mimes
新增 MIME 類型
app.get(
'/static/*',
serveStatic({
mimes: {
m3u8: 'application/vnd.apple.mpegurl',
ts: 'video/mp2t',
},
})
)
onFound
您可以使用 onFound
指定當找到請求的檔案時的處理方式
app.get(
'/static/*',
serveStatic({
// ...
onFound: (_path, c) => {
c.header('Cache-Control', `public, immutable, max-age=31536000`)
},
})
)
onNotFound
您可以使用 onNotFound
指定當找不到請求的檔案時的處理方式
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。如果沒有可用的壓縮檔,則提供原始檔案。
app.get(
'/static/*',
serveStatic({
precompressed: true,
})
)
Deno Deploy
Deno Deploy 是 Deno 的邊緣執行時平台。我們可以在 Deno Deploy 上廣泛發佈應用程式。
Hono 也支援 Deno Deploy。請參考官方文件。
測試
在 Deno 上測試應用程式很容易。您可以使用 Deno.test
編寫程式碼,並使用來自 @std/assert 的 assert
或 assertEquals
。
deno add @std/assert
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)
})
然後執行命令
deno test hello.ts
npm:
指定符
npm:hono
也可用。您可以使用它來修正 deno.json
{
"imports": {
"hono": "jsr:@hono/hono"
"hono": "npm:hono"
}
}
您可以使用 npm:hono
或 jsr:@hono/hono
。
如果您想將 TypeScript 類型推斷與第三方中介軟體(例如 npm:@hono/zod-validator
)一起使用,則需要使用 npm:
指定符。
{
"imports": {
"hono": "npm:hono",
"zod": "npm:zod",
"@hono/zod-validator": "npm:@hono/zod-validator"
}
}