Skip to content

Bun

Bun 是另一个 JavaScript 运行时。它不是 Node.js 或 Deno。Bun 包含一个转译编译器,我们可以使用 TypeScript 编写代码。Hono 也适用于 Bun。

¥Bun is another JavaScript runtime. It's not Node.js or Deno. Bun includes a trans compiler, we can write the code with TypeScript. Hono also works on Bun.

1. 安装 Bun

¥ Install Bun

要安装 bun 命令,请按照 官方网站 中的说明进行操作。

¥To install bun command, follow the instruction in the official web site.

2. 设置

¥ Setup

2.1.设置新项目

¥2.1. Setup a new project

Bun 的入门程序可用。使用 "bun create" 命令启动你的项目。为此示例选择 bun 模板。

¥A starter for Bun is available. Start your project with "bun create" command. Select bun template for this example.

sh
bun create hono@latest my-app

移入 my-app 并安装依赖。

¥Move into my-app and install the dependencies.

sh
cd my-app
bun install

2.2.设置现有项目

¥2.2. Setup an existing project

在现有的 Bun 项目中,我们只需要通过以下方式在项目根目录中安装 hono 依赖:

¥On an existing Bun project, we only need to install hono dependencies on the project root directory via

sh
bun add hono

3. Hello World

"Hello World" 脚本如下。几乎与在其他平台上编写相同。

¥"Hello World" script is below. Almost the same as writing on other platforms.

ts
import { Hono } from 'hono'

const app = new Hono()
app.get('/', (c) => c.text('Hello Bun!'))

export default app

4. 运行

¥ Run

运行命令。

¥Run the command.

sh
bun run dev

然后,在你的浏览器中访问 http://localhost:3000

¥Then, access http://localhost:3000 in your browser.

更改端口编号

¥Change port number

你可以通过导出 port 来指定端口号。

¥You can specify the port number with exporting the port.

ts
import { Hono } from 'hono'

const app = new Hono()
app.get('/', (c) => c.text('Hello Bun!'))

export default app 
export default { 
  port: 3000, 
  fetch: app.fetch, 
} 

提供静态文件

¥Serve static files

要提供静态文件,请使用从 hono/bun 导入的 serveStatic

¥To serve static files, use serveStatic imported from hono/bun.

ts
import { serveStatic } from 'hono/bun'

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' }))

对于上述代码,它将与以下目录结构配合良好。

¥For the above code, it will work well with the following directory structure.

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

rewriteRequestPath

如果你想要将 http://localhost:3000/static/* 映射到 ./statics,你可以使用 rewriteRequestPath 选项:

¥If you want to map http://localhost:3000/static/* to ./statics, you can use the rewriteRequestPath option:

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

mimes

你可以使用 mimes 添加 MIME 类型:

¥You can add MIME types with mimes:

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

onFound

你可以使用 onFound 指定找到请求的文件时的处理:

¥You can specify handling when the requested file is found with onFound:

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

onNotFound

你可以使用 onNotFound 指定未找到请求的文件时的处理:

¥You can specify handling when the requested file is not found with 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。如果没有可用的目标,它将提供原始文件。

¥The precompressed option checks if files with extensions like .br or .gz are available and serves them based on the Accept-Encoding header. It prioritizes Brotli, then Zstd, and Gzip. If none are available, it serves the original file.

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

测试

¥Testing

你可以使用 bun:test 在 Bun 上进行测试。

¥You can use bun:test for testing on Bun.

ts
import { describe, expect, it } from 'bun:test'
import app from '.'

describe('My first test', () => {
  it('Should return 200 Response', async () => {
    const req = new Request('http://localhost/')
    const res = await app.fetch(req)
    expect(res.status).toBe(200)
  })
})

然后,运行命令。

¥Then, run the command.

sh
bun test index.test.ts

Hono v4.7 中文网 - 粤ICP备13048890号