npm install
npm run devnpm run dev გამოიყენება მხოლოდ პროექტზე მუშაობისას. რთავს Vite-ის development რეჟიმს, HMR-ს და development-ისთვის საჭირო დამატებით პროცესებს.
Production build-ის გასაშვებად:
npm run build
npm run previewPerformance benchmark-ისთვის გამოიყენეთ მხოლოდ production build:
npm run build
npm run previewBenchmark არ უნდა გაეშვას npm run dev-ზე, რადგან development რეჟიმში კოდი და asset-ები production-ის მსგავსად ოპტიმიზებული არ არის. HMR-მა და development-ის დამატებითმა პროცესებმა შეიძლება შედეგი ხელოვნურად გააუარესოს და რეალური production performance არ აჩვენოს.
კოდის ყოველი ცვლილების შემდეგ საჭიროა npm run build-ის თავიდან გაშვება და შემდეგ preview სერვერის გადატვირთვა. შედეგების შედარებისას გამოიყენეთ ერთი და იგივე URL, viewport და Lighthouse-ის პარამეტრები.
კოდის შესამოწმებლად:
npm run lint├── public/ # public ფაილი
├── src/
│ ├── app/
│ │ ├── audio/ # ხმების მართვა
│ │ ├── components/
│ │ │ ├── betting/ # ფსონისა და Auto Bet-ის კომპონენტები
│ │ │ ├── game/ # თამაშის React UI
│ │ │ ├── header/ # მენიუ და საინფორმაციო დიალოგები
│ │ │ ├── multipliers/
│ │ │ ├── stats/
│ │ │ └── ui/ # საერთო Button, Dialog, NumberStepper და Switch
│ │ ├── hooks/ # React-ის custom hook-ები
│ │ └── Layout/ # გვერდის ძირითადი განლაგება
│ ├── assets/ # სურათები, SVG და sound asset-ები
│ ├── game/ # Phaser, Spine და canvas rendering
│ ├── locales/ # ქართული, ინგლისური და რუსული თარგმანები
│ ├── store/ # საერთო settings და URL state
│ ├── styles/ # საერთო სტილები და design token-ები
│ ├── dummyData/ # mock მონაცემები და betting state
│ │ ├── bets.ts
│ │ ├── crashEngine.ts
│ │ ├── crashEngine.types.ts
│ │ ├── freeBets.ts
│ │ └── multipliers.ts
│ └── main.tsx # აპლიკაციის საწყისი წერტილი
├── vite.config.ts # build და development კონფიგურაცია
└── package.json # scripts და dependencies
React-ის ინტერფეისი src/app-შია, ხოლო Phaser/Spine-ის rendering — src/game-ში. დაჯგუფების საქაღალდეები lowercase-ით, კონკრეტული კომპონენტების საქაღალდეები კი PascalCase-ითაა დასახელებული.
phaser,@esotericsoftware/spine-phaser-v4,@esotericsoftware/spine-core— თამაშის სცენა და Spine ანიმაციები.spine-coreპირდაპირ dependency-ადაც არის აღწერილი, რადგანSpineGameViewმას პირდაპირ import-ს უკეთებს.i18next,react-i18next— მრავალენოვანი ინტერფეისი.@rolldown/plugin-babel,babel-plugin-react-compiler— React Compiler-ის build პროცესში ჩასართავად.vite-plugin-compression2— ფაილების (JS/CSS) ავტომატური შეკუმშვა (Gzip/Brotli), რაც ამცირებს ბანდლის ზომას და ზოგავს სერვერის რესურსს (რეკომენდებულია Krash SDK-ის დოკუმენტაციაში).
- დიზაინი დავყავი პატარა კომპონენტებად;
Button,Dialog,NumberStepperდაSwitchსაერთო UI კომპონენტებია. - სტილებისთვის გამოვიყენე CSS Modules და საერთო design token-ები.
- ერთი საერთო
Dialogკომპონენტი desktop-ზე modal-ად, ხოლო mobile-ზე bottom drawer-ად მუშაობს. - ენა და ვალუტა URL-ის query პარამეტრებით იმართება.
- production build-ში React, Phaser, Spine და სხვა third-party dependency-ები ცალკე chunk-ებადაა გამოყოფილი.
src/appარის React-ის UI subtree: მართავს მარკაპს, მომხმარებლის ინტერაქციებსა და ლოკალურ UI state-ს. თამაშის რენდერინგის დეტალები React კომპონენტებში არ არის შერეული.src/gameარის Phaser/Spine subtree: ის მართავს canvas rendering-ს, scene-ებს, animation-ებსა და მათ lifecycle-ს და React კომპონენტებს არ შეიცავს.- ეს subtree-ები ცალკეა, რადგან React-ის render lifecycle და Phaser-ის მუდმივი game loop სხვადასხვა პასუხისმგებლობაა. მათ შორის საზღვარი
PhaserGame-ია: React ქმნის და ზომავს container-ს, ხოლოGameEngineმასში Phaser instance-ს მართავს. src/dummyData/crashEngine.tsარის დავალების mock მონაცემთა წყარო. React მასuseSyncExternalStore-ით უკავშირდება, ამიტომ engine-ის snapshot-ები React state-ში არ დუბლირდება და თითოეული betting slot მხოლოდ მისთვის საჭირო ცვლილებებზე რეაგირებს.PhaserGameჯერ ელოდება კონტეინერის რეალურ ზომას და მხოლოდ შემდეგ ტვირთავსGameEngine-ს. კომპონენტის unmount-ისას წყდებაResizeObserverდა ნადგურდება Phaser instance.GameSceneფლობს Phaser/Spine ობიექტების lifecycle-სა და subscription-ებს. scene shutdown-ისას listener-ები, tween-ები და Spine animation listener-ები იწმინდება.- dialog-ები mount-controlled არის: აქტიური dialog-ის კონტენტი პირობითად render-დება, ხოლო საერთო native
<dialog>კომპონენტი მართავს focus-ს, backdrop-ს, Escape-ს, scroll lock-სა და დახურვის ანიმაციას. - Dialog-ის submit action-ებიც საერთო close lifecycle-ს იყენებს.
transitionendარის დახურვის ნორმალური გზა, ხოლოtransitioncancelშეწყვეტილ transition-ს ასრულებს, რათა dialog უხილავად ღია არ დარჩეს.
- ძირითადი layout breakpoint-ებია
768pxდა1024px; დამატებითი breakpoint მხოლოდ კონკრეტული კომპონენტის რეალური სივრცითი საჭიროებისთვის გამოიყენება. 1024px-ზე ზემოთ გამოიყენება ორსვეტიანი desktop layout და ორი betting panel ერთ რიგში.1024px-სა და ქვემოთ game და stats სექციები ვერტიკალურად ნაწილდება, რათა კონტენტი მხოლოდ desktop ვერსიის დაპატარავება არ იყოს.- ამავე breakpoint-ზე fixed stats summary-ის სიმაღლე shared token-ით წინასწარ არის დაცული game area-ში, ამიტომ summary betting controls-ს არ ფარავს.
- ამავე დიაპაზონში game canvas-ის სიმაღლე მაქსიმუმ
500px-ია, რათა მაღალ tablet viewport-ზე game area ზედმეტად არ გაიზარდოს. 768px-ზე ქვემოთ betting panel-ები ვერტიკალურად ლაგდება და dialog-ები bottom drawer-ად იხსნება.700pxან ნაკლები სიმაღლის mobile viewport-ზე stats summary normal flow-ში ბრუნდება და game area usable მინიმალურ სიმაღლეს ინარჩუნებს, რათა game canvas თხელ ზოლად არ შეიკუმშოს.480px,400pxდა360pxგამოიყენება მხოლოდ იმ კომპონენტების მცირე ეკრანის კორექციებისთვის, რომლებსაც ამ ზომებზე დამატებითი სივრცის მართვა სჭირდებათ.
React Compiler კომპონენტებსა და hook-ებს build-ის დროს ავტომატურად ოპტიმიზირებს. ეს ამცირებს არასაჭირო re-render-ებს ყველა კომპონენტში ხელით useMemo, useCallback ან memo დამატების გარეშე.
Compiler პროექტში ჩართულია reactCompilerPreset-ით და @rolldown/plugin-babel-ით. ეს არის build-ის ოპტიმიზაცია და პროექტის კომპონენტურ არქიტექტურას არ ცვლის.
@alias პირდაპირsrcსაქაღალდეზე მიუთითებს და import-ებს უფრო მოკლესა და გასაგებს ხდის.- React Compiler
reactCompilerPreset-ისა და@rolldown/plugin-babel-ის საშუალებითაა ჩართული. - Phaser-ის ESM ფაილი
optimizeDeps-შია მითითებული, რათა development რეჟიმში dependency სწორად დამუშავდეს. - production build ცალკე
react-vendor,phaser-vendor,spine-vendorდა საერთოvendorchunk-ებს ქმნის. ეს dependency-ებს ერთმანეთისგან გამოყოფს და browser cache-ის გამოყენებას ამარტივებს. - build-ის კომენტარები იშლება, ხოლო
vite-plugin-compression21 KB-ზე დიდი ფაილებისთვის Gzip და Brotli ვერსიებს ქმნის. chunkSizeWarningLimitგაზრდილია Phaser-ის მოსალოდნელი დიდი vendor chunk-ის გამო. ეს მხოლოდ warning-ის ზღვარია და თავისით performance ოპტიმიზაციას არ წარმოადგენს.