React + WebSocket (+ TypeScript + SCSS + Webpack)
- React で SPA のアプリケーションを作成する
- TypeScript を利用してソースコードを書く
- 1つのHTML で動作するものを作成する
※ ゲームのルールとカードの種類を参考にさせていただきました。
※ よろしければ、実際のゲームをご購入いただき、大切な方とお楽しみ下さい。
https://matsuyoido.github.io/cardgame-react
※ 全てのルールを再現したわけではなく、サンプルとして1ゲーム遊ぶことができる仕様となっています。
※ 許諾を取れているわけではないため、公開を停止する場合がございます。
※ 無料枠での WebSocket を利用しているため、通信制限により突然利用できなくなる可能性がございます。
- java が実行できる環境であること
- 理由: gradle の nodejs 管理プラグインを利用しているため
$ gradlew testServer
を実行すればサーバーが起動するようになっていますdevelop/src/test/server.js
に、ローカル起動用のJSがあり、const folderPath
で指定しているのが、アクセス時のルートディレクトリとなるlocalhost:3000
がアクセス用のURL
webpack.config.js から抜粋
{
test: /\.s[ca]ss$/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
esModule: true,
modules: {
exportLocalsConvention: 'dashesOnly'
}
}
},
"postcss-loader",
"sass-loader"
],
}
&
$ tsm ${SCSSファイルまでのregexパス} --nameFormat dashes --exportType default
の実行によるSCSS用のtsファイル生成
当初、 Achex サーバーを利用する予定だったが、メンテナンスされていなくて wss が使えず…。
結局、 PieSocket を利用することとした。
※ Heroku などにWebSocketサーバーを建てて利用することを迷ったが、どうせ使うなら WebSocketである必要ない…となったため
再利用がしやすいようにWebSocket処理をインターフェース化などしようと考えたが、、
画面描画との連動性が高すぎて分割できず。また、WebSocketだとリクエストとレスポンスが別になるためうまく抽象化はできなかった。
結果として、WebSocketを使って画面を描画するファイルが1つ…という結果になった。
Node.js によるサーバー起動であれば、全てのリクエストを index.html に…という設定で問題なくできた。
しかし、Github pages にはそんな設定はない(ルート or docs 配下のどちらかしか選択できないのも驚き…)。
調べたところ、 404 の時にリダイレクトさせて強制的にindex.htmlに遷移。index.html で、再度URLを組み替えるなどの処理をJSで行う参考ページあり。
その実装を適応させて、SPA化が実現できた。
- gradle による watchタスクを未検証のため、使えるか検証はしてみたい
- ルールの拡充
- ホスト(ゲーム開始宣言をした人)がいなくなると、ゲームが続行不可能になる。ゲームの途中で人数が減ったら、ゲームを強制終了させるようにしたい。
- 本家はポイント制で、3ポイント消えると退場。最後の一人が勝者。という形式。これを実現したい。
- いずれ、プレイヤーの持ちポイントを設定できるようにしたい
- 持ちポイントがなくなった人はプレイヤーから降格し、見ているだけ…のステータスとしたい