【ITニュース解説】Generating Product Placeholders Locally in Go for E-Commerce Systems
2025年09月30日に「Dev.to」が公開したITニュース「Generating Product Placeholders Locally in Go for E-Commerce Systems」について初心者にもわかりやすく解説しています。
ITニュース概要
Eコマースシステムで画像の読み込み中に表示される仮画像(プレースホルダー)は、外部サービスを使うとネットワーク遅延やブランド不一致の問題があった。Go言語でアプリ起動時に商品名とブランドカラーの仮画像をローカル生成すれば、外部依存なくUIを改善し、ブランドの一貫性を保つことができる。
ITニュース解説
システムエンジニアを目指す初心者の皆さんへ、Eコマースシステムにおける重要な最適化技術を紹介する。この技術は、ユーザーがウェブサイトを閲覧する際の体験を向上させ、システムの安定性を高めるものだ。
Eコマースのウェブサイトでは、たくさんの商品画像が表示される。しかし、これらの画像はファイルサイズが大きいため、完全に読み込まれるまでに時間がかかることがある。ユーザーがページを開いたとき、画像がまだ読み込み中だと、UI(ユーザーインターフェース)が一時的に空白になったり、レイアウトが崩れて「ちらつき」が発生したりすることがある。これはユーザーにとって不快な体験となり、サイトの信頼性を損なう可能性もある。
この問題を解決するために、「プレースホルダー画像」というものが使われる。プレースホルダー画像とは、本来の商品画像が読み込まれるまでの間、代わりに表示される仮の画像のことだ。これにより、画像が完全に表示されるまでの間も、ウェブサイトのレイアウトが安定し、ユーザーは不快なちらつきを感じることなく、スムーズにコンテンツを閲覧できる。
これまで、多くのEコマースシステムでは、このプレースホルダー画像を外部のサービスに頼っていた。例えば、「placehold.it」や「unsplash.com」といったサービスが有名だ。これらのサービスは手軽に利用できるというメリットがある一方で、いくつかの課題も抱えている。
まず、ネットワークの依存性が増える点だ。プレースホルダー画像を表示するためだけに、自社のシステムとは別の外部サービスにアクセスする必要がある。もしその外部サービスが一時的にダウンしたり、ネットワークの混雑が発生したりすると、プレースホルダー画像が表示されず、結局UIのちらつき問題が再発してしまう可能性がある。これはシステムの安定性を外部に委ねることになり、コントロールが難しい。
次に、レイテンシ(遅延)の発生だ。外部サービスから画像を取得する際には、ネットワークを通じてデータをやり取りする時間がかかる。これはわずかな時間に見えるかもしれないが、多数の画像が必要なEコマースサイトでは、積み重なるとページの表示速度に影響を及ぼし、ユーザー体験を損なう原因となる。
さらに、ブランドの一貫性の欠如という問題もある。外部サービスが提供するプレースホルダー画像は、一般的なデザインであることが多く、Eコマースサイトが持つ独自のブランドイメージやデザインガイドラインに合わない場合がある。ブランドカラーやロゴ、特定のフォントなどを反映できないため、全体の統一感が失われる可能性がある。
今回紹介する技術は、これらの課題を解決するために開発された、Eコマースシステム向けのローカルでプレースホルダー画像を生成するシステムだ。このシステムは、Go言語(GoはGoogleが開発したプログラミング言語で、高速で信頼性の高いバックエンドシステム開発によく使われる)とNext.js(Reactベースのウェブフレームワークで、モダンなフロントエンド開発に利用される)で構築された内部のEコマースプラットフォーム向けに実装された。
このシステムの特徴は、アプリケーションの起動時、つまりシステムが立ち上がるタイミングで、必要なプレースホルダー画像をすべて生成してしまう点にある。具体的には、400×400ピクセルのサイズのJPEG形式(品質90%)の画像を40枚以上生成し、./uploadsというサーバー内のディレクトリに保存する。
生成される画像は、単なる灰色のボックスではない。各画像には、そのプレースホルダーが示す製品の名前がテキストとして埋め込まれ、さらにブランドに合わせたグラデーションの背景が適用される。これにより、外部サービスを使っていた際にあった「ブランドの一貫性の欠如」という問題が解消される。
最も重要な点は、一度画像が生成されてしまえば、その後は外部の依存関係が一切不要になることだ。つまり、プレースホルダー画像を表示するためにネットワーク経由でどこかにアクセスする必要がなくなり、ネットワークの不安定さや遅延といった問題が完全に解消される。システムは自律的に動作し、高速かつ安定したユーザー体験を提供できるのだ。
具体的な実装詳細を見てみよう。このシステムはGo 1.23というバージョンのGo言語で書かれている。画像処理にはGo言語の標準ライブラリであるimageパッケージとそのサブパッケージであるimage/jpeg、そしてGo言語コミュニティが提供するgolang.org/x/image/font、golang.org/x/image/math/fixedといったパッケージが使われている。これらは画像を生成したり、フォントを使ってテキストを描画したりするための基本的なツールを提供する。
生成される画像の仕様は以下の通りだ。
- 寸法: 400×400ピクセル。これは一般的なウェブサイトで使いやすい正方形のサイズだ。
- 出力形式: JPEG、品質90%。JPEGは写真に適した画像形式で、品質90%はファイルサイズと画質のバランスが良い設定だ。
- 背景: 垂直方向の線形グラデーションが使われる。色はインディゴ(#6366F1)からバイオレット(#8B5CF6)への移り変わりで、ブランドの雰囲気を表現する。色の指定は16進数カラーコードで行われ、Web開発ではよく使われる表現方法だ。
- テキスト:
- 画像の上部には「E-Commerce」という文字が白い色(#FFFFFF)で表示される。基本的なフォントである
basicfont.Face7x13が使われる。 - 画像の下部には実際の製品名(例: 「iPhone 15 Pro」)が、やや半透明の白い色(#FFFFFFCC)で表示される。これにより、背景との馴染みも良くなる。
- 画像の上部には「E-Commerce」という文字が白い色(#FFFFFF)で表示される。基本的なフォントである
- 枠線: 1ピクセルの白いストローク(#FFFFFF64)で囲まれ、角は20ピクセルで丸められている。これにより、洗練された見た目になる。
ファイル名も工夫されている。生成される画像ファイルのファイル名は、対応する製品カタログの名前と一致するように命名される。例えば、「iPhone 15 Pro」という製品のプレースホルダーはiphone15_pro.jpgといった具合だ。これにより、システムがどのプレースホルダーがどの製品に対応するかを容易に管理できるようになる。
さらに、このシステムは「冪等性(べきとうせい)」という性質を持っている。これは「同じ操作を何度実行しても、結果は常に同じになる」という意味の技術用語だ。具体的には、プレースホルダー画像ファイルが既に存在する場合は、再生成せずに既存のファイルをそのまま利用する。これにより、無駄な処理を省き、効率的に動作する。
この生成スクリプトは、開発ワークフローに組み込まれている。開発中はmake generate-placeholdersというコマンド一つで簡単に実行でき、必要なプレースホルダー画像を生成できる。また、Dockerコンテナ(アプリケーションとその実行環境をまとめてパッケージ化する技術)を使う場合も、コンテナをビルドする前のステップとして、Goプログラムをビルドし、その生成プログラムを実行することで、コンテナが起動する前にプレースホルダーが用意されるようになっている。
コードの核心部分を見てみよう。generatePlaceholderImageという関数が、特定のファイルパスと製品名を受け取り、画像を生成する。
まず、image.NewRGBAという関数で、RGBA形式の新しい画像オブジェクトを作成する。RGBAはRed(赤)、Green(緑)、Blue(青)、Alpha(透明度)の各要素で色を表現する形式だ。
次に、ループを使って画像の各ピクセルを走査し、Y座標(垂直方向の位置)に基づいて2つの指定された背景色(インディゴとバイオレット)の間を補間(中間色を計算すること)することで、グラデーションを作り出す。これにより、上から下へ色がなめらかに変化する背景が完成する。
その後、font.Drawerというオブジェクトを使って、画像にテキストを描画する。このオブジェクトには、描画先の画像、テキストの色、使用するフォント、そしてテキストの開始位置(Dotプロパティで指定)を設定する。テキストの開始位置は、画像の幅や高さから計算され、中央に配置されるように調整される。上部に「E-Commerce」を、その下に製品名を描画する。
そして、画像の周囲に1ピクセルの白い枠線を描画し、角の部分もアクセント色を使って丸みを帯びたように見せる。これは、画像の端と角のピクセルに直接色を設定することで実現される。
最後に、os.Createで指定されたファイルパスに新しいファイルを作成し、jpeg.Encode関数を使って、生成された画像をJPEG形式でそのファイルに書き出す。この際、品質は90%に設定される。エラーが発生した場合はそれを返すことで、処理の失敗を適切に伝える。
まとめると、このローカルでのプレースホルダー画像生成は、Eコマースシステムにとって非常に効果的な最適化だと言える。外部サービスへの依存をなくすことで、ネットワークの脆弱性(不安定さ)を排除し、ユーザーがウェブサイトを見たときの体験をより予測可能でスムーズなものにする。また、システム全体がより自律的に動作するようになり、開発者は自分たちの環境をより詳細に制御できるようになる。もし、あなたの開発するシステムで、表示する画像が事前に決まっていて、かつサーバー環境を自由に設定できるのであれば、このアプローチは非常に推奨される。これは、単にコードをコンパイルするだけでなく、ユーザー体験を細部まで「作り込む」という意識が反映された、優れたエンジニアリングの実践例だ。