リファレンス

静的サイトを公開する前に確認すること

静的な成果物の背後にサーバーはありません。これらのファイルの誤りは、すべての訪問者にとっての誤りになります。以下はReact2Staticがあなた自身の成果物に対して実行する全項目で、それぞれに直し方を付けています。

以下の例に出てくるパッケージ名・パス・数値はあくまで例です。ビルダーはあなたのプロジェクトの実際の値を埋めます。

.env ファイルが公開されています

表示されるもの

dist/
  .env
  index.html
  assets/index-a3f1c2.js

ファイル全体を誰でもダウンロードできます。中の値をすべてローテーションしたうえで、.env をビルドがそのままコピーするディレクトリ(通常は public/)の外に移してください。

コードが process.env.API_KEY を読んでいますが、値を設定している箇所がありません

表示されるもの

const apiKey = process.env.API_KEY;

fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
// Vite turns process.env into {} — the header goes out as
// "Bearer undefined" and the API answers 401. No error in the console.

Vite は process.env を空オブジェクトに置き換えるため、この値はブラウザでは単に undefined になります。エラーも警告も出ず、リクエストはその値を持たないまま送信され、API は 401 を返します。import.meta.env.VITE_〜 経由で読むか、vite.config で define してください。

直し方

const apiKey = import.meta.env.VITE_API_KEY;

成果物に process.env.API_KEY が残っています

表示されるもの

Uncaught ReferenceError: process is not defined
    at index-a3f1c2.js:1:2043

ブラウザには process オブジェクトが存在しないため、この行に到達した時点でエラーになり、多くの場合は真っ白な画面になります。Vite ではブラウザで使う値は import.meta.env 経由で読み、変数名を VITE_ で始める必要があります。

直し方

const apiKey = import.meta.env.VITE_API_KEY;

成果物が自分のマシンを指しています

表示されるもの

const API = "http://localhost:3000/api";

http://localhost:3000/api が含まれています。このアドレスはビルドしたマシン上にしか存在しないため、すべての訪問者でこのリクエストは失敗します。公開されている URL に変更してください。

直し方

const API = "https://api.example.com";

成果物に index.html がありません

表示されるもの

dist/
  assets/index-a3f1c2.js
  assets/index-9b2e01.css

静的ホスティングは index.html を入口ページとして配信します。これがないと訪問者にはファイル一覧か 404 が表示されます。ビルドが実際に何を出力しているか確認してください。

タイトルがテンプレートの初期値のままです

表示されるもの

<title>Vite + React + TS</title>

現在は「Vite + React + TS」です。検索結果や共有されたリンクにはこの文字列が表示されます。index.html で変更してください。

直し方

<title>Your product name — what it does, in one line</title>

ページにタイトルがありません

ブラウザのタブも検索結果も <title> タグを使います。index.html に追加してください。

直し方

<title>Your product name — what it does, in one line</title>

meta description がありません

検索エンジンはページから適当な断片を拾って表示します。<meta name="description"> の一文が、クリックされるかどうかを決めます。

直し方

<meta name="description" content="One clear sentence about what this page is for." />

viewport メタタグがありません

スマートフォンはデスクトップ幅で描画して縮小するため、文字がすべて極端に小さくなります。index.html に <meta name="viewport" content="width=device-width, initial-scale=1"> を追加してください。

直し方

<meta name="viewport" content="width=device-width, initial-scale=1" />

Open Graph タグがありません

チャットアプリや SNS に共有すると、タイトルも画像もない裸の URL として表示されます。og:title、og:description、og:image を追加してください。

直し方

<meta property="og:title" content="Your product name" />
<meta property="og:description" content="One clear sentence." />
<meta property="og:image" content="https://example.com/og.png" />

独自のサイトアイコンがありません

表示されるもの

<link rel="icon" type="image/svg+xml" href="/vite.svg" />

ブラウザのタブやブックマークに白紙のアイコン、あるいはテンプレート由来のロゴが表示されます。自分の favicon を用意して index.html から参照してください。

直し方

<link rel="icon" href="/favicon.ico" sizes="any" />

<html> タグに lang 属性がありません

スクリーンリーダーは読み上げ方の判断に、ブラウザは翻訳を提案するかどうかの判断に使います。lang="ja"、またはページの実際の言語を指定してください。

直し方

<html lang="en">

robots.txt がありません

なくてもクロールはされますが、robots.txt はサイトマップの場所を伝える場所です。「公開」ステップで追加できます。

直し方

User-agent: *
Allow: /

Sitemap: https://example.com/sitemap.xml

スクリプトが 1 つ 2.4 MB あります

表示されるもの

dist/assets/index-a3f1c2.js   2,418.55 kB │ gzip: 731.20 kB

(!) Some chunks are larger than 500 kB after minification.

モバイル回線では何も表示されない時間が数秒続きます。重い部分を動的 import() で切り出すと、初回表示は大きく改善します。

直し方

const Editor = lazy(() => import('./Editor'));

アセットが 1 つ 4.0 MB あります

表示されるもの

dist/assets/hero-8f2a1b.png   4,102.11 kB

大きな画像やフォントは初回描画を遅らせます。画像を WebP に変換し、実際に表示するサイズに縮小するだけで大半は削減できます。

自分のプロジェクトを調べさせる

ZIPをビルダーに入れてください。ブラウザ内で実際のビルドを実行し、問題が起きたときはログ全部ではなく該当する行を指し示します。

ビルダーを開く

関連

ビルドエラーと直し方AIが生成したReactプロジェクトで最も多いビルド失敗13種。npm・Vite・tscが実際に出力する内容、それぞれの意味、そして直し方。