Honoの静的サイト生成機能(`toSSG`)を試してみる

最近Honoを使用してデモアプリを作成し、静的サイトビルド機能を試した結果を共有。Hono(v4)を使用し、nodejsテンプレートを利用してアプリをセットアップ。SSG対応のためにJSXでWebページを生成する方法やビルド用の処理を追加する手順を解説。ビルド時のログ記録方法や実際にビルドする際の注意点も紹介。静的ファイルを生成し、実践投入するための準備が整った。

広告ここから
広告ここまで

目次

    ここ最近、Honoを使ったデモアプリを作ることが多いのですが、静的サイトビルド機能はまださわれていなかったので、触ってみました。

    Hono(v4)でアプリをセットアップする

    まずはアプリをセットアップします。CIやローカル環境でHTMLをビルドする想定なので、nodejsテンプレートでセットアップしてみました。

    % npm create hono@latest  hono-ssg
    Need to install the following packages:
      [email protected]
    Ok to proceed? (y) y
    
    create-hono version 0.5.0
    ✔ Using target directory … hono-ssg
    ✔ Which template do you want to use? › nodejs
    cloned honojs/starter#main to /Users/okamotohidetaka/sandbox/hono-ssg
    ✔ Do you want to install project dependencies? … yes
    ✔ Which package manager do you want to use? › npm
    ✔ Installed project dependencies
    ✔ Copied project files
    Get started with: cd hono-ssg
    

    Node.jsテンプレートをSSG対応にする

    テンプレートからJSXで実装したWebページを生成できるようにしてみましょう。

    まずはsrc/index.tsappexportします。

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

    その後、src/index.tsにあったサーバーを立ち上げる処理を、src/dev.tsに移しましょう。toSSG関数を実行するファイルとは別の場所に配置することで、ビルドコマンドを実行した際にサーバーが立ち上がってしまわないようにします。src/dev.tsは開発時のページの動作確認などに使う想定としています。

    import { serve } from '@hono/node-server'
    import { app } from './index'
    
    const port = 3000
    console.log(`Server is running on port ${port}`)
    
    serve({
      fetch: app.fetch,
      port
    })
    

    続いてsrc/ssg.tsファイルを作成して、ビルド用の処理を追加します。

    
    import { app } from './index'
    import { toSSG } from 'hono/ssg'
    import fs from 'fs/promises'
    
    toSSG(app, fs)

    最後にpackage.jsonのビルドコマンドを更新しましょう。src/ssg.tsを実行することで、静的ファイルを生成できます。

      "scripts": {
        "dev": "tsx watch src/dev.ts",
        "build": "tsx src/ssg.ts "
      },

    デバッグログを残す方法

    src/ssg.tsafterGenerateHook追加すると、ビルド時のログが残せます。

    import { app } from './app'
    import { toSSG } from 'hono/ssg'
    import fs from 'fs/promises'
    
    toSSG(app, fs, {
        afterGenerateHook: (result) => {
          if (result.files) {
            result.files.forEach((file) => console.log(file))
          }
        }
    })

    上のサンプルでは、どんなHTMLファイルを出力したかをログに残してくれます。

    % npm run  build
    $ tsx src/ssg.ts 
    static/about.html
    static/index.html
    ✨  Done in 0.47s.

    実際に使うには

    ここまでで生成処理をテンプレートに追加できました。あとは複数回ビルドをする際を想定して、staticディレクトリの中身を先に削除するか、差分ビルドできるような仕組みなどを用意すれば、実践投入できる・・・かなと思います。

    参考にした記事

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark