【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.htmlUI の骨組み。各セクションに <!-- 画像アップロード領域 --> など説明コメントを追加
style.cssCSS 変数とセクションごとの装飾。ブロックごとに /* タイムライン */ など見出しコメント
common.jsページ共通ユーティリティ。ファイル冒頭に「// クリック直後にボタンのフォーカスを外す理由」など追記
storage.jsCanvas とコメントの永続化。各関数に「// 起動時自動復元」「// 文字数変更ごとに保存」コメント
imageArea.jsD&D+ファイル選択で画像を Canvas へ。Promise 化メソッドに詳細コメント
imageEffects.jsCSS フィルター適用ラッパー。各エフェクト毎にサンプル式を記述
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.htmlinput[type=text][name=tags] を FormData に追加
画像を 回転・トリミングimageEffects.jsctx.rotate() やオフスクリーン Canvas を活用
Service Worker でオフライン投稿新規 sw.jsworkbox-background-sync を導入すると楽
いいねを 一人一回まで に制限postListArea.js + index.jslocalStorage に “likedIds” を記録、サーバ側で重複チェック
投稿一覧に 無限スクロールpostListArea.jsIntersectionObserver で /get?offset=n を追加取得

使用時の注意点(プロダクション導入前に)

  • CSRF / 認証なし:FormData POST は誰でも実行可。トークン or Cookie SameSite 対策必須
  • アップロード拡張子チェックなしmime-type 偽装で危険ファイルが混入する恐れ
  • XSS:コメント表示時にエスケープを入れないとスクリプトを埋め込まれる
  • ファイル名衝突:現状はランダム ID 採用だが、ハッシュ衝突対策やサブディレクトリ分割を推奨
  • 容量制限・認証機構 の追加を忘れずに

ここまでの歩みを称えて 🎉

フロントエンド一周、お疲れさまでした!
 Canvas 操作、File API、Fetch、localStorage と JavaScript の基礎 & 実践 を横断的に体験し、”動くプロダクト” を手元で完成させた経験こそ最高の学びです。

 JavaScript の土台を固めた今、新しい言語へもスムーズに踏み出せます。「演習で学ぶプログラミング」シリーズでは、各言語で今回のような ミニアプリを動かしながら 進める方式を貫きます。
 この先も「作って動かす喜び」を味わいながら、あなたのエンジニアリング旅をさらに広げていきましょう。ワクワクは、まだまだ続きます!