Node.js
Node.js 是一個開放原始碼、跨平台的 JavaScript 執行環境。
Hono 最初並非設計用於 Node.js。但是透過 Node.js Adapter,它也可以在 Node.js 上運行。
資訊
它可以在 18.x 以上版本的 Node.js 上運作。具體要求的 Node.js 版本如下:
- 18.x => 18.14.1+
- 19.x => 19.7.0+
- 20.x => 20.0.0+
基本上,您可以直接使用每個主要版本的最新版本。
1. 設定
有適用於 Node.js 的入門範例。使用 "create-hono" 命令開始您的專案。在這個範例中選擇 nodejs
樣板。
sh
npm create hono@latest my-app
sh
yarn create hono my-app
sh
pnpm create hono my-app
sh
bunx create-hono my-app
sh
deno run -A npm:create-hono my-app
移動到 my-app
並安裝相依性。
sh
cd my-app
npm i
sh
cd my-app
yarn
sh
cd my-app
pnpm i
sh
cd my-app
bun i
2. Hello World
編輯 src/index.ts
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)
3. 執行
在本機執行開發伺服器。然後,在您的網頁瀏覽器中存取 https://127.0.0.1:3000
。
sh
npm run dev
sh
yarn dev
sh
pnpm dev
變更連接埠號碼
您可以使用 port
選項指定連接埠號碼。
ts
serve({
fetch: app.fetch,
port: 8787,
})
存取原始 Node.js API
您可以從 c.env.incoming
和 c.env.outgoing
存取 Node.js API。
ts
import { Hono } from 'hono'
import { serve, type HttpBindings } from '@hono/node-server'
// or `Http2Bindings` if you use HTTP2
type Bindings = HttpBindings & {
/* ... */
}
const app = new Hono<{ Bindings: Bindings }>()
app.get('/', (c) => {
return c.json({
remoteAddress: c.env.incoming.socket.remoteAddress,
})
})
serve(app)
提供靜態檔案
您可以使用 serveStatic
從本機檔案系統提供靜態檔案。
ts
import { serveStatic } from '@hono/node-server/serve-static'
app.use('/static/*', serveStatic({ root: './' }))
rewriteRequestPath
如果您想要將 https://127.0.0.1:3000/static/*
對應到 ./statics
,您可以使用 rewriteRequestPath
選項
ts
app.get(
'/static/*',
serveStatic({
root: './',
rewriteRequestPath: (path) =>
path.replace(/^\/static/, '/statics'),
})
)
http2
您可以在 Node.js http2 伺服器上執行 Hono。
未加密的 http2
ts
import { createServer } from 'node:http2'
const server = serve({
fetch: app.fetch,
createServer,
})
已加密的 http2
ts
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'),
},
})
Dockerfile
以下是一個 Dockerfile 的範例。
Dockerfile
FROM node:20-alpine AS base
FROM base AS builder
RUN apk add --no-cache gcompat
WORKDIR /app
COPY package*json tsconfig.json src ./
RUN npm ci && \
npm run build && \
npm prune --production
FROM base AS runner
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 hono
COPY --from=builder --chown=hono:nodejs /app/node_modules /app/node_modules
COPY --from=builder --chown=hono:nodejs /app/dist /app/dist
COPY --from=builder --chown=hono:nodejs /app/package.json /app/package.json
USER hono
EXPOSE 3000
CMD ["node", "/app/dist/index.js"]
應預先採取以下步驟。
- 將
"outDir": "./dist"
新增至tsconfig.json
的compilerOptions
區段。 - 將
"exclude": ["node_modules"]
新增至tsconfig.json
。 - 將
"build": "tsc"
新增至package.json
的script
區段。 - 執行
npm install typescript --save-dev
。 - 將
"type": "module"
新增至package.json
。