跳至內容

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.incomingc.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"]

應預先採取以下步驟。

  1. "outDir": "./dist" 新增至 tsconfig.jsoncompilerOptions 區段。
  2. "exclude": ["node_modules"] 新增至 tsconfig.json
  3. "build": "tsc" 新增至 package.jsonscript 區段。
  4. 執行 npm install typescript --save-dev
  5. "type": "module" 新增至 package.json

以 MIT 授權條款發布。