3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

静的ホスティングのためにreact-scripts buildが生成したファイルを理解する

Posted at

Github pagesなどのホスティングサービスにデプロイするために、
reactで書いたソースコードを配信用に最適化したプロダクションコードにビルドする必要がある。そのためにreact-scripts buildというコマンドがある。

react公式チュートリアルの三目並べ(Tic-tac-toe)をビルドした結果、以下のようなファイル群が生成される。

root
├── static
│   ├── css
│   │   ├── main.22941023.css
│   │   └── main.22941023.css.map
│   └── js
│       ├── main.1f868033.js
│       ├── main.1f868033.js.LICENSE.txt
│       └── main.1f868033.js.map
├── asset-manifest.json
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt

ここでは、これらはどういう内容が入り、どういう用途があるかをまとめる。

static

cssとjsという2つのサブディレクトリーがある。

main.22941023.css

CSSを定義したソースファイルindex.cssから空白と空行をすべて取り除いた一行コード(One Liner)
ファイル名のハッシュ値(数字部分)はソースコードの内容と直接に関係している。同じ内容で何度ビルドしても、同じファイル名となる。

main.22941023.css.map

CSSのソースファイルと圧縮した(minified)ファイルをマッピングするファイル。
特に、SassなどのCSSプリプロセッサ(CSS proprocessor)で書いたソースファイルをブラウザでデバッグするために使われるらしい。
https://stackoverflow.com/a/54071735

今回ビルドしたファイルは以下の特徴がある。

  • 空白と空行をすべて取り除いた1行ファイル(ワンライナー・One Liner)
  • 中身はJSONファイルと同じ構成
    • fileはビルドしたファイルパスを文字列として保持
    • sourcesはソースファイルパスを配列として保持
    • sourcesContentはソースファイルの中身を配列として保持。空白はそのまま、改行は\nの形式で記録されている

main.1f868033.js

ソースファイルindex.jsからwebpackを利用してコンパイルした1行ファイル。

Reactコンポーネント内で定義したメソッド名を検索するとソースコードの痕跡がわかるが、クラスなどの構成要素はすでにコンパイルされていて認識できない。

react-scriptsにおけるwebpackのコンフィグは以下のように。
https://github.com/facebook/create-react-app/blob/main/packages/react-scripts/config/webpack.config.js

react-scripts buildのソースコードは以下のように。

function build(previousFileSizes) { 
    console.log('Creating an optimized production build...');
    const compiler = webpack(config);
    return new Promise((resolve, reject) => {...}
};

main.1f868033.js.LICENSE.txt

jsファイルのライセンス情報を保持する。

今回の場合に以下のものがある。

  • react-dom.production.min.js
  • react-jsx-runtime.production.min.js
  • react.production.min.js
  • scheduler.production.min.js

main.1f868033.js.map

ソースファイル(index.js)とコンパイルしたファイル(main.1f868033.js)をマッピングするファイル。

構造と用途はCSSマッピングファイルと同じらしい。

asset-manifest.json

マニフェストはwebpackのランタイムが依存解決する時に必要なモジュールの詳細情報をまとめたファイルらしい。

今回では、以下のようにfilesとentrypointsを定義している。

{
 "files": {
    "main.css": "/my-first-react-game/static/css/main.00c26109.css",
    "main.js": "/my-first-react-game/static/js/main.1f868033.js",
    "index.html": "/my-first-react-game/index.html",
    "main.00c26109.css.map": "/my-first-react-game/static/css/main.00c26109.css.map",
    "main.1f868033.js.map": "/my-first-react-game/static/js/main.1f868033.js.map"
  },
  "entrypoints": [
    "static/css/main.00c26109.css",
    "static/js/main.1f868033.js"
  ]
}

favicon.ico

ファビコンのファイル。

ファビコンが誕生した初期、IE(Internet Explorer )がウェブサイトをブックマークする時にファビコンをURLの隣に表示するため、ファビコンへのリクエスト数を利用してブックマーク数が分かることがあった。

index.html

エントリーポイントのHTML。1行に圧縮されている。<head>の中に、main.jsやmain.cssなどに対する参照を持つ。<body>の中に、rootというidを持つdivがある。

logo192.png

アップルタッチアイコンとして使われるログ画像。サイズは192×192。

アップルタッチアイコンはiPhoneやiPadなどでWebページをホームスクリーンに追加する時に使用されるアイコンらしい。

index.htmlでは以下のようにアップルタッチアイコンを定義している。

<link rel="apple-touch-icon" href="/my-first-react-game/logo192.png"/>

logo512.png

ログ画像。サイズは512×512。

デフォルトでは、index.htmlから直接利用していないが、後から説明するmainifest.json内でアイコンの1つとして登録されている。

manifest.json

asset-manifest.jsonとは違い、webpackコンパイルする前に存在するファイル。create-react-appsで生成できる。

htmlのmetaタグのようにウェブアプリケーション全体のメタ情報を定義するファイルらしい。

デフォルトでは、以下のような情報がある。

{
 "short_name": "React App",
  "name": "Create React App Sample",
  "icons": [
    {
      "src": "favicon.ico",
      "sizes": "64x64 32x32 24x24 16x16",
      "type": "image/x-icon"
    },
    {
      "src": "logo192.png",
      "type": "image/png",
      "sizes": "192x192"
    },
    {
      "src": "logo512.png",
      "type": "image/png",
      "sizes": "512x512"
    }
  ],
  "start_url": ".",
  "display": "standalone",
  "theme_color": "#000000",
  "background_color": "#ffffff"
}

displayは表示モード(display mode)を指定するオプション。standaloneはネーティブアプリような見た目を意味する。

start_urlはウェブアプリを起動した後に最初にアクセスしてほしいURLを宣言するオプション。相対パスでも指定可能。

robots.txt

検索エンジンなどのクローラーに対して、アクセス可能はパスと不可なパスを定義するファイル。

robots.txtを作成時に有用な情報はこちら。
https://developers.google.com/search/docs/crawling-indexing/robots/intro?hl=ja

デフォルトではアクセスルールが以下のように定義されているため、全てのクローラーに対してサイトを全開放している。

User-agent: *
Disallow:
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?