Firebase Hosting の通信量が激減|Next.jsから静的HTMLへ変更して分かったこと

IT全般
スポンサーリンク

こんにちは!スタッフのやまさきです。

先日、デジタルスタジオで使用するための「タイマーアプリ」を作成しました。
その投稿はこちらから↓

ところが、困ったことが起きました😫

やばい、通信量が多くて無料プランに収まりそうにないぞー💦

Firebase Hostingの無料プラン(Sparkプラン)には、通信量の制限があります。

小規模なWebアプリを作っているときはあまり気になりませんが、
「管理画面をずっと開きっぱなしにする」
「大型モニターに常時表示する」
といった使い方をすると、思った以上に通信量が増えることがあります。

今回、私はFirebase + Next.jsでタイマー表示アプリを作っていたのですが、

  • 修正前:約1.2GB/day
  • 修正後:約200KB/day

まで大きく減らすことができました。

この記事では、

  • なぜ通信量が多かったのか
  • 何を変えたのか
  • なぜそこまで減ったのか

を、初級エンジニア向けにできるだけ分かりやすく解説します。
というか、自分用のメモとして残しておくのが一番の目的です。

作っていたもの

今回作っていたのは、こんな感じのシンプルなタイマー管理システムです。

  • 管理画面
  • 利用開始
  • 一時停止
  • 延長
  • 残り時間調整
  • 表示画面
  • 残り時間を大型モニターに表示

Firestoreを使ってリアルタイム同期していました。

最初の構成(通信量が多かった)

最初は Next.js を使っていました。

構成としてはこんな感じです。

Next.js
↓
Firebase Hosting
↓
Firestore

React + Next.js で作ると、開発はかなり楽です。
あと、以前から興味のあったReactに触ってみたいということもあって、学習も目的でした。

ただ、今回のような「常時表示するだけのアプリ」では、実は少しオーバースペックでした。

スポンサーリンク

まずやったこと

キャッシュ設定

最初に追加したのがこちらです。

{
  "hosting": {
    "headers": [
      {
        "source": "/_next/static/**",
        "headers": [
          {
            "key": "Cache-Control",
            "value": "public,max-age=31536000,immutable"
          }
        ]
      }
    ]
  }
}

最初は「なんだこれ?」という感じだったのですが、簡単にいうと、

「このファイルはしばらく変わらないので、毎回ダウンロードしなくてOKです」

という設定です。

たとえると

キャッシュなしだと、

毎回コンビニに行くたびに、

「この雑誌、また最初から全部持って帰ってください」

と言われる感じです。

でもキャッシュを使うと、

「前回の雑誌をそのまま使ってOKです」

になります。

つまり、

  • 初回だけダウンロード
  • 2回目以降は再利用

できるようになります。

Next.jsは実は色々ダウンロードしている

初心者のころは、

「Webページ = HTML1枚」

みたいなイメージを持ちがちです。

でも Next.js は違います。

実際には、画面を開くと裏側で大量のJavaScriptが読み込まれています。

たとえば:

/_next/static/chunks/xxx.js
/_next/static/chunks/yyy.js
/_next/static/chunks/zzz.js

など。

さらに、

  • React本体
  • Next.js本体
  • ページ表示用JS

なども読み込まれます。

つまり、

「HTMLを表示している」

というより、

「JavaScriptアプリをダウンロードして動かしている」

に近いです。

スポンサーリンク

そして次にやったこと

Next.jsをやめて静的HTML化

今回は思い切って、

  • React
  • Next.js

をやめて、

admin.html
display.html

という普通のHTMLファイルに変更しました。

すると何が起きた?

通信量が激減しました。

理由はシンプルで、

「読み込むものが減った」

からです。

修正前

ブラウザ側では、

HTML
↓
Next.js
↓
React
↓
大量のJS
↓
画面描画

という流れでした。

修正後

今は、

HTML
↓
少しのJavaScript
↓
表示

だけです。

かなりシンプルです。

今回のアプリはReactが不要だった

ここが今回かなり大きなポイントでした。

今回のアプリは、

  • 画面遷移なし
  • フォーム少ない
  • SEO不要
  • シンプル表示
  • 常時表示用途

でした。

つまり、

ReactやNext.jsの強みをあまり使っていなかったんです。

逆に、

  • ライブラリの重さ
  • JSのダウンロード量

だけが増えていました。

スポンサーリンク

「Reactは常に正義」ではない

最近はReactやNext.jsが人気なので、

「とりあえずNext.js」

になりがちです。

もちろん便利です。

ただ、

  • サイネージ
  • タイマー
  • 管理画面
  • 社内ツール

みたいな小規模アプリでは、

素のHTML + JavaScriptの方が軽い

ことは普通にあります。

今回まさにそれでした。

ちなみにFirestoreはそのまま

今回減ったのは主に「Hostingの通信量」です。

Firestoreのリアルタイム同期はそのまま使っています。

db.collection("devices").onSnapshot(...)

この部分です。

つまり、

  • Hostingは軽量化
  • Firestoreの便利さは維持

という状態です。

最後に

今回かなり勉強になったのは、

「新しい技術 = 常に最適」ではない

ということでした。

Next.jsは本当に便利ですが、

用途によっては、

  • 普通のHTML
  • 普通のJavaScript

の方がシンプルで速いこともあります。

特に、

  • 常時表示
  • 単機能
  • 小規模

なWebアプリでは、今回のような構成はかなり相性が良いと思います。

同じようにFirebase Hostingの通信量で困っている方の参考になれば嬉しいです。

これでなんとか1ヶ月の上限には収まるんじゃないかなー

タイトルとURLをコピーしました