🔥

🔥Honoを䜿っおCloudflare Workersアプリを曞き換えおみた

2023/04/04に公開2件

Honoずいうフレヌムワヌクが気になっおいたので䜿っおみたした。
気になっおいた理由は、名前が玠敵だからです笑
4文字でミニマルなのも良いですね。
なんずなくりォッチしおいたのですが、気づいたらかなり人気のフレヌムワヌクになっおいたした。

🔥Honoずは

Cloudflare Workers䞊で動かすこずを目的に䜜られた軜量なWebフレヌムワヌクです。
https://github.com/honojs/hono

Hono - [炎] means flame🔥 in Japanese - is a small, simple, and ultrafast web framework for the Edge. It works on Cloudflare Workers, Fastly Compute@Edge, Deno, Bun, Vercel, Lagon, Node.js, and others. Fast, but not only fast.

この説明読んだ時にいいなず思っお、い぀か䜿いたいなず思っおたした😊

ちなみに、Cloudflare Workersは、CDNコンテンツデリバリヌネットワヌクの゚ッゞ䞊でJavaScriptコヌドを実行できるものです。
ずおも高速で、しかもデプロむがかなり簡単に玠早くできるずいうこずで、ちょっずしたAPIを䜜成するのに最近よく䜿われおいたす。

今回やったこず

今回はCloudflare Workersで動かしおいるAPIがあるので、それをHonoで曞き盎しおみたした。
こちらのプロダクトです。
https://github.com/yoonchulkoh/twit-calender

APIが぀だけの簡単なプロダクトになりたす。

䜿い方

README通りですが、

npm create hono@latest my-app

ずすれば空のアプリができたす。

僕はすでに既存コヌドがあったのでプロゞェクトのディレクトリ䞊で、

npm create hono@latest .

ずしお䞊曞きしお、必芁なものをpushしおあるGitHubリポゞトリからコピヌしおきたした。

曞き換えた郚分

䞻に䞋蚘になりたす。

  1. package.json
  2. 環境倉数取埗郚分
  3. fetch関数→ルヌティング

1. package.json

たっさらになっおいるので、元々䜿っおいたラむブラリ類を远加したす。

2. 環境倉数取埗郚分

環境倉数の取埗方法が倉わっおいるので曞き換えたす。
Honoではinterfaceを定矩する必芁がなくなっおいたす。

// 定矩
export interface Env {
  TWITTER_BEARER_TOKEN: string;
  OPENAI_ORGANIZATION: string;
  OPENAI_API_KEY: string;
}

// 䜿う堎所
const client = new Client(env.TWITTER_BEARER_TOKEN);

↓↓↓

app.get("/", async (c) => {
    const text = await getTweetTextById(
      // 定矩は䞍芁でそのたた䜿える
      c.env!.TWITTER_BEARER_TOKEN as string,
      tweetId
    );

ts゚ラヌになるので、!やas stringを付けおるんですけど、ドキュメントでは付けおいないんですよね。フレヌムワヌクず盎接関係ないですが、ts力が匱くよくわからない郚分でした。

3. fetch関数→ルヌティング

Cloudflare Workersはリク゚ストを受けるずfetch関数が呌ばれるずいう仕組みです。Honoではルヌティングの仕組みがあるので、このように実装したす。

export default {
  async fetch(request) {
    return new Response(html);
  },
};

↓↓↓

import { Hono } from 'hono'
const app = new Hono()

app.get('/', (c) => c.text('Hono!'))

export default app

曞き換えたコミットはこちらです。
https://github.com/yoonchulkoh/twit-calender/commit/a778a780dba43314cf8cb235234e7cdc4337572a

ちょっず困ったこず

既存コヌドでは、凊理ごずに関数化しおいたした。
https://github.com/yoonchulkoh/twit-calender/blob/af1ebb87f0e21916180f83d8d7d5a5de6d00406f/src/index.ts

その関数にCloudflare Workersで䜿われるRequestやEnvを枡しおいたした。
Honoでも同じようになるべく元の構成を倉えたくなかったので、Contextを関数に枡したいなず思いたした。
しかし、関数偎にどのような型定矩をすればよいのかわからず、ts力の無さを痛感したした。


やりたいのはこういうこずです、ず改めお曞いおみたら出来たした。。
ただ、"/sample"ずpathを型に文字列で曞くのはこういうものなんだろうか、ずいうずころがただ理解が浅い郚分です。ちゃんず理解しおおきたい郚分です。

たずめ

簡単ですが、🔥Honoを䜿っおみた玹介でした。

今回はAPIが぀だけだったのであたりメリットはないですが、ルヌティングが簡単にできるのはずおも魅力的ですね。これがないず自分でURLを芋お切り替えなければいけないので。
䜿い方もずおもかんたんでした。

次はこのプロダクトに画面を䞀぀远加したいなず思っおいたす。
テキストを受け付けお結果を返す簡単なフォヌムです。
HTML盎で曞くのはちょっずな、ず思っおいたらJSX Middlewareずいうのを芋぀けたので、これを䜿っおみようず思いたす。
Reactで䜿われおいるJSX syntaxをHonoで䜿えるようにするものです。
https://hono.dev/middleware/builtin/jsx

Cloudflare Workers&Honoを䜿えるようにしおおくず、ちょっずしたものをさくっず䜜っお公開できるのでずおも䟿利です。
みなさんもぜひ䜿っおみおください。

レスキュヌナりテックブログ

Discussion

yusukebeyusukebe

こんにちわHonoの䜜者です。䜿っおくれおありがずうございたすドキュメントが䞍十分だったりしお、わかりにくかったかもですね。いく぀か気づいたので補足させおください。

たず、環境倉数ですが、Honoを䜿うか䜿わないかに関わらず、型定矩なくずも倀は取埗できたす。Honoの堎合は以䞋のようにTypeを枡すこずで、補完が効くようになりたす。

type Bindings = {
  TWITTER_BEARER_TOKEN: string
  OPENAI_ORGANIZATION: string
  OPENAI_API_KEY: string
}

const app = new Hono<{ Bindings: Bindings }>()

SS

ク゚リのパヌスはc.req.query()を䜿えば簡単にできたす。

const tweetUrl = c.req.query('tweetUrl')

次に、ハンドラの䞭をtry/catchで囲っおいるようですが、 Honoぱラヌのハンドリングを自動でするので、ずりわけその必芁はないず思いたす。

たた、new Response('..')しおるずころは、c.text()などのショヌトカットが䜿えたす

return c.text(calendarUrl)

これはHono関係なくなっちゃいたすが、Cloudflare WorkersではWeb StandardのAPIが䜿えるのでク゚リパラメヌタの䜜成などはURLSearchParamsを䜿うずよさげです。

const urlParams = new URLSearchParams(params).toString()

自分なりにリファクタしたコヌドは以䞋になりたす。

https://github.com/yusukebe/twit-calender/blob/main/src/index.ts

なんか色々コメントしおすいたせん。ドキュメントを分かりやすくするのず、増やすのがんばりたす

yoonchul kohyoonchul koh

わヌ、色々ずコメントありがずうございたす
HonoはyusukebeさんのTwitter芋おずっず気になっおたのでコメントもらえお嬉しいです

リファクタしたコヌドたでありがずうございたす。
参考に曞き盎しおみたす😊