今熱い！！ Hono入門で爆速デプロイ🔥

JavaScriptフレームワーク界隈でここ最近 **Hono** が熱いです。
弊社でもバックエンドFWの一つとしてHonoに注目しています。
Honoは「API開発の効率化」「高速なレスポンス」「軽量な構造」という3拍子を兼ね備えており、特に**エッジコンピューティング環境**に最適化された次世代のJSフレームワークです。

https://hono.dev/

今までだとJS(TS)のバックエンドはExpressがかなりメジャー（最近だとNext.jsが台頭しはじめてきた）でしたが、このHonoがもしかしたらそこに風穴を開けてくれるかもしれません。今回はHonoがなぜこれほど熱いのか、その魅力を紹介しつつ、簡単なAPI実装をしてCloudflare Pagesというエッジ環境に爆速でデプロイします。
※ちなみにCloudflare Pagesは今回のように個人で少し試す分にはfreeプランで十分対応できます

<br />

## **Honoとは？**

**Hono**（ホノ）は超軽量で高速な次世代JSフレームワークです。
名前の由来である日本語の **「炎（ほのお）」** が由来で、Cloudflareの"flare"とかかっているみたいです。
PythonのmekabuやReactの状態管理ライブラリJotaiなど日本語がライブラリやFWの名前に使われてるのいいですよね。

お察しの通り、開発者は和田裕介さんという日本人の方です！

https://x.com/yusukebe

OSSで日本人の名前がこうして挙がるのを見ると、それだけでめちゃくちゃ応援したくなります。
ちなみにこの方、Honoの技術に注目したCloudflareにスカウトされ、2023年にCloudflareに入社しています。すごすぎる...

和田さんのCloudflare入社やHono開発についての対談記事はこちら

https://findy-code.io/engineer-lab/yusukebe

和田さんは今から10年以上前の当時から、アプリケーションだけでなく、そのためのフレームワークも好きで自作していたそうです。

### **Honoの概要**
- **GitHub公式リポジトリ**: [Hono.js](https://github.com/honojs/hono)
- **スター数**: 2024年12月時点で約21.1K（継続的に増加中）
- **用途**: Cloudflareなどエッジコンピューティング向けに最適化されたAPI構築


GitHubスター数の推移がこちらです。

![Star History Dec 24 2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/fb37e16e-f0b1-befd-7410-f02072eb6e9b.png)

2023年下半期から急激に伸びてきているのがわかります。

<br />
<br />

## **Honoのメリット**

### **1. 圧倒的な軽量さ**
Honoのライブラリサイズはわずか数KB~
数十KB。
他のフレームワークと比較しても極めて軽量で、プロジェクトが肥大化する心配がないです。  
開発には最低限の機能さえあれば良いというミニマリストな開発者にピッタリですね。

### **2. 高速なパフォーマンス**
徹底的に最適化されたコードベースにより、Honoは驚異的なスピードを発揮します。  
APIリクエストのレスポンスが速いことはもちろん、スケール時の負荷にも強く、ユーザー体験を向上させてくれます。

### **3. シンプルな設計**
「直感的かつシンプルな構文」で使いやすさ抜群です。
初学者でも簡単に学べる一方で、熟練開発者にはその拡張性と柔軟性が魅力的。

### **4. ミドルウェアで簡単に拡張可能**
認証、バリデーション、CORS設定など、ミドルウェアが豊富です。
必要な機能を選んで組み込むだけで、プロジェクトに応じた最適なAPIを構築可能です。

### **5. エッジ環境への最適化**
Cloudflare Workersなど、分散型のコンピューティング環境に特化。
Fastly ComputeやDeno、Bunなどの他のプラットフォームにも対応しています。
地理的に離れたユーザーにも爆速のレスポンスを届けられるのがHono真骨頂です。

ちなみに、なんでCloudflare 専用のFWでないかというと、

> いろいろなプラットフォームで使ってもらうことが、結果として製品のクオリティを上げることにつながるからです。もし、あのときCloudflare Workersだけに閉じていたら、今みたいに多くの人に使ってもらえるフレームワークには成長しなかったでしょう。そう思うと、たとえ僕がCloudflareに入社したからといって、Cloudflare Workersを贔屓するようなことはしたくないんです。そんな想いをCloudflareも尊重してくれました。
引用: https://findy-code.io/engineer-lab/yusukebe

という考えをもっているからだそうです。
エンジニアとしての技術力だけでなく、思想も素晴らしいですよね...

<br />

もう一つ余談ですが、Honoはrouterにめちゃくちゃこだわっています。
routerだけで5種類あり、それぞれ効果的に使うことで高速な実行環境を実現できます。
routerについてこれ以上書くと記事が長くなってしまうので、詳しく知りたい方はこちら。

https://hono.dev/docs/concepts/routers

<br />
<br />

## **実際にHono.jsを触ってみよう！**

ここからは、Honoを使って超基本的なAPIを作ってみます。

### **1. プロジェクトのセットアップ**

公式ドキュメントを参考に、以下の手順でHonoのプロジェクトを作成します。
今回は `hono-tutorial` という名前でプロジェクトを作ります。

```bash:terminal
npm create hono@latest hono-tutorial
```

npm createコマンドを叩くと、以下のようにいろいろ聞かれます。
今回は後でCloudflare Pagesにデプロイ予定なので、`cloudflare-pages` を選択、その他はデフォルトでOKです。

```bash
Ok to proceed? (y)
create-hono version 0.14.3
**✔** **Using target directory** … hono-tutorial
?  **Which template do you want to use?**  cloudflare-pages
?  **Do you want to install project dependencies?**  yes
?  **Which package manager do you want to use?**  npm
```

プロジェクトができたら、
`npm run dev` （yarnの方は `yarn dev`）をして、開発サーバー（ http://localhost:5173 ）を起動します。

画面にHello!と出てくれば、無事初期セットアップ完了です。
といっても、ほとんどnpmがやってくれましたが...

![スクリーンショット 2024-12-24 1.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/3d474a38-d3d0-6d91-90a8-334e839455f6.png)

### **2. APIを構築する**

ここからは実際に簡単なAPIを構築してみましょう。
`/src/index.tsx` を見るとこのような記述になっていると思います（バージョンによって多少スターターキットが異なる可能性あり）。
普段Reactを多く書いている私からすると、jsxは馴染みがあって使えるの嬉しいです。今回はバックエンドAPIなのであまり関係ないですが、フロントもHonoで書いてフルスタックで開発したい時などに便利ですね。

```typescript:/src/index.tsx
import { Hono } from 'hono'
import { renderer } from './renderer'

const app = new Hono()

app.use(renderer)

app.get('/', (c) => {
	return c.render(<h1>Hello!</h1>)
})

export default app
```

ここに以下のエンドポイントを追加してみましょう。
```typescript:index.tsx
// json型エンドポイント
app.get('/hello', (c) => {
    return c.json({
        name: 'John Doe',
        age: 25,
        message: 'Hello, World!'
    })
})
```

作成したエンドポイントにアクセスしてみましょう。
http://localhost:5173/hello/

![スクリーンショット 2024-12-24 11.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/895395eb-0223-eefe-636b-ba447330d955.png)

正常にレスポンスが確認できます。

続いて、以下のエンドポイントを追加しましょう。

```typescript:index.tsx
// パラメータ付きエンドポイント
app.get('/hello/:name', (c) => {
	const name = c.req.param('name')
	return c.render(<h2>Hello, {name}!</h2>)
})
``` 

作成したエンドポイントにアクセスしてみましょう。
http://localhost:5173/hello/John

`Hello, John!`と表示されます。
`:name` とすることによりname部分のパラメータ文字列を取得することができます。

![スクリーンショット 2024-12-24 1.49.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/c4e11e8b-369b-b5a4-c5bd-1b93da48c6b2.png)

## **Honoのデプロイ（Cloudflare Pages）**

Honoは、**Cloudflare**へのデプロイがめちゃくちゃ簡単で手軽にできます。  
以下の手順で、実際にデプロイしてHonoを動かしてみましょう。

### **1. Cloudflareにサインアップ**

Cloudflareのアカウントにまだサインアップしていない方は
デプロイ前にこちらからアカウント作成をしておきましょう。
https://dash.cloudflare.com/sign-up

### **2. デプロイコマンドを叩く**

npm createコマンドでCloudflare Pagesのプロジェクトを作成した場合は、
package.jsonに既にdeployコマンドが登録されているはずです。
```json
"scripts": {
	"dev": "vite",
	"build": "vite build",
	"preview": "wrangler pages dev",
	"deploy": "npm run build && wrangler pages deploy"
},
```

なのでありがたくこのコマンドをそのまま使っていきましょう。

```bash:terminal
npm run deploy
```

すると以下のようにブラウザが立ち上がるので、allowを押して先に進みます。

![スクリーンショット 2024-12-24 9.50.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/b9c94fda-72b4-0ae3-980e-dc8027cd58fa.png)

その後ターミナルでproduction環境のブランチ名を聞かれますが、今回は特にいじらずそのまま `production` とします。

![スクリーンショット 2024-12-24 9.54.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/36a4d294-1a70-de3c-89b5-a394de31c166.png)

すると、プロジェクトがアップロードされ、
最終的に以下のように
```bash:terminal
Deployment complete! Take a peek over at [CloudflareのURL]
```
と表示されればデプロイ成功です！

![スクリーンショット 2024-12-24 9.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/d9d6817f-b1ef-8588-f7bf-fa192bf44cbf.png)

Cloudflareのアカウントホームを確認すると、ちゃんと今デプロイしたプロジェクトが表示されています。

![スクリーンショット 2024-12-24 10.01.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/3d959552-67e9-0850-6d7e-1ceab4dfeb9d.png)

早速、[CloudflareのURL]（ https://xxxxxx.PJ名-deb.pages.dev ）にアクセスしてみましょう。

アクセスすると、もしかしたら以下のような画面になっているかもしれません。

![スクリーンショット 2024-12-24 10.17.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/93ba24fa-c6b5-e092-ef7c-befb5fba2949.png)

原因を調べてみましょう。

![スクリーンショット 2024-12-24 10.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/c5fd4673-502c-4635-70b2-3eb97fc8cc6e.png)

どうやらDNSのエラーのようなので、Cloudflareのdashboardで調べつつ少し待ってみましょう。

はい、正常に表示されました！

![スクリーンショット 2024-12-24 12.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/490756e6-e5a2-d05d-5527-99197f70a915.png)

これでデプロイ完了です。


## **まとめ**

Honoは、軽量さと高速性、そしてエッジ環境への最適化を兼ね備えた、次世代のAPI開発フレームワークです。  
その直感的な設計と拡張性の高さから、小規模なプロジェクトから大規模な分散システムまで、幅広いシーンで今後デファクトスタンダードになっていくかもしれません。

「軽量なフレームワークを試してみたい」「エッジ環境に最適なAPIを構築したい」という方は、ぜひHonoを触ってみてください🔥


## 採用拡大中！

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を大募集しています！
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！

お問い合わせはこちらから↓
[https://official.assisteng.co.jp/contact/](https://official.assisteng.co.jp/contact/)