Appearance
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