
【JavaScript入門】「みんなのつぶやき」アプリの動作確認
ここまで JavaScript モジュールと 2 つの静的ファイルを組み上げ、シングルページ・ミニブログ「みんなのつぶやき」 がついに完成しました!
画像をドラッグ&ドロップで取り込み、ワンタップでエフェクトをかけ、コメントを添えて投稿――そのすべてがブラウザ一画面で完結します。さらに、いいね!数はリアルタイムに増減し、タイムラインは Ajax でサクッと再描画。これだけで Canvas API/File API/Fetch API/localStorage など、モダン Web の主要技術を一巡できました。

最終ディレクトリ構成
node-js/
├─ app/ ※ フロントエンド実装一式を格納
│ ├─ index.html ※ 画面レイアウトと各エリアの構造を定義
│ ├─ style.css ※ 全体の見た目(色・レイアウト・ボタン等)を設定
│ └─ js/ ※ 振る舞いを担う JavaScript モジュール群
│ ├─ common.js ※ 全ボタンのフォーカス解除など共通“ちょい便利”処理
│ ├─ storage.js ※ localStorage を使った画像&コメントの保存・復元
│ ├─ imageArea.js ※ ドラッグ&ドロップ/クリックで画像読み込み → Canvas 描画
│ ├─ imageEffects.js ※ Canvas へのセピア・グレースケール・ぼかしフィルタ適用
│ ├─ controlArea.js ※ フィルタボタン・保存・削除・リセットなど操作全般
│ ├─ commentArea.js ※ コメントの文字数カウントと警告表示
│ ├─ sendArea.js ※ 投稿ボタンでサーバーへ画像+コメントを送信
│ ├─ dateFormat.js ※ タイムライン表示用の日付文字列フォーマット
│ └─ postListArea.js ※ 投稿一覧の描画&“いいね”ボタンの更新
├─ index.js ※ Express+Multer によるローカルサーバー起動スクリプト
├─ upload_images/ ※ 投稿時にアップロードされた画像ファイルを保存
└─ post-dat.txt ※ 投稿情報(コメントやファイル名、タイムスタンプ等)を保持する空テキストファイル
パス | 役割 |
---|---|
index.html | UI の骨組み。各セクションに <!-- 画像アップロード領域 --> など説明コメントを追加 |
style.css | CSS 変数とセクションごとの装飾。ブロックごとに /* タイムライン */ など見出しコメント |
common.js | ページ共通ユーティリティ。ファイル冒頭に「// クリック直後にボタンのフォーカスを外す理由」など追記 |
storage.js | Canvas とコメントの永続化。各関数に「// 起動時自動復元」「// 文字数変更ごとに保存」コメント |
imageArea.js | D&D+ファイル選択で画像を Canvas へ。Promise 化メソッドに詳細コメント |
imageEffects.js | CSS フィルター適用ラッパー。各エフェクト毎にサンプル式を記述 |
controlArea.js | エフェクトボタン & ローカル保存。Blob 生成と URL.revokeObjectURL() の理由をコメント |
commentArea.js | 文字数カウンタ。IME イベントの挙動を丁寧に説明 |
sendArea.js | 画像+コメントを Ajax 送信。楽観的 UI 更新フローを図解コメント |
dateFormat.js | 超軽量フォーマッタ。拡張トークン例をコメント |
postListArea.js | タイムライン描画 & ❤️。イベント委任と optimistic update をコメントで解説 |
index.js | ★サーバー起動スクリプト。エンドポイント /get /post /like/:id の処理フローをコメント |
upload_images/ | 投稿画像の保存先。.gitignore 推奨コメント付き |
post-dat.txt | 投稿メタ情報(JSON Lines)保存ファイル。先頭に「空ファイルで commit してください」コメント |
サーバー起動と動作確認
1.ターミナルでプロジェクトルート(node-js)に移動
PS C:\Users\ユーザー名> cd C:\Users\<ユーザー名>\Desktop\node-js
2.以下コマンドでサーバーを起動
node .
すると、以下のように出力されます。
Server started at http://localhost:3000
3.ブラウザで http://localhost:3000/app/ にアクセスし、Hello World と表示されれば正常に起動完了。サーバーを停止するにはターミナルで Ctrl + Cで行います。
http://localhost:3000/app/
操作デモ(大阪旅行の投稿例)
1.旅行写真 osaka.png
を画像エリアへドロップ
2.ぼかし ボタンでふんわり加工
3.コメントに「 大阪旅行に行ってきました。 」を入力し 投稿
ターミナルには下記のようなログが出力されます(ID・ファイル名はランダム)
--- POST /post ---
{ comment: '大阪旅行に行ってきました。' }
[ uploaded file info … ]
Saved new post: { id:'1745511555715', … likes:0 }
4.タイムラインに新しい投稿が即反映。❤️ を押すとカウントが滑らかに +1。

改造のポイント
改造アイデア | 変更ファイル | ヒント |
---|---|---|
投稿に タグ を付ける | sendArea.js + postListArea.js + index.html | input[type=text][name=tags] を FormData に追加 |
画像を 回転・トリミング | imageEffects.js | ctx.rotate() やオフスクリーン Canvas を活用 |
Service Worker でオフライン投稿 | 新規 sw.js | workbox-background-sync を導入すると楽 |
いいねを 一人一回まで に制限 | postListArea.js + index.js | localStorage に “likedIds” を記録、サーバ側で重複チェック |
投稿一覧に 無限スクロール | postListArea.js | IntersectionObserver で /get?offset=n を追加取得 |
使用時の注意点(プロダクション導入前に)
- CSRF / 認証なし:FormData POST は誰でも実行可。トークン or Cookie SameSite 対策必須
- アップロード拡張子チェックなし:
mime-type
偽装で危険ファイルが混入する恐れ - XSS:コメント表示時にエスケープを入れないとスクリプトを埋め込まれる
- ファイル名衝突:現状はランダム ID 採用だが、ハッシュ衝突対策やサブディレクトリ分割を推奨
- 容量制限・認証機構 の追加を忘れずに
ここまでの歩みを称えて 🎉
フロントエンド一周、お疲れさまでした!
Canvas 操作、File API、Fetch、localStorage と JavaScript の基礎 & 実践 を横断的に体験し、”動くプロダクト” を手元で完成させた経験こそ最高の学びです。
JavaScript の土台を固めた今、新しい言語へもスムーズに踏み出せます。「演習で学ぶプログラミング」シリーズでは、各言語で今回のような ミニアプリを動かしながら 進める方式を貫きます。
この先も「作って動かす喜び」を味わいながら、あなたのエンジニアリング旅をさらに広げていきましょう。ワクワクは、まだまだ続きます!