Node.js
Node.js 是一个开源、跨平台的 JavaScript 运行环境。
Hono 最初并不是为 Node.js 设计的,但通过 Node.js Adapter 它也可以运行在 Node.js 上。
提示 它适用于 Node.js 18.x 及以上版本,具体要求如下:
- 18.x => 18.14.1+
- 19.x => 19.7.0+
- 20.x => 20.0.0+ 基本上,你可以直接使用每个大版本的最新版本。
1. 初始化 (Setup)
Node.js 提供了一个项目模板。使用 create-hono 命令启动你的项目。在这个示例中选择 nodejs 模板。
npm create hono@latest my-app
yarn create hono my-app
pnpm create hono my-app
bun create hono@latest my-app
deno init --npm hono my-app
进入 my-app 目录并安装依赖:
cd my-appnpm i
cd my-appyarn
cd my-apppnpm i
cd my-appbun i
2. Hello World
编辑 src/index.ts:
import { serve } from '@hono/node-server'import { Hono } from 'hono'const app = new Hono()app.get('/', (c) => c.text('Hello Node.js!'))serve(app)
如果需要优雅地关闭服务器,可以这样写:
const server = serve(app)// graceful shutdownprocess.on('SIGINT', () => {server.close()process.exit(0)})process.on('SIGTERM', () => {server.close((err) => {if (err) {console.error(err)process.exit(1)}process.exit(0)})})
3. 运行 (Run)
本地运行开发服务器,然后在浏览器访问 http://localhost:3000。
npm run dev
yarn dev
pnpm dev
修改端口号
可以通过 port 选项指定端口号:
serve({fetch: app.fetch,port: 8787,})
访问原生 Node.js API
你可以通过 c.env.incoming 和 c.env.outgoing 访问 Node.js API。
import { Hono } from 'hono'import { serve, type HttpBindings } from '@hono/node-server'// 如果使用 HTTP2,可以替换为 `Http2Bindings`type Bindings = HttpBindings & {/* ... */}const app = new Hono<{ Bindings: Bindings }>()app.get('/', (c) => {return c.json({remoteAddress: c.env.incoming.socket.remoteAddress,})})serve(app)
服务静态文件 (Serve static files)
可以使用 serveStatic 从本地文件系统提供静态文件。例如,目录结构如下:
./├── favicon.ico├── index.ts└── static├── hello.txt└── image.png
当访问 /static/* 路径时,如果你想返回 ./static 目录下的文件,可以这样写:
import { serveStatic } from '@hono/node-server/serve-static'app.use('/static/*', serveStatic({ root: './' }))
如果想在根目录下提供 favicon.ico,可以这样写:
app.use('/favicon.ico', serveStatic({ path: './favicon.ico' }))
如果访问 /hello.txt 或 /image.png 时要返回 ./static/hello.txt 或 ./static/image.png,可以这样写:
app.use('*', serveStatic({ root: './static' }))
rewriteRequestPath
如果你想将 http://localhost:3000/static/* 映射到 ./statics,可以使用 rewriteRequestPath 选项:
app.get('/static/*',serveStatic({root: './',rewriteRequestPath: (path) =>path.replace(/^\/static/, '/statics'),}))
http2
你可以让 Hono 运行在 Node.js http2 Server 上。
未加密的 http2
import { createServer } from 'node:http2'const server = serve({fetch: app.fetch,createServer,})
加密的 http2
import { createSecureServer } from 'node:http2'import { readFileSync } from 'node:fs'const server = serve({fetch: app.fetch,createServer: createSecureServer,serverOptions: {key: readFileSync('localhost-privkey.pem'),cert: readFileSync('localhost-cert.pem'),},})
构建与部署 (Building & Deployment)
npm run build
yarn run build
pnpm run build
bun run build
提示 带前端框架的应用可能需要使用 Hono 的 Vite 插件。
Dockerfile
以下是一个 Node.js 的 Dockerfile 示例:
FROM node:22-alpine AS baseFROM base AS builderRUN apk add --no-cache gcompatWORKDIR /appCOPY package*json tsconfig.json src ./RUN npm ci && \npm run build && \npm prune --productionFROM base AS runnerWORKDIR /appRUN addgroup --system --gid 1001 nodejsRUN adduser --system --uid 1001 honoCOPY --from=builder --chown=hono:nodejs /app/node_modules /app/node_modulesCOPY --from=builder --chown=hono:nodejs /app/dist /app/distCOPY --from=builder --chown=hono:nodejs /app/package.json /app/package.jsonUSER honoEXPOSE 3000CMD ["node", "/app/dist/index.js"]
