ΠΠ°ΡΠΊΠ°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° React & Vite Ρ ΡΠ΅Π½Π΄Π΅ΡΠΎΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ (SSR) ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ (SPA). ΠΡΠΊΡΡΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ.
ΠΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΡΠΊΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ react-skeleton, ΡΡΠΎΠ±Ρ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
- Node.js >= 18
npm install
Π ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
npm start
ΠΈΠ»ΠΈ
npm run start:server
Π‘ ΡΠ΅Π½Π΄Π΅ΡΠΎΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ (SSR)
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ src/config.js
.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΠΠ, Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ, ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ².
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» .env.local
,
ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ΄ ΡΠ΅Π±Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:8050
.
ΠΠΎΡΡ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° server/config.js
.
Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΠΊΡΠΈ ΠΊ ΠΠΠ Π΄Π»Ρ ΠΎΠ±Ρ
ΠΎΠ΄Π° CORS.
server: {
port: 8050,
proxy: {...}
}
Π ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ±ΠΎΡΡΠΈΠΊ Vite Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄Π΅ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ βΠ³ΠΎΡΡΡΠ΅Π³ΠΎβ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅.
ΠΠ»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
npm run build
ΠΈΠ»ΠΈ
npm run build:server
- Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ΅Π½ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠ° (SSR). ΠΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΡΠ±ΠΎΡΠΊΠ° Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΠΎΠΉ ΠΈ
ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π‘ΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠΊΠ°ΠΆΡΡΡΡ Π² ΠΏΠ°ΠΏΠΊΠ΅ /dist
. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
npm run preview
- Π·Π°ΠΏΡΡΡΠΈΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π΄Π»Ρ ΠΎΡΠ΄Π°ΡΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ· /dist/client.
ΠΡΠΈ ΡΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΡΠ±ΠΎΡΠΊΠ° Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΈΠ»ΠΈ
npm run preview:server
- Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π΄Π»Ρ ΡΠ΅Π½Π΄Π΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΡΠ΄Π°ΡΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ².
ΠΡΠΈ ΡΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΡΠ±ΠΎΡΠΊΠ° Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΠΎΠΉ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΆΠ΅ ΡΠΎΠ±ΡΠ°Π½ΠΎ, ΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ts-node ./server/index.ts
.
ΠΠ»Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ΅Π½Π΄Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² pm2.
pm2 start process.json
ΠΠ° Π²Π½Π΅ΡΠ½ΠΈΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΠΏΠ°ΠΏΠΊΠΈ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ:
- /dist
- /node_modules
- /server
- /typings
- tsconfig.json
- package.json
- proxy.config.ts
ΠΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠ° (SSR) Π½Π΅ Π½ΡΠΆΠ΅Π½, ΡΠΎ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ /dist/client
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ nginx.
Π ΡΠ΅ΠΆΠΈΠΌΠ΅ Π±Π΅Π· ΡΠ΅Π½Π΄Π΅ΡΠ° Nginx Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ΄Π°Π²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»Ρ ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ ./dist/client
.
ΠΡΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ Π½Π΅ Π½Π° ΡΠ°ΠΉΠ», ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ΄Π°Π²Π°ΡΡ ./dist/client/index.html
.
ΠΡΠΈΠΌΠ΅Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ nginx
server {
listen 80;
server_name react-skeleton.com;
location / {
root /home/user/react-skeleton/dist/client;
try_files $uri /index.html;
}
}
Π ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π½Π΄Π΅ΡΠ° (SSR) Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° node.js ts-node ./server/index.ts
.
Π§Π΅ΡΠ΅Π· nginx Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ°ΠΉΡΠ° ΠΏΡΠΎΠΊΡΠΈΡΡΡΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠ°.
ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠ° ΡΠ°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ Π»ΠΈΠ±ΠΎ ΡΠ΅Π½Π΄Π΅Ρ, Π»ΠΈΠ±ΠΎ ΠΎΡΠ΄Π°ΡΡ ΡΠ°ΠΉΠ»Ρ ΠΈΠ· ./dist/client/assets/, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΏΡΠΎΠΊΡΠΈΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΡ ΠΊ ΠΠΠ.
ΠΠ»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΄Π°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ ΠΠΠ Π»ΡΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ΅ΡΠ΅Π· nginx.
server {
listen 80;
server_name react-skeleton.com;
client_max_body_size 10M;
# ΠΡΠΎΠΊΡΠΈ ΠΊ ΠΠΠ (Π² ΡΠΎΠΎΡΠ². Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ)
location /api/ {
proxy_redirect off;
proxy_set_header Host api.react-skeleton.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass https://api.react-skeleton.com;
}
# ΠΠ°ΠΏΡΠΎΡΡ ΠΊ ΡΠ°ΠΉΠ»Π°ΠΌ ΡΠ±ΠΎΡΠΊΠΈ (ΡΠΊΡΠΈΠΏΡΡ, ΡΡΠΈΠ»ΠΈ, ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ..)
location /assets/ {
root /var/www/newsite/dist/client/;
try_files $uri $uri/ =404;
}
# Π Π΅Π½Π΄Π΅Ρ - ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° Π² ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 127.0.0.1:8050
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_pass http://127.0.0.1:8050;
}
}