Skip to content

Deno

Deno 是一个基于 V8 构建的 JavaScript 运行时。它不是 Node.js。 Hono 也可以在 Deno 上运行。

您可以使用 Hono,用 TypeScript 编写代码,使用 deno 命令运行应用程序,并将其部署到“Deno Deploy”。

1. 安装 Deno

首先,安装 deno 命令。 请参阅官方文档

2. 设置

有一个适用于 Deno 的入门模板。 使用 deno init 命令开始您的项目。

sh
deno init --npm hono my-app --template=deno

进入 my-app。对于 Deno,您不必显式安装 Hono。

sh
cd my-app

3. Hello World

编辑 main.ts

main.ts
ts
import { Hono } from 'hono'

const app = new Hono()

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

Deno.serve(app.fetch)

4. 运行

在本地运行开发服务器。然后,在您的 Web 浏览器中访问 http://localhost:8000

sh
deno task start

更改端口号

您可以通过更新 main.tsDeno.serve 的参数来指定端口号:

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

提供静态文件

要提供静态文件,请使用从 hono/deno 导入的 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('您可以访问:/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

如果您想将 http://localhost: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} 未找到,您访问了 ${c.req.path}`)
    },
  })
)

precompressed

precompressed 选项会检查是否存在带有 .br.gz 等扩展名的文件,并根据 Accept-Encoding 标头提供它们。它优先使用 Brotli,然后是 Zstd,最后是 Gzip。如果都不存在,则提供原始文件。

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

Deno Deploy

Deno Deploy 是一个无服务器平台,用于在云中运行 JavaScript 和 TypeScript 应用程序。 它提供了一个管理平面,用于通过 GitHub 部署等集成来部署和运行应用程序。

Hono 也可以在 Deno Deploy 上运行。请参阅官方文档

测试

在 Deno 上测试应用程序很容易。 您可以使用 Deno.test 编写测试,并使用 @std/assert 中的 assertassertEquals

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

Deno.test('Hello World', async () => {
  const app = new Hono()
  app.get('/', (c) => c.text('请测试我'))

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

然后运行命令:

sh
deno test hello.ts

npm 和 JSR

Hono 在 npmJSR(JavaScript 注册表)上都可用。您可以在 deno.json 中使用 npm:honojsr:@hono/hono

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

使用第三方中间件时,您可能需要使用与中间件来自同一注册表的 Hono,以进行正确的 TypeScript 类型推断。例如,如果使用 npm 上的中间件,则还应使用 npm 上的 Hono:

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

我们还在 JSR 上提供了许多第三方中间件包。在 JSR 上使用中间件时,请使用 JSR 上的 Hono:

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

Released under the MIT License.