[調査レポート] 適化された production ビルドを dist/ ディレクトリに HTML 付きで出力する仕組みを追加
#47
takaokouji
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
dist ビルド調査レポート
タスク(目的)
smalruby3-editor の本番デプロイ用に、最適化された production ビルドを
dist/ディレクトリに HTML 付きで出力する仕組みを追加する。デプロイ先と使用ディレクトリ
dist/を使用(最適化されたビルド)build/を使用(プレビュー用)build/を使用(プレビュー用)問題点
現状
build/ディレクトリ: 開発ビルド(HTML + JS、圧縮なし、ソースマップあり)dist/ディレクトリ: JS ライブラリのみ(HTML なし)発生している問題
webpack で
dist/に HTML を出力しようとすると、TerserPlugin の段階でビルドが失敗する。エラーメッセージの詳細が表示されないため、原因の特定が困難。
調査内容
1. webpack.config.js の分析
既存の設定
buildConfig (lines 193-269):
build/src/playground/index.jsxbuildWithPwaConfig (lines 271-305):
build/distConfig (lines 154-179):
dist/clean: false設定distStandaloneConfig (lines 182-190):
dist/試した設定
アプローチ 1: buildWithPwaConfig.clone() をベースに distWithHtmlConfig を作成
結果: TerserPlugin でビルド失敗
アプローチ 2: buildConfig.clone() をベースに distWithHtmlConfig を作成
結果: TerserPlugin でビルド失敗
2. index.jsx vs standalone.jsx の調査
index.jsx (render-gui.jsx)
createRoot()を使用onClickLogoがhttps://smalruby.jpにリダイレクトstandalone.jsx (render-gui-standalone.jsx)
onClickLogoがhttps://scratch.mit.edu(upstream のまま)3. build スクリプトの分析
考えられる問題
1. output 設定の競合
clean: falseが設定されている2. library 設定の干渉
output.libraryの設定がある3. ScratchWebpackConfigBuilder の .clone() の挙動
4. TerserPlugin の設定
5. publicPath の設定
publicPath: ''publicPath: 'auto'現在の状態
変更したファイル
webpack.config.js
package.json
build:dist-htmlスクリプトを追加build:distとbuild:dist-standaloneを削除.github/workflows/ci-cd.yml
dist/を使用するように変更dist/を使用するように変更(要修正)ビルドエラーログ
解決策
原因
TerserPlugin が複数の大きなエントリーポイントを並列で圧縮しようとした際に、メモリ不足またはタイムアウトで "Killed" になることが原因。
実装した解決策
1. webpack.config.js
重要なポイント:
buildConfig.clone()をベースにする(HTML 生成とエントリーポイントを継承)devtool: falseでソースマップを削除optimization.minimize: trueで圧縮を有効化TerserPlugin.esbuildMinifyを使用して、ビルド時間を劇的に短縮(約 50秒)し、メモリ効率を向上2. package.json
3. ci-cd.yml
ビルド結果
デプロイ構成
dist/build/build/次のステップ(デバッグ候補)
1. エラーログの詳細を確認
2. TerserPlugin を無効化してテスト
webpack.config.js で一時的に TerserPlugin を無効化して、HTML が生成されるか確認。
3. mode を development に変更してテスト
NODE_ENV=production の代わりに development でビルドして、問題を切り分ける。
4. output 設定を明示的に指定
5. 別のアプローチ: build/ を dist/ にコピー
webpack の設定を変更せず、CI/CD で build/ を dist/ にコピーする方法。
参考情報
upstream scratch-gui の設計思想
dist/はライブラリとして配布することが目的build/に出力ビルド時間の考慮
build:dev: HTML 生成 + PWA → 約 100%build:dist: JS のみ → 約 80%build:dist-html(新規): HTML 生成 + PWA → 約 100%関連ファイル
packages/scratch-gui/webpack.config.jspackages/scratch-gui/package.jsonpackages/scratch-gui/src/playground/index.jsxpackages/scratch-gui/src/playground/render-gui.jsx.github/workflows/ci-cd.ymlBeta Was this translation helpful? Give feedback.
All reactions