Skip to content
Open

wip #277

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
626f9e0
docs(build): 開発・計測フローを Makefile に集約
t0waxx Mar 20, 2026
e793ff4
chore: pnpm から Bun へ移行
t0waxx Mar 20, 2026
510c41d
perf: CRITICAL問題 #1-5 の対応 (webpack/fetch/InfiniteScroll/Sequelize)
t0waxx Mar 20, 2026
fcfd429
fix: splitChunksで分割されたvendors chunkをHTMLに注入する
t0waxx Mar 20, 2026
6779b66
docs: PERFORMANCE.md に技術制約なし追加アプローチを追記
t0waxx Mar 20, 2026
4db3fe1
Merge branch 'feature/t0waxx/bun'
t0waxx Mar 20, 2026
39ebd15
fix: publicPath を / に変更してSPAのサブルートでスクリプトが404になる問題を修正
t0waxx Mar 20, 2026
0669524
fix: window.load待ちを廃止しdeferスクリプト実行時に即マウント、sideEffects無効化
t0waxx Mar 20, 2026
23f9766
fix: babel設定を修正してproduction ReactでjsxDEVエラーを解消
t0waxx Mar 20, 2026
9b06fe4
fix: profileImage null参照クラッシュを修正し、fetcherに非2xxエラー処理を追加
t0waxx Mar 20, 2026
123b988
perf: CROKの人工的遅延(sleep 3000ms + 10ms/文字)を削除
t0waxx Mar 20, 2026
8c35eb8
perf: 静的ファイルのキャッシュを有効化・APIにno-storeを設定
t0waxx Mar 20, 2026
8f7a5dd
perf: CoveredImageのArrayBufferフェッチをimg src直接参照に置き換え
t0waxx Mar 20, 2026
9e7f32d
perf: 検索APIを2クエリ+JSマージから1クエリOR結合に変更
t0waxx Mar 20, 2026
67d051b
Merge feature/t0waxx/crok-sleep
t0waxx Mar 20, 2026
1e69702
Merge feature/t0waxx/cache-control
t0waxx Mar 20, 2026
622a266
chore: ビルド確認用にCoveredImage変更をmainに反映
t0waxx Mar 20, 2026
c714efe
Merge feature/t0waxx/covered-image
t0waxx Mar 20, 2026
d601e29
Merge feature/t0waxx/search-api
t0waxx Mar 20, 2026
c4210d3
perf: SQLite初期化・投稿API・ユーザー投稿APIを最適化
t0waxx Mar 20, 2026
ce327c6
perf: TimelineItem/PostItem/CommentItemにReact.memoとloading=lazyを追加
t0waxx Mar 20, 2026
799501c
Merge branch 'feature/t0waxx/perf-server-simple'
t0waxx Mar 20, 2026
b4eff53
Merge branch 'feature/t0waxx/perf-react-memo'
t0waxx Mar 20, 2026
ebde569
fix: altが空のときEXIF(ImageDescription)からALTを復元
t0waxx Mar 20, 2026
0d45688
fix: E2Eテスト失敗の原因となる過剰変更を修正・復元
t0waxx Mar 20, 2026
27ef5c7
fix: InfiniteScrollのsentinelにheight:1pxを追加してIOBを正常発火させる
t0waxx Mar 20, 2026
4f97f39
テスト: DMリアルタイム更新の失敗調査ログを追加
t0waxx Mar 20, 2026
17129dd
perf: scheduler.postTask 1msポーリングをreact-router/rAFに置き換え
t0waxx Mar 20, 2026
8a33665
perf: 検索バリデーション正規表現のReDoSを修正
t0waxx Mar 20, 2026
7de0eb2
perf: 無限取得の不要リクエストを抑制
t0waxx Mar 20, 2026
93e67c8
fix: scoreが動かなくなったので元に戻す
t0waxx Mar 20, 2026
2cae495
refactor: remove gzip compression for JSON payloads in sendJSON function
t0waxx Mar 20, 2026
1af32a9
perf(client): 利用規約フォントを /terms のみで読み込む
t0waxx Mar 20, 2026
cff338d
perf(client): webpack-bundle-analyzer導入・ffmpeg/波形計算を最適化
t0waxx Mar 20, 2026
b0aaa80
perf: webpack本番最適化・lazy load・Sharp画像圧縮
t0waxx Mar 20, 2026
153c525
perf: GIF→H.264 MP4変換、アイコン512px WebP化、動画遅延ロード
t0waxx Mar 20, 2026
43ab1a8
Merge branch 'feature/t0waxx/terms-font-defer' into operator deploy
t0waxx Mar 20, 2026
ad79e2c
fix: 型チェック通過と検索・静的配信・認証周りの調整
t0waxx Mar 20, 2026
efdf4be
chore: update Dockerfile to support multi-platform builds
t0waxx Mar 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,33 +1,34 @@
# syntax=docker/dockerfile:1

ARG NODE_VERSION=24.14.0
ARG PNPM_VERSION=10.32.1
ARG BUN_VERSION=1.3.9
# Linux amd64 向け(Fly.io 実行環境・Apple Silicon 上の docker build とのズレ防止)
ARG TARGETPLATFORM=linux/amd64

FROM node:${NODE_VERSION}-slim AS base
FROM --platform=$TARGETPLATFORM oven/bun:${BUN_VERSION} AS base

Check warning on line 7 in Dockerfile

View workflow job for this annotation

GitHub Actions / review_app

Setting platform to predefined $TARGETPLATFORM in FROM is redundant as this is the default behavior

RedundantTargetPlatform: Setting platform to predefined $TARGETPLATFORM in FROM is redundant as this is the default behavior More info: https://docs.docker.com/go/dockerfile/rule/redundant-target-platform/

LABEL fly_launch_runtime="Node.js"

ENV PNPM_HOME=/pnpm

WORKDIR /app
RUN --mount=type=cache,target=/root/.npm npm install -g pnpm@${PNPM_VERSION}

FROM base AS build

COPY ./application/package.json ./application/pnpm-lock.yaml ./application/pnpm-workspace.yaml ./
COPY ./application/package.json ./application/bun.lock ./
COPY ./application/client/package.json ./client/package.json
COPY ./application/server/package.json ./server/package.json
RUN --mount=type=cache,target=/pnpm/store pnpm install --frozen-lockfile
COPY ./application/e2e/package.json ./e2e/package.json
RUN --mount=type=cache,target=/root/.bun/install/cache bun install --frozen-lockfile

COPY ./application .

RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm build
RUN NODE_OPTIONS="--max-old-space-size=4096" bun run build

RUN --mount=type=cache,target=/pnpm/store CI=true pnpm install --frozen-lockfile --prod --filter @web-speed-hackathon-2026/server
RUN --mount=type=cache,target=/root/.bun/install/cache CI=true bun install --frozen-lockfile --production --filter @web-speed-hackathon-2026/server

FROM base

RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg && rm -rf /var/lib/apt/lists/*

COPY --from=build /app /app

EXPOSE 8080
CMD [ "pnpm", "start" ]
CMD [ "bun", "run", "start" ]
189 changes: 189 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# Web Speed Hackathon 2026 — docs/README に沿ったよく使う操作
# 前提: mise で Node 24 / Bun が使えること(mise.toml・docs/development.md)

.DEFAULT_GOAL := help

APP_DIR := application
SCORE_DIR := scoring-tool
# ローカル起動時のデフォルト(application/README.md)
APPLICATION_URL ?= http://localhost:3000
# E2E テストの絞り込み(空の場合は全件)
E2E_SPEC ?=
E2E_GREP ?=

.PHONY: help
help:
@echo "利用可能なターゲット(詳細は docs/・各 README 参照):"
@echo ""
@echo " セットアップ"
@echo " make setup … mise trust + mise install + アプリ・計測ツールの bun install"
@echo " make mise-trust … mise trust(初回・mise.toml 変更時)"
@echo " make mise-install … mise install(Node / Bun のバージョン固定)"
@echo " make install-app … $(APP_DIR) で bun install --frozen-lockfile"
@echo " make install-scoring… $(SCORE_DIR) で bun install --frozen-lockfile"
@echo ""
@echo " CaX アプリケーション($(APP_DIR))"
@echo " make build … クライアントビルド(bun run build)"
@echo " make analyze … クライアント bundle 分析(webpack-bundle-analyzer)"
@echo " make start … サーバー起動(bun run start)→ 通常 http://localhost:3000/"
@echo " make typecheck … ワークスペース全体の型チェック"
@echo " make format … oxlint --fix + oxfmt"
@echo " make clean … ビルド成果物・E2E 一時出力の削除($(APP_DIR)/dist など)"
@echo ""
@echo " シード(server パッケージ)"
@echo " make seed-generate … シード生成"
@echo " make seed-insert … DB へシード投入"
@echo " make db-reset … DB を初期シードで再作成"
@echo ""
@echo " E2E / VRT(application/README.md)"
@echo " make playwright-install … Chromium の取得(初回)"
@echo " make e2e-test … Playwright 実行(E2E_SPEC/E2E_GREP で絞り込み可)"
@echo " make e2e-core … ホーム/検索/投稿詳細/利用規約/レスポンシブ"
@echo " make e2e-auth … 認証/ユーザー詳細"
@echo " make e2e-post … 投稿機能中心"
@echo " make e2e-dm … DM 機能"
@echo " make e2e-crok … Crok チャット"
@echo " make e2e-full … 全件実行(最終確認向け)"
@echo " make e2e-update … スナップショット更新(環境差分がある場合)"
@echo " E2E_BASE_URL=https://... make e2e-test … リモート向け"
@echo " make e2e-test E2E_SPEC=\"src/posting.test.ts\" E2E_GREP=\"画像\""
@echo ""
@echo " ローカル採点(scoring-tool/README.md)"
@echo " make score … Lighthouse 計測(APPLICATION_URL を上書き可)"
@echo " make score-targets … 計測名一覧"
@echo " make format-scoring … scoring-tool のフォーマット"
@echo ""
@echo " コンテナ(Dockerfile — 本番相当ビルド)"
@echo " make docker-build … docker build(ポート 8080 想定)"

.PHONY: setup mise-trust mise-install install install-app install-scoring
setup: mise-trust mise-install install

mise-trust:
mise trust

mise-install:
mise install

install: install-app install-scoring

install-app:
cd $(APP_DIR) && bun install --frozen-lockfile

install-scoring:
cd $(SCORE_DIR) && bun install --frozen-lockfile

.PHONY: build analyze start typecheck format clean
build:
cd $(APP_DIR) && bun run build

analyze:
cd $(APP_DIR) && bun run analyze

clean:
rm -rf $(APP_DIR)/dist $(APP_DIR)/e2e/test-results

start:
cd $(APP_DIR) && bun run start

typecheck:
cd $(APP_DIR) && bun run typecheck

format:
cd $(APP_DIR) && bun run format

.PHONY: seed-generate seed-insert db-reset
seed-generate:
cd $(APP_DIR) && bun run --filter @web-speed-hackathon-2026/server seed:generate

seed-insert:
cd $(APP_DIR) && bun run --filter @web-speed-hackathon-2026/server seed:insert

db-reset: seed-generate
cd $(APP_DIR) && bun run --filter @web-speed-hackathon-2026/server seed:insert

.PHONY: playwright-install e2e-test e2e-core e2e-auth e2e-post e2e-dm e2e-crok e2e-full e2e-update \
e2e-home e2e-search e2e-post-detail e2e-terms e2e-responsive \
e2e-auth-auth-modal e2e-user-profile \
e2e-posting e2e-dm-single e2e-crok-chat-single
playwright-install:
cd $(APP_DIR)/e2e && bunx playwright install chromium

e2e-test:
cd $(APP_DIR)/e2e && \
$(if $(E2E_BASE_URL),E2E_BASE_URL=$(E2E_BASE_URL) ,)bunx playwright test $(E2E_SPEC) $(if $(E2E_GREP),--grep "$(E2E_GREP)",)

e2e-core:
$(MAKE) e2e-home
$(MAKE) e2e-search
$(MAKE) e2e-post-detail
$(MAKE) e2e-terms
$(MAKE) e2e-responsive

e2e-auth:
$(MAKE) e2e-auth-auth-modal
$(MAKE) e2e-user-profile

e2e-post:
$(MAKE) e2e-posting
$(MAKE) e2e-post-detail

e2e-dm:
$(MAKE) e2e-dm-single

e2e-crok:
$(MAKE) e2e-crok-chat-single

# 以下は e2e の細かい分割ターゲット(テストファイル単位)
#
# 既存の大枠ターゲット(e2e-core/e2e-auth/e2e-post/...)は後方互換のため残し、
# これらの小分けターゲットを呼ぶようにしています。
e2e-home:
$(MAKE) e2e-test E2E_SPEC="src/home.test.ts"

e2e-search:
$(MAKE) e2e-test E2E_SPEC="src/search.test.ts"

e2e-post-detail:
$(MAKE) e2e-test E2E_SPEC="src/post-detail.test.ts"

e2e-terms:
$(MAKE) e2e-test E2E_SPEC="src/terms.test.ts"

e2e-responsive:
$(MAKE) e2e-test E2E_SPEC="src/responsive.test.ts"

e2e-auth-auth-modal:
$(MAKE) e2e-test E2E_SPEC="src/auth.test.ts"

e2e-user-profile:
$(MAKE) e2e-test E2E_SPEC="src/user-profile.test.ts"

e2e-posting:
$(MAKE) e2e-test E2E_SPEC="src/posting.test.ts"

e2e-dm-single:
$(MAKE) e2e-test E2E_SPEC="src/dm.test.ts"

e2e-crok-chat-single:
$(MAKE) e2e-test E2E_SPEC="src/crok-chat.test.ts"

e2e-full:
$(MAKE) e2e-test

e2e-update:
cd $(APP_DIR)/e2e && bunx playwright test --update-snapshots

.PHONY: score score-targets format-scoring
score:
cd $(SCORE_DIR) && bun run start --applicationUrl $(APPLICATION_URL)

score-targets:
cd $(SCORE_DIR) && bun run start --applicationUrl $(APPLICATION_URL) --targetName

format-scoring:
cd $(SCORE_DIR) && bun run format

.PHONY: docker-build
docker-build:
docker build -t web-speed-hackathon-2026 .
Loading
Loading