AI英語学習アプリ「Daily News English」を完成させるまでに直面した技術的な課題と、その解決プロセスを記録します。
音声認識が1秒ごとにリセットされる致命的なバグ、Three.jsの3D実装、Notion APIを使った認証システムなど、初心者エンジニアが実際につまずいたポイントを、コード例とともに共有します。
プロジェクト: Daily News English Training App
開発期間: 2026年1月
技術スタック: Next.js 16, React 19, Three.js, FastAPI, Python, Notion API
開発ドキュメントには「何をしたか」が書いてある。でも、ブログには「なぜつまずいたか」「どう考えたか」を残したい。
完成したアプリの裏には、エラーと格闘した時間、調べても分からなかった問題、偶然見つけた解決策がある。その過程を記録することで、同じ道を歩く誰かの役に立てばと思う。
アプリのコア機能である音声入力が、1秒ごとに入力内容が消えてしまう。録音時間を表示するためにuseStateで1秒ごとに更新していたのが原因だった。
問題のコード:
const [recordingTime, setRecordingTime] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setRecordingTime(prev => prev + 1); // これが再レンダリングを引き起こす
}, 1000);
}, []);
setRecordingTimeによる状態更新が、親コンポーネント全体を再レンダリングさせていた。その度にWeb Speech APIのSpeechRecognitionインスタンスが再作成され、認識中のセッションが中断されていた。
Reactの基礎は理解していたつもりだったが、「状態更新→再レンダリング→インスタンス再作成」という連鎖に気づくまで時間がかかった。
useRefを使って、再レンダリングの影響を受けない参照を保持した。
修正後のコード: