ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 420
Obunachilar
+124 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
1 420
# ืชืืขืืืฃ
ืืื ืืงืฉืืื ืฉื ืขืืืื ืืขืืื ืืืืืจื ื ืืื ืฉืืื ืื ืกืืฃ. ืืฃ ืืื ืื ืืืืจ ืืืืชื ืขื ืืจืืฉื ืฉื "ืืืื ืืืฃ ืกืืืืชื ืืช ืื ืืขืืืื ืืขืืฉืื ืืคืฉืจ ืื ืื". ืชืืื ืืฉ ืขืื ืื ืืขืฉืืช ืืื ืื ืืืืื ื.
ืืืงืืฉื ืืื ืฉืขืืืื ืืื ืกืืคืืช ืืืจืืื ืืืชื ื ืืชืขืืฃ, ืืืืืจ ืื ืืื ืืืื ืืขืืืช ืืคืชืืจ ืืืืื ืืขืืืช ืืืฉืืืจ ืืฆื. ืืชืืขืืืฃ ืื ืจืง ืฉืืื ื ืืฆื ืืืืง ืฉืื ื, ืืื ืื ืฉืื ืืฉื ืื ืืืืช ืกืคืจ ืื ืืฉืื ืฉืื ืชืจืืื ื (ืืฉืืื ืฆืืื ืืืื ืืืืช ืกืคืจ ืืื ืฆืจืื ืืคืชืืจ ืืช ืื ืืืืื, ืื ืืืืืจ ืจืง ืืช ืืืืงืื ืืืฉืืืื ืืื ื).
ืืจืืจืช ืืืืื, ืื ืืชืืขืืืฃ ืื ืืืื, ืืื ืืคืชืืจ ืงืืื ืื ืืช ืืืขืืืช ืืืืืคืืช, ืืืจ ืื ืืช ืืืขืืืช ืืงืืืช, ืืืกืืฃ ืืช ืืืขืืืช ืืืกืืืืืช. ืืื ืืืฆืจ ืฉืชื ืืขืืืช:
1. ืขื ืืืื ืืืชืจ ืืืืชืจ ืืขืืืช ืืืคืืืช "ืืืืคืืช", ืคืฉืื ืืืื ืฉืืืช ืืืจื ืืืืืื ืฉื ืืขืืืช (ืืฉ ืืื ืฉืื ืฉืืืืฆืจืื ืืช ืืืขืืืช) ืืงืื ืืืก.
2. ืขื ืืืื ืืขืืืช ืืกืืืืืช ืฆืืืจืืช "ืจืืืืช" ืืืืคืืืช ืืืืชืจ ืืกืืืืืช.
ืืื ื ืืฆืจ ืืขืื ืืืืจื ืฉื ืืืืื ืฉืจืืคืืช - ืืื ืฉืื ืื ื ืืืืื ืืืชืจ ืฉืจืืคืืช ืื ื ืืฆืจืืช ืฉืจืืคืืช ืืืชืจ ืืืืืืช, ืฉืืืจืฉืืช ืืืชืจ ืืืก ืืืื, ืื ืฉืื ืืฉืืืจ ืืื ืืืชืืืื ืขื ืืืขืืืช ืืืกืืืืืช, ืฉืืืคืื ืืชืืจื ืืืขืืืช ืืจืื ืืืชืจ ืืืืืืช ืืืืืคืืช.
ืืคืืชืจืื ืืืืื, ืืื ืืืื ืืืืชืจ ืืื ืฉืื ืฉืจืืฆืื ืืืชืงืื ืืืฉืืืจ ืขื ืืืืื ืืื ืืืืื ืืขืืืื, ืืื ืชืืขืืืฃ ืืื ืืืชืจ. ืชืืขืืืฃ ืฉืื ืื ืื ื ืืืคืืื ืืืขืืืช ืืืฉืืืืช ืืืื ืืื ืฉืื ืื ืืชืืคืื ืขืืื ื ืืขืื ืืืืฉ ืื ืฉื ื. ืืืจืื ืืคืื? ืืืืืื. ืืขืืืช ืืืืคืืช ืื ืืงืืื ืืขื ื? ืืื ืกืคืง. ืืื ืืืืช ืฉืื ืืืจ ืงืืจื ืืื ืื ื ืจืฆื ืืืื ืื ืื. ืืืืื ืืฉ ืจืง 24 ืฉืขืืช, ืืื ืืฉื ื ืืื ืชืขืืื ืงืฉื ืขืืืื ืชืคืกืคืกื ืืจืื ืืขืืืช ืืืืคืืช.
ืื ืืืืืื ืืคืชืืจ ืืช ืื ืืืขืืืช. ืืฉืื ืืคืชืืจ ืืช ืืืฉืืืืช.
1 420
# ืืืจืื ืืืืื ืืืฉ: ืคืืชืื ืืืฉืืื Full Stack React ืขื Next.JS 14
ืืคื ื ืฉืืืข ืืฆืื ืจืฉืืืช ืืืจืกื 14 ืฉื next.js. ืฉืชื ืืืืจืกืืืช ืืืืจืื ืืช - 13 ื 14, ืืชืืงืื ืืืฆืืจืช ืชืฉืชืืช ืืคืืชืื ืืืฉืืื Full Stack ืืืืื ืืืจืฆืื ืืื ืงืื ืฆื ืฉืจืช ืืงืื ืฆื ืืงืื.
ืืขืืืื ืืชืืงืื ื-2 ืคืืฆ'ืจืื ืืจืืืืื: ืืืืงื ืืงืืืคืื ื ืืืช ืฆื-ืฉืจืช ืืงืืืคืื ื ืืืช ืฆื-ืืงืื, ืืืฆืืจื ืืืืืืืืช ืฉื API ืืืืฆืขืืช ืื ืื ืื Actions. ืฉื ื ืืื ืื ืื ืื ืืืืกืกืื ืขื ืืืืืืช ืชืฉืชืืช ืฉื ืจืืืงื ืืืจืืืืื ืืืืืืช ืืื.
ืืจืขืืื ืืืืฉ ืืจืืฉืื ืฉื ืื ืก ืขืื ื next 13 ืืื ืงืืืคืื ื ืืืช ืฆื ืฉืจืช, ืื ืืืชืจ ื ืืื ืงืืืคืื ื ืืืช ืฆื-ืฉืจืช ืืืื. ืืื ืงืืืคืื ื ืืืช ืจืืืงื ืฉืขืืืจืืช Server Side Rendering ืืื ืื ืขืืืจืืช Hydration ืืืคืืคื ืื ืฉืืื ืฆืืจื ืืฉืืื ืืช ื JavaScript ืฉืืื ืืืคืืคื. ืงืืืคืื ื ืืืช ืืื ืืืืืจืืช ืขื ืืื ืคืื ืงืฆืืืช ืืกืื ืืจืื ืืืช ืืืืืืืช ืืืฉืชืืฉ ืืื ืืืืืืืช ืฉื ืงืื ืฆื ืฉืจืช, ืืืืืจ ืืฉืื ืืกืื ืื ืืื:
export default () => {
const users = await listUsers();
return (
<p>{users.length} connected users</p>
);
};
ืืืฉืจ listUsers ืืืืื ืืืืืช ืคืื ืงืฆืื ืืกืื ืืจืื ืืช ืฉืืชืืืจืช ืืืกืืก ืื ืชืื ืื ืืืืฉืืช ืืื ื ืืืืข. ืชืืฆืื ืฉื ืงืืืคืื ื ืื ืืืืช ืืื ืคืฉืื HTML ืืื JavaScript ืฉืืฆืื ืืช ืืชืืฆืื.
ืืื ืื ืื ืืฉื ื ืฉื ืื ืก ื next 14 ืืคืืื ืืืชืจ ืืขื ืืื - ืืื ืืืคืฉืจ ืืงืืืคืื ื ืืช ืฆื-ืืงืื "ืืืคืขืื" ืคืื ืงืฆืืืช ืฆื ืฉืจืช ืืชืื ืงืื ืืืคืื ืืืืจืืข, ืืืืืจ ืืฉืื ืืกืื ืื ืืื:
export default () => {
const login = async () => {
const isConnected = await checkUser();
};
return (
<button onClick={login}>Login</button>
);
};
ืืืฉืจ checkUser ืืื ืคืื ืงืฆืืืช ืฆื ืฉืจืช ืฉืืืืื ืืืชืืืจ ืืืกืืก ืื ืชืื ืื ืืืืฉืื ืืื ื ืืืืข.
ืคืืชืื ืืคืืืงืฆืืืช React ืขื Next.JS ืืืื ื ืืชื ืื ื ืืคืฉืจืืช ืืืชืืงื ืืงืื ืืืขืจืืช ืขืฆืื, ืืื ืฉื ืฆืืจื ืืื ืืช ืฉืืืืช ืืืืืจืื ืืืืืืืจ API ืืื ืคืขืืื. ืืืขืจืืช ืื ืืืืืช ืื ืื ืื ืื ืืืื ืื ืืืืคืื ืืฉืืืืืช ืืืฆืืช ืกืืืืก ืื ืฉืืื ืืืืืจ ืืขืืื ืืฉืจ ืืืงืืคืกื.
ืืืืืข ื ืืกืฃ ืขื ืืื ืื ืื ืื ืืขื ืคืืชืื ืคืจืืืงื TypeScript ืขื Next.JS ืฉืืืื ืงืื ืฆื-ืฉืจืช ืืฆื-ืืงืื, ืืืืื ืื ืืฆืคืืช ืืืืจืื ืืืืื ืืืฉ ืฉืืขืืืชื. ืืืืจืื ืื ื ืืื ื ืคืจืืืงื ืืืฉ ืืืคืก ืืืืื ืงืืืคืื ื ืืืช ืฆื-ืฉืจืช, ืงืืืคืื ื ืืืช ืฆื-ืืงืื ืืืช ืืืืืืจ ืืื ืืื ืืขืืจืช Actions.
ืืืืจืื ืกืืืจ ืืื ืืื ืืืชืจ ืืืื ืื ืื ืืชื ืืืจ ืื ืืืื ืคืฉืื ื ืื ืกืื ืืืื ืง, ืืื ืื ืื ืืืื ืืืช ืืืืื ืืช ืืืื ืืืฆืืจืฃ (ืืื ืื ืืืืืฆื ืขื ืืืชื ืืื ืง):
https://www.tocode.co.il/boosters/next14-fullstack-react.
ืืื ืื ืื ืืชื ืื ืืืื ืืืชืจ ืืืฉ ื ืืฉืืื ืฉืืืืชื ืฉืืืื ืืฉืืืข ืขืืืื ืืืืจืืื ืืืืื ื ืืกืคืื ืื ืชืชืืืืฉื ืืืฉืืืจ ืืืืขื ืื ืืฉืืื ืื ืืืื.1 420
# ืจืืขืื ืฉื ืืืจื
ืืฉืืื ืจืืข ืฉื ืืืจื ืื ืืกืคืืง ืืืืืฉืฃ ืืืืืข ืืืฉ ืื ืืืฉืชืื ืข ืฉืืฉืื ืืืฉ ืืื ื ืืื. ืืื ืฉืื ืืืจื ืืืงืจืื ืขืื ืขืืืื ืขื ืืื ืืืืืจืื ืืืืื ืกืคืจ ืืืข, ืื ืืืืืืช ืืื ืืืชืื ืคืื ืงืฆืื ืื ืื ืืืืช ืืกืงืืื. ืื ืคืฉืื ืขืื ืคืจืื ืืืืข ืฉืืฆืืจืฃ ืืืื ืกืืฃ ืคืจืืื ืืืืข ืืืจืื ืืจืืฉ.
ืืฉืืื ืจืืข ืฉื ืืืจื ืืจืืฉ ืื ืืชื ืืืจืืฉื ืืชื ืืฉืืช. ืืชื ืืฉืืช ืืื ืืืืืข ืืืืฉ ืืืฉืื ืงืืื. ืืืืื ืฉืชืืฆืืชื ืืืชืืจ ืขื ืืืฉื ืืืืืคืชื ืืืืข ืืขืืืง ืืืชืจ.
ืืฉืื ืขื ืืืจืืช ืืื "ืืื - ืขืืฉืื ืื ื ืืืื ืืื ืฆืจืื Virtual DOM" ืื "ืืื - ืขืืฉืื ืื ื ืืืื ืืื ืืคืฉืจ ืืืืืช ืืืขืืื" ืืืขืืงืจ "ืขืืฉืื ืื ื ืืืื ืืื ืื ืฉื ืืกืืชื ืืขืฉืืช ืื ืืืื ืืขืืื".
ืืืืจืืช ืืืจืฉืืช ืืืืฅ. ืื ืืืจืฉืืช ืืืืชื ื ืืืคืฉ ืืืืืื ืืืืฉ ืื ืืืื ืืช ืืืืืชืืช ืืืฉื ืืช, ืื ืืืื ืืืฉืืฃ ืืืจืื ืฉืืืื ื ืืื ืืคืืื ืืฆืืจื ืื ืืืืขืช, ืืืืืืช ืืืื ืื ืืืืคืจื ืืืืชื ืืืืชืืช ืืฉืืืืข ืืืฉ ืืืืข.
"ืืืื ื ื ืกื, ืืืื ืื ื ืืืขื" ืื ืชืฉืืื ืืฆืืื ืช ืืฉืื ืฉืื ืืฆืืขืื ืจืขืืื ืืช ืืืืจืื (ืืืืื ืื ืขืื ืืคืฉืจ ืืืืจ ืืช ืืกืืืื).
1 420
# ืืืืืจ ืืืฉืืืจ: ืืื ืืืืจืื ืืช Google Chrome ื chromedriver ืืชืืื ืืชืื Dockerfile ื 2023
ืืจืื ืขืืื ืืืฉ ืืกืืจ ืืืฆื "ืืื ืจืืฉ" ืืงืื ืืืื ืจ ืืืงืจ, ืืื ื ืื ืืฉืจืืฆืื ืืืจืืฅ ืืืืงืืช ืืืืืืืืืช ืขื ืืืฉื ืืื ืืืฉืง ืืจืคื. ืืฉ ืื ืื ืืขื ืืืคืืืืืื ืฉื Dockerfile ืืจืฉืช ืฉืืจืืื ืืื ืืืชืงืื ืืช ืืจืื ืืืช ื chromedriver ืืื ืฉืืคืฉืจ ืืืื ืืืคืขืื ืืืชื ืืชืื ืกืื ืืื. ืืืขืื? ืจืืื ืืฉื ืื ืืื ืืืงืืื ืืืฉืืื ืฉืื ืื ืฉืืืื ืขืฉืชื ืื ืืืื ื URL-ืื ืืืจืืืืจืืืืจ.
ืืืืืจ ืืืืช ืืืืจืืช ืฉื ืืืืื ืืื ืืื ืืขืืืจ ืื ืืฉืืืจ ืืืจืื ืืฉืืืื ืืื ืฉืืืื ืื ืงื ืืืฆืื ืืืชื ืืืจื (ืืื ืื ืืฉืชืฃ ืืชืื ืืืืชื ืืืืจืื ืืื ืฉืื ืชืฆืืจืื ืืืืื ืืช ืืืื ืฉืื ื ืืืืืชื) ืื ื Dockerfile ืฉืขืื ืื ื ืืื ืื ืืืืืจ 2023 ืืื ืืืชืงืื ืืืืจืืฅ ืืจืื ืืืฆื ืืื ืจืืฉ ืขื ืืืืื ืื:
FROM ubuntu:23.04
WORKDIR /app
RUN apt-get update &&\
apt-get install -y xvfb gnupg wget curl unzip jq ca-certificates --no-install-recommends &&\
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - &&\
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list &&\
apt-get update -y && \
apt-get install -y google-chrome-stable && \
export CHROMEDRIVER_URL=$(curl https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json|jq -r '.channels.Stable.downloads.chromedriver | .[] | select(.platform == "linux64").url') &&\
wget -q --continue -P /chromedriver $CHROMEDRIVER_URL &&\
unzip /chromedriver/chromedriver* -d /chromedriver
# make the chromedriver executable and move it to default selenium path.
RUN chmod +x /chromedriver/chromedriver-linux64/chromedriver
RUN mv /chromedriver/chromedriver-linux64/chromedriver /usr/bin/chromedriver
RUN groupadd -r user && useradd -m -r -g user user && chown -R user /app
USER user
EXPOSE 9222
# default entry point.
CMD ["/usr/bin/google-chrome", "--headless", "--disable-gpu", "--disable-software-rasterizer", "--remote-debugging-port=9222", "--remote-debugging-address=0.0.0.0", "https://www.google.com"]
## end base stage.
ืืืจื ืฉืืื ืื ืืืชื ื ืคืขืื ืขื ืืืืืจ ืคืืจื 9222 ืืื ืืืคืฉืจ ืืืื ืืืืื ื ืืืจืช:
$ docker run --privileged --rm -p 9222:9222 headless-chrome
ืืืืกืืฃ ืืืืืฉื ืืืงืืื ืฉืื ืื ื ืคืืชื ืื ืืจื ืืื ืฉืืคืฉืจ ืืืื ืืืื ืืช ืืืจืื ืืืจืืืง:
ssh -L 9222:localhost:9222 user@host-running-the-container.com
ืืื ื ืงืืืืช ืืฉืืืืช-
1. ืืืืคืฆืื remote-debugging-address ืืฉืืจืช ืืคืงืืื ืืืคืฉืจืช ืืืชืืืจ ืืงืื ืืืื ืจ ืืชืื ืืืืื ื ืฉืืจืืฆื ืืืชื ืืื ืืืื ืืจืืืง.
2. ืืจืื ืืืื ืืืชืืื ื ืฉืืฉ ืื ืืฆื headless ืืืฉ ืืฆืจืื ืืืคืขืื ืืืชื ืขื ืืืืคืฆืื headless=new. ืื ืื ืืกืคืจืื ืฉืื ืชืขืฉื ืืช ืื ืื remote-debugging-adress ืืคืกืืง ืืขืืื ืืื ืืคืฉืจ ืืืื ืืืื ืืจืืืง.
3. ืืืืื ืืื ืคืขื ืื ืื ืื ืื ืืกืืจืื ืืื ืืืืืช ืืืื ืืืจืกื ืฉื chromedriver ืฆืจืื ืืืืจืื. ืื ืืืืืคื ืืช ืื ื endpoint ืืื ืฉืืืืืจ JSON ืขื ืื ืืืืืข.
ืืื ืืฉ ืืื ืขืื ืืืคืื ืขื ืืจืฆืช ืืจืื ืืื ืจืืฉ ืืชืื ืืืงืจ ืืืืื ืื ืืืื ืืืฉืืืจ ืืื ืืชืืืืืช.1 420
# ืืืื ืืืืชื: CSS Nesting ืืืจ ืขืืื ืืืคืืคื
ืืืคืฉืื ืืขืืจ ืืจืืืง ืืืฉืื ืกืืคืจ ืื ืขื Less ื Sass ืืืื ืฉืืื ืืืฉืชืืฉ ืืื ืื ืืคืฉืจ ืืืชืื ืกืืงืืืจ ืืชืื ืกืืงืืืจ ืืื ืืื ืืืื ืืจืืฉ ืืฉืขืชื. ืขื ืืืื ื ืคืจืื ื ื Less ืืืืื ื ืืงืื ืืช Sass ืื ืืื ืฉืืืืื ืื ืืื ืืืืืฃ ื CSS In JS ืื Tailwind ืืื ืขืืืื ืืฉ ืืฉืื ืงืกืื ืืืืชืื CSS ืืืฉ ืขืืืื ืื ืืขื ืคืจืืืงืืื ืขื ืงืืฆื css.
ืขืืฉืื ื ืืื Sass ืืืื ืืืื ืืืื ืคืืฆ'ืจืื ืืงืื ืื ืกืืงืืืจืื ืืื ืจืง ืืื ืืื, ืืื ืขืืืื ืงืฉื ืืืืืื ืฉ Sass ืืืื ืืื ื ืืื ืื ืกืืงืืืจืื ืืงืื ื ืื ืืืฉืชื ืื ืืื ืขืืืืื ื 2006.
ืืื ืื ืื ื ืืืจ ืื ื 2006 ืืืคืืื ืื ื 2016. ืืฉืชื ืื ื CSS ืืืจ ืขืืืืื ืืืื ืืืืื ืืืงืจื ืืืืืชื ืฉืื ืกืืงืืืจืื ืืงืื ื ืื ืืืจ ืขืืืืื ืืจืื ืืืคืืคื ืื ืืืืืจื ืืื. ืืื ืื ื ืจืื? ื ื ืืืขื ืืื ืฉืื ื ืจืื ื Sass, ืจืง ืืื ืืคืจืืงืืืคืืืืจ.
ืงืื HTML:
<form>
<label for="name">Name:
<input type="text" id="name" />
</label>
<label for="email">email:</label>
<input type="text" id="email" />
</form>
ืงืื CSS:
input {
/* styles for input not in a label */
border: tomato 2px solid;
}
label {
/* styles for label */
font-family: system-ui;
font-size: 1.25rem;
input {
/* styles for input in a label */
border: blue 2px dashed;
}
}
ืืืืื ืงืืืคื:
<iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/ynonp/embed/abXZbvo?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/ynonp/pen/abXZbvo">
Untitled</a> by Ynon Perek (<a href="https://codepen.io/ynonp">@ynonp</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
https://codepen.io/ynonp/pen/abXZbvo
ืืื ืืคืจืืื ืืืืืืืื ืืื Sass ืฉืืื ืืืขืืฃ ืืื ืืชืืขืื ืืงืืฉืืจ:
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting1 420
# ืืืค JavaScript - ื ืืกืื ืขื ืขืจื ืืจืืจืช ืืืื
ืืขืืืื ืขื ืงืื ืืกืื ืืจืื ื ื JavaScript ืืืคืื ืืฉืืืืืช ืืื ืืืจืื, ืืืขืื ืฉืืื ืื ืื ืืงืืื ืืฉืคื ืืืืคืื ืืฉืืืืืช ืืงืื ืืกืื ืืจืื ื ืงืฆืช ืืกืืจืื. ื ืชืืื ื ืืงืื ืืื:
async function sleepOrDie(ms, result) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve(result);
} else {
reject();
}
}, ms)
})
}
async function handleClick() {
const value = await sleepOrDie(50, 10);
alert(value);
}
document.querySelector('button').addEventListener('click', handleClick);
ืื ื ืืืืข ืื ืืชืืืื ืืืืืื ืืื ืืกืคืืง ืืฉืืื ืืืืื. ืื ืืคืื ืงืฆืื ืืืกืื ืืจืื ืืช ืืฆืืืื ืื ืืงืืืื ืขืจื, ืืื ืื ืืื ื ืืฉืืช ื ืืจืง Exception. ืื ืขืืื ืื ืืืืคืื ืฉืื ื ืืฉืืืืืช ืืื ื flow ืืืจ ืืื catch ืืืื ืืืคืขืื ืืช ืืืชื flow. ืืื ืื ืื ืื ื ืคืฉืื ืจืืฆื ืืชืช ื value ืขืจื ืืจืืจืช ืืืื ืื ืืืชื ืฉืืืื? ืืืฉื ืื ืื ื ืื ืกื ืืงืจืื ืขืจื ืืืกืืก ื ืชืื ืื ืื ืืืืืจืืช ืืฉืชืืฉ ืืื ืืขืจื ืื ืฉื ืืื ืืกืืจ ืืืงืื ืืืฉืื ืขื ืืืชื ืืจืืจืช ืืืื. ืืืฆื ืืื try/catch ืืืื ืืืืจืืืช ืืกืืจืื:
async function handleClick() {
let value = 0;
try {
value = await sleepOrDie(50, 10);
} catch (err) {
}
alert(value);
}
ืืืืื ืช ื ืืื ืืช ืืงืื ืืื ืืืชืจ, ืืื ืืืืื ืช ืืชืืืืจ ืื ืคืฉืื ื ืจืื ืจืข: ื const ืืคื ื let ืืืืจื ืืื ืกืืื, ืืื ื ืชืงืืข ืขื ืืืืง catch ืจืืง.
ืืื ืืงื ืืืื ืืื ืืืกืชืืจ ืงืื ืืืืขืจ ืืื ืืืจืืง ืืืชื ืืคืื ืงืฆืื. ืจืืคืงืืืจืื ื ืงืฆืจ ืื ืงืื:
async function tryOr(fn, args, defaultValue) {
try {
return await fn.apply(null, args);
} catch (err) {
return defaultValue;
}
}
async function handleClick() {
const value = await tryOr(sleepOrDie, [50, 10], 0);
alert(value);
}
ืืืืืืื ืืืช ืืืืืื ืืืืกืืฃ ืืช ืืคืื ืงืฆืื ืืื ืืคืจืืืืืืืค ืฉื ืคืื ืงืฆืื ื JavaScript ืืื ืฉืชืืื ืืืื ื ืื ื ืืื ืืงืื ืืชืืื ืืช:
Function.prototype.tryOr = async function (args, defaultValue) {
try {
return await this.apply(null, args);
} catch (err) {
return defaultValue;
}
}
async function handleClick() {
const value = await sleepOrDie.tryOr([50, 10], 0);
alert(value);
}1 420
# ืืฆืฆื ืืขืชืื: ืคืขืืืืช ืฆื ืฉืจืช ืืจืืืงื ื Next.js 14
ืืคื ื ืืื ืืืื ืืชืืชื ืืื ืขื ืคืขืืืืช ืฆื-ืืงืื, ืคืืฆ'ืจ ืืืื ืฉื ืจืืืงื ืฉืืืื ืืืกืื ืื ื ืืื ืืงืืงืืช ืืืชืืืช ืงืื ืฉืืืคื ืืืคืกืื. ืืืืง ืืฉื ื ืฉืื, ืฉื ืงืจื Server Actions, ืืืจ ืืจืื ืืืชืจ ืืืคืื ื ืืืืจืฉ ืชืืืื ืืคืจืืืืืืจืง ืืฆื ืฉืจืช. ืืืืืช Next.JS 14 ืฉืืฆื ืขืืฉืื ื ืืื ืืจืืืช ืืื ืื ืขืืื ืืืืืื ืืช ืืืืืื ืฉื ืจืืืงื ืืชืืจ Full Stack Framework.
## ืืกืืคืืจ ืืืืืจื
ืคืขืืืืช ืฆื-ืฉืจืช ืื ืื ืื ืื ืฉืื ืงืืืคืื ื ืื ืจืืืงืืืช ืืืืฉื ืืืคืก ืืฉืจืช, ืืื ืชืืืื ืืืฉืช ืืืืคืก ืืงืืืช ืืชืฉืืื ืื ืืื ืขื ืืื ืืคืจืืืืืืจืง. ืืืชืืืช ืคืขืืืืช ืฆื ืฉืจืช ืื ืื ื ืฆืจืืืื ืืืชืื ืจืง ืฉื ื ืืืจืื:
1. ืืช ืงืื ืืงืืืคืื ื ืื, ืืืื ืฉืืืืฉ ื Hook ืืืืื ืืื ืืืฆืื ืืืฉืง ืฉืื ื ืืืฆื ืืขืื ื.
2. ืืช ืืคืื ืงืฆืื ืืฉืจืช (ื node.js) ืฉืืืคืืช ืืืืฉืช ืืืืคืก.
ืื ืื ืืฉื ืฉื ืฉืืืืช ืืืืขื ื http, ืกืจืืืืืืฆืื ืฉื ืืคืจืืืจืื, ืืืชื ื ืืคืืขื ืื ืชืฉืืืืช ืืืืฆืข ืืฆืืจื ืืืืืืืืช ืขื ืืื ืืคืจืืืืืืจืง.
## ืืืืืช ืงืื
ืงืื? ืืจืืจ. ืืคืจืืืงื next.js ืื ืื ื ืฆืจืืืื ืืกื ืืื ืฉื ื ืงืืฆืื. ืืงืืืฅ
page.tsx ืขื ืืงืืืคืื ื ืื ืฉื ืืขืืื ืืืงืืืฅ server_actions.ts ืฉืืืืืจ ืืช ืืงืื ืฉืืืคื ืืืืคืก ืืฆื ืืฉืจืช.
ืืงืืืฅ server_actions.ts ืื ื ืืืชื:
'use server'
const process = require('node:process');
export async function createItem(data: FormData) {
console.log(`Client sent form: ${JSON.stringify(Object.fromEntries(data))}`);
console.log(`I'm a server action pid = ${process.pid}`);
await new Promise((resolve, reject) => {
setTimeout(resolve, 3000)
});
return `${process.pid}/${data.get('name')}`
}
ืืชืืืืืช 'use server' ืืืืจืช ื next.js ืฉืืช ืืคืื ืงืฆืื ืืืืช ืฆืจืื ืืืจืืฅ ืืฆื ืฉืจืช. ืืคืื ืงืฆืื ืขืฆืื ืืฉืชืืฉืช ืืืืจืื ืฉื ืฆื ืฉืจืช ืืืืืื process.pid, ืืืงืืืช ืืชืืจ ืงืื ืืฉืื ืืกืื FormData - ืืื ืืขืจืืื ืืืืคืก ืฉืืืืขื ืืืืงืื.
ืืงืืืฅ page.tsx ืืืื ืื ืงืื ืงืฆืช ืืืชืจ ืืจืื ืฉืืืืืจ ืฉืชื ืงืืืคืื ื ืืืช. ืืงืืืคืื ื ืื ืืจืืฉืื ื ืืื ืืืืคืก:
export default function Page() {
const [id, setId] = useState('');
async function onSubmit(formData: FormData) {
const nextId = await createItem(formData);
setId(nextId);
}
return (
<form action={onSubmit}>
<Header />
{id != '' && <p>Ready. Id = {id}</p>}
<input type="text" name="name" />
<button type="submit">Submit</button>
</form>
);
}
ืื ื ืืืืืจ action ืืืืคืก ืืืชืื ืืคืื ืงืฆืื ืคืฉืื ืืคืขืื ืืช ืืคืื ืงืฆืื ื server_actions.ts ืืฉืืืจ ืืช ืืชืฉืืื ืืืฉืชื ื. ืืืืืจื ืืงืืขืื ืจืืืงื ืืฉืื ืืช ืืืืคืก ืืฉืจืช, ืืคืื ืงืฆืื ืชืจืืฅ ืืฉืจืช ืืชืืืืจ ืืช ืืชืืฆืื ืืชืฉืืื ืืืงืฉื, ืืื ืืจื ืืจืฉืช ืืขื ืกืจืืืืืืฆืื ืืืืืืืืช.
ืืฉืืื ืืืฆืื ืืกื ืืขืื ื ืืฉืืืืืข ื ืฉืื ืืฉืจืช ืื ืืชื ืืช ืืงืืืคืื ื ืื Header ืขื ืืงืื ืืื:
function Header() {
const status = useFormStatus()
if (status.pending) {
return <p>Loading...</p>
}
}
ืืคืื ืงืฆืื useFormStatus ืืืืขื ื react-dom (ืจืง ืืืืจืกืืืช ืืืฉืืช ืฉื ืจืืืงื), ืืืืืืจื ืืืืืงื ืขื ืืกืคืจ ืฉืืืช ืฉืืกืคืจ ืื ืืฆื ืืืฉืช ืืืืคืก ืืืืจืื ืฉืืืืฉ.
ืฉืืจื ืชืืชืื ื ืื ืื ืื Server Actions ืืืคื ืืช ืจืืืงื ืืืจืื ืืืชืจ ืคืจืืืืืืจืง ืืื ืืคืืชืื Full Stack ืืืฉืจ ืกืคืจืื ืงืื ื ืืืืืฉื ืืคืืชืื ืฉืืืช ืืชืฆืืื. ืืืื ืืขื ืืื ืืจืืืช ืืช ืืืฉืืืืช ืฉื ืื ืขื ืืืงืืกืืกืื. ืืฆื ืืื ืืื ืกืคืง ืฉืืจืื ืืืชืจ ืงื ืืื ืืช ืคืจืืืงื Full Stack ืืืคืก ืืฉืื ืืืืื ืื ืื ืื ืืคื ืืื, ืืื ืืฆื ืฉื ื ืืจืื ืื ืฉืื (ืืืื ืื ื) ืืชืืขืืขื ืืืืืฉืืช ืืืื ืืืืืกืืืช ืฉื ืจืืืงื ืืืฉื ืืืืื. ื ืืฉืื ืืขืงืื.1 420
# ืืืื ืืืืชื: ืืคืืืก ืืงืื ืืกืงืืื
ืืืื ื ืืชืื ืชืืื ืืช ืกืงืืื ืฉืืืืืงื "ืืืจืื" ืฉืืืืืื ืืืืฉืืจ ืืฉืจืช ืืจืืืง. ืืคืฉืจ ืืืืืื ืงืืืก ืฉื ืืฉืชืืฉ ืฉืืจืื ืื:
case class User(name: String)
ืืืืื ืงืืืก ืฉื ืืกืื:
class Document(title: String, content: String)
ืืฉืืื ืืฉืืืจ ืืืชื ืืฉืจืช ืืจืืืง ืื ื ืฆืจืื ืืืืกืืฃ ืืื ืืื ืืื url, ืืืฉืืื ืื ืืฉื ืืช ืืช ืืงืืืกืื ืื ื ืืืื ืืืฉืชืืฉ ื Generic ืืืืฆืืจ ืืืจืกื "ืืจืืืงืช" ืฉืืื, ืืืืืจ:
case class Remote[S](value: S, url: String)
ืื ืขืืฉืื ืืฉืื ืฉืืื Remote[User] ืืืืืง ืฉืื ืืฉื value ืืกืื User ืืื ืฉืื ืืฉื url ืืกืื String. ืืืืื ื ืจืฆื ืืืชืื ืคืื ืงืฆืื ืืืืืช ืฉืืืืื ืืงืื ืืฉืื ืฉืืื Remote ืืืฉืืืจ ืืช ืืขืจื ื value ืืฉืจืช ืืืจืืืง ืืืืฆืขืืช HTTP Post. ืืืื ื ืขืฉืืืื ืืืฉืื ืฉืืืชืืื ืฉื ืคืื ืงืฆืื ืืื ืชืืจืื ืื:
def save(what: Remote[Any]): Unit =
println(s"Saving ...")
ืืื ืื ื ื ืกื ืืืฆืืจ ืืฉืชืืฉ ืืืฉืืืจ ืืืชื ื ืงืื ืฉืืืืช ืงืืืคืืืฆืื. ืืืืืจ ืืงืื ืืื:
@main def main()=
val a = Remote[User](value = User("ynon"), url = "/admin")
save(a)
ืื ืืฆืืื ืืืชืงืืคื ืืืื ืืฉืืืื:
Found: (a : Remote[User])
Required: Remote[Any]
save(a)
ืื ืงืจื ืืื? ืืคืื ืงืฆืื ืืฆืคื ืืงืื ืืฉืื ืืืืคืืก Remote[Any]. ื ืืื ืฉ User ืืื ืกืื ืฉื Any ืืื ืืืชื ืื ื ืคืื ืงืฆืื ืฉืืงืืืช Any ืื ืืืชื ืืขืื ืืืขืืืจ ืื ืืฉืื ืืกืื User, ืืื ืืืืคื ืจืืื Remote[User] ืืื ื ื ืืฉืื ืืกืื Remote[Any].
ืคืืชืจืื? ืืืขืฉื ืฉื ืืื. ืืื ืงื ืืืืืืจ ืืช ืืคืื ืงืฆืื ืืชืืจ ืคืื ืงืฆืื ืื ืจืืช ืืื ืืืชืขืกืง ืขื ืืจืืฉื ืืืืืจ ื ืฉื ื ืืช save ื:
def save[S](what: Remote[S]): Unit =
println(s"Saving ...${what.value} to ${what.url}")
ืืืื ืืชืงืืคื ืืขืืื.
ืืคืืชืจืื ืืฉื ื ืืืื ืืกืืคืืจ ืฉื ืืคืืกื ืืื ื ืืขื ืืืงืจืื ืืื ืื ืืฆืืืชื ืืืคืื ืืช ืืคืื ืงืฆืื ืืื ืจืืช ืืื ืืื ื ืกืืืืช ืื ืฉืืฉ ืืื Use Case ืืืคื ืฉืื ื, ืืืชื ืืืืช ืจืืฆืื ืืืืื ืืฉืื ืืืจ ืขื ืืืืคืืก Remote[S] - ืืืืชื ืจืืฆืื ืืืืื ืฉืื ืืฉ ืืื ืคืื ืงืฆืื ืฉืืฆืคื ืืงืื Remote[S] ืื ืืฉื ื ืื ืื S, ืืืฉ ืืื ืืฉืื ืืืจ ื ืงืจื ืื T ืฉืืืจืฉ ื S, ืื Remote[T] ืืืจืฉ ื Remote[S]. ืืืฉืืื ืืืืื ืืช ืื ืืกืงืืื ืืคืฉืจ ืืืืกืืฃ ืกืืื + ืืคื ื ื S ืืืืืจืช ืืืืคืืก ืืื ืจื. ืื ื ืจืื ืื:
case class Remote[+S](value: S, url: String)
case class User(name: String)
class Document(title: String, content: String)
def save(what: Remote[Any]): Unit =
println(s"Saving ...${what.value} to ${what.url}")
@main def main()=
val x: Any = User("ynon")
val a = Remote[User](value = User("ynon"), url = "/admin")
save(a)
ืืื ืืืืจืกื ืืื ืืชืงืืคืืช ืืขืืืืช. ืืืื ืง ืืืจืื ืืกืงืจื ืื ืฉืจืืฆืื ืืงืจืื ืขืื ืขื ืืื ืื ืื ืืื ืืชืืขืื ืฉื ืกืงืืื, ืขื ืืืื ืืก ืฉืืคืฉืจ ืืจืฉืื ืืืงืื ืืคืืืก, ืืขื ืืฉืืืช ืืื ืืืืช ืฉื ืฉื ืืื ืืืื ืชืืขืื Variances ืืืกืืืจ ืืกืงืืื:
https://docs.scala-lang.org/tour/variances.html1 420
# ืจืืืงื ืืื ืืขืชืื - ืคืขืืืืช ืฆื ืืงืื
ืืื ืืืืจืื ืืืขืืืคืื ืืจืืืงื ืชืืื ืืื ืืืืืืจ ืืืืคืก ืืื State ืืชืืื ืฉื ืจืืืื ืืงืื. ืืื ืกืคืืจ ืกืคืจืืืช ื ืืชืื ืืื ืืขืืื ืืื ืืืชืจ ืขื ืืคืกืื, ืืืื ืกืคืืจ ืืชืื ืชืื ืืืชืื ืชืืช ืืชืืขืืขื ืืืืื
ng-model ืฉืืืกืื ืื ื ืืช ืืื ืืจืืฉ.
ืืืืืืง ืืฉืืืขื ืืืืื ื ืชืงืืื ืืืืขื ืื ืืืจืืื ืืฆืืืช ืืืืจืื ืขื ืคืืฆืณืจ ืืืฉ ืฉืืืื ืงืฆืช ืืขืืืจ ืืืกืื ืืืง ืืขืืืืช ืืืืืืจ ืฉื ืืืคืกืื - ืืืื Client Side Form Actions. ืื ืขืืื ืืื:
1. ืืคืฉืจ ืืืื ืืืืืืจ ืืืืื ื form ืืืคืืื action ืฉืืืื ืคืื ืงืฆืื ืืกืื ืืจืื ืืช.
2. ืคืื ืงืฆืื ืื ืชืืคืขื ืืฉืืืฉืื ืื ืกื ืืืืืฉ ืืช ืืชืืื, ืืชืืื ืืขืืื State.
3. ืื ืืคืื ืงืฆืื ืืืจืงืช ืฉืืืื ืืฉืืืื ืชืืืฉื ืืฉืืืืช render ืืชืืชืคืก ื Error Boundary ืืงืจืื.
ืงืื? ืืื ืื ื ืืืืืื:
import { useState } from "react";
export default function Todo() {
const [name, setName] = useState([]);
async function copy(formData) {
console.log(formData);
setName(formData.get("name"));
}
return (
<>
<form action={copy}>
<label>
Type your name:
<input name="name" />
</label>
<button type="submit">submit</button>
</form>
<p>Hello {name}</p>
</>
);
}
ืืฉืืืืฆืื submit ืืืคืขืืช ืืคืื ืงืฆืื ืฉืืขืืื ืช ืืช ืืฉืชื ื ืืกืืืื. ืืคืื ืงืฆืื ืืงืืืช ืืช ืื ืืืืืข ืืืืืคืก ืืืืืืืืช ืืจื ืืคืจืืืืืืจืง ืืื ืื ืฆืจืื ืืืืจ ืืื ืกืืืื ืืืืืข ืฉืืฉ ืืงืืืื.
ืืงืื ืืืจืฉ ืืช ืืืจืกื 18.3 ืฉื ืจืืืงื ืฉืขืืืื ืื ืืฆืื, ืืื ืืคืฉืจ ืืจืืืช ืืืจืกื ืขืืืืช ืฉืื ืขื ืืืจืกืช ืืคืืชืื ืฉืืื ืืื:
https://codesandbox.io/s/vibrant-glade-dhrfz7?file=/src/App.js.
ืืืจืืช ืฉืื ื ืจืื ืคืืฆ'ืจ ืงืฆืช ืืืืชืจ, ืื ื ืืืฉื ืฉืืืจ ืืืื ืืื ืืืคืื ืืคืื ืืง ืงืื ืฉืืืื ืืฉืชืืฉืื ืื - ืื ืืืืฉืืืื ืงืื ืื ืืื ืืฉืืืื ืขื ืจืืืืงืก ืื ืคืจืืืืืืจืงืื ืืืืืื ืืืชืจ, ืื ืืื ืคืฉืื ืืืกื ืืืง ืื Boilerplate ืฉืืืื ื ืืชืื ื ืื ืืืื.1 420
# ืืืค ืงืืืื ื ืืื - ืืืื ืื ื ืจืื ืืฉืื ื ืืฉื?
ืจืื ืืืชืื ืชืื ืื ืืืืืื ืฉืืงืื ืื ืคืขื ืืขืืื. ืื ืืืืืื ืฉืืคืฉืจ ืืืื ืืืชืื ืืืจืกื ืฉืขืืืืช ืืืฉืืื ืืืชื ืื ืืชืืืืืื ืืืื ืื ืืืืจืื ืืืชืื ืืืจืกื ืฉืขืืืืช, ืื ืืฉื ื ืืื ืืื ืืืืืกืืืช. ืืคืชืืืช ืืฆืคื ื? ืืื ืชืืื ื ืฉืื ืืืชื ืืงืื ืืืจื ืฉืืขืืื ื ืืฆื ืื ืืขืฉืืช ืืืชื. ืืชืืืืช ืฉื ืฉืจืชืื? ืชืืชืื Hard Coded ืืื ืชืืื ืืืจื ืฉืืขืืื ื ืื ื ืืกื ืืืืจืืช ืืกืืืจ. ืืืคืื ืืฉืืืืืช? ืืฆืืงืช ืืืชื. ืืื ื ืจืื ืฉื flow ืืชืงืื ืขืืื ืื ืฆืจืื ืืขืืื ืกืชื.
ืืืขืื ืฉืืืจื ืฉืืฉ flow ืืื ืืืื ืฉืขืืื ืื ืื ืื ืฉืืืื ืฉืืฉืื ืขืืื ืฉืืฉืจ ืจืฆืื ืืืจืืืช ืืืืก, ืืงืืืื ืืืื ืฉื ืคืืืืงืื ืืืขืืื ืื ืืืื ืืื ืืื ืืืืกืืฃ ืืช ืืืืคืื ืืฉืืืืืช.
ืืื ืืื ืืืืคืื ืืื ืงืืื ืืงืืืื ื ืืื ืืืชืจ ืืื ืืืคื ืืฉืืืืืช ืืืื ืฉืืืชืืื ืืช ืืงืื. ืื ืืชืืชื ืืคืืืชืื ืืช ืืฉืืจื:
with open('/etc/passwd') as f:
...
ืืืฉ ืืืืชื ืจืืข ืื ื ืืฉืื - ืืืื ืื ืืืื ืืืืฉืืจ? ืื ืื ืืื ืื ืืจืฉืืืช ืืงืืืฅ? ืื open ืืขืฉื? ืืื ืื ืืงืืืฅ ืื ืงืืื, ืื open ืืขืฉื? ืืื ืื ืื ืชืื ืืื ืืืื ื ืชืื ืืชืืงืื, ืื open ืืขืฉื?
ืืืฆืขื ืืื ืืืจืฉ ืฉืืืื ืฉื ืกืืื ืืช ืืืืืืื ืขืฆืื, ืืื ืืืืจื ืฉืืื ืืช ืื - ืืืงืื ืืืชืื ืงืืื ืื ืืช ืชืืื ืืืืืื, ืื ื ืืชืืื ืืืงืื ืฉืืืคื ืืื ืืืจืืื ืืื ืืฉืืจื ืฉืื ืืืืื ืืืืฉืืจ ืืืืืื ืฉืืื ืืจื ืืชืืื ืืช ืชืชื ืื ืืื ืฉืื ื ืจืืฆื ืฉืชืชื ืื. ืจืง ืืืจื ืฉืกืืืืชื ืืืคื ืืืืฉืืื ืืช ืื ื ืืืฉืื ืืืคื ืืืฆื ืืชืงืื.
ืืื ืืืืค ืืื ืื ืจืืืื ืื ืืฉืขืืฉืื ืคืจืืืืืืืค ืืืขืจืืืช, ืืื ืฆืจืื ืืฉืื ืื ืฉืื ืืคืจืืืืืืืคืื ืฉืืื ื ืืืื "ืืืคืื" ืืืืจืกื ืืืืืชืืช, ืืืื ืฉืืื ืืื ืืช ืชืืืื ืคืืชืื ืืื ืืืชืจ ืื ืขืืืจื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
