Node.js
Node.js は、オープンソースのクロスプラットフォーム JavaScript ランタイム環境です。
Hono は当初、Node.js 用に設計されたものではありませんでした。しかし、Node.js Adapter を使用することで、Node.js でも実行できるようになりました。
情報
Node.js バージョン 18.x 以降で動作します。必要な 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-appsh
yarn create hono my-appsh
pnpm create hono my-appsh
bunx create-hono my-appsh
deno run -A npm:create-hono my-appmy-app に移動し、依存関係をインストールします。
sh
cd my-app
npm ish
cd my-app
yarnsh
cd my-app
pnpm ish
cd my-app
bun i2. 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. 実行
開発サーバーをローカルで実行します。その後、Webブラウザで https://:3000 にアクセスしてください。
sh
npm run devsh
yarn devsh
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://:3000/static/* を ./statics にマッピングしたい場合は、rewriteRequestPath オプションを使用できます。
ts
app.get(
'/static/*',
serveStatic({
root: './',
rewriteRequestPath: (path) =>
path.replace(/^\/static/, '/statics'),
})
)http2
Node.js http2 Server で 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"]次の手順を事前に行う必要があります。
tsconfig.jsonのcompilerOptionsセクションに"outDir": "./dist"を追加します。tsconfig.jsonに"exclude": ["node_modules"]を追加します。package.jsonのscriptセクションに"build": "tsc"を追加します。npm install typescript --save-devを実行します。package.jsonに"type": "module"を追加します。
