Bun
Bun 是另一个 JavaScript 运行时。 它不是 Node.js 或 Deno。 Bun 包含一个转译器,我们可以用 TypeScript 编写代码。 Hono 也适用于 Bun。
1. 安装 Bun
要安装 bun
命令,请按照 官方网站 上的说明进行操作。
2. 设置
2.1. 设置一个新项目
Bun 的启动器可用。 使用“bun create”命令开始您的项目。 选择此示例的 bun
模板。
sh
bun create hono my-app
移入 my-app 并安装依赖项。
sh
cd my-app
bun install
2.2. 设置现有项目
在现有的 Bun 项目上,我们只需要通过以下方式在项目根目录安装 hono
依赖项
sh
bun add hono
3. Hello World
"Hello World" 脚本如下。 与在其他平台上编写几乎相同。
ts
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hello Bun!'))
export default app
4. 运行
运行命令。
sh
bun run dev
然后,在您的浏览器中访问 https://127.0.0.1:3000
。
更改端口号
您可以通过导出 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,
}
提供静态文件
要提供静态文件,请使用从 hono/bun
导入的 serveStatic
。
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' }))
对于上面的代码,它将与以下目录结构一起正常工作。
./
├── favicon.ico
├── src
└── static
├── demo
│ └── index.html
├── fallback.txt
├── hello.txt
└── images
└── dinotocat.png
rewriteRequestPath
如果您想将 https://127.0.0.1:3000/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,
})
)
测试
您可以在 Bun 上使用 bun:test
进行测试。
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('https://127.0.0.1/')
const res = await app.fetch(req)
expect(res.status).toBe(200)
})
})
然后,运行命令。
sh
bun test index.test.ts