uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
ToCode
1 419
# ื—ื™ื“ืช ื“ื•ืงืจ: ืฉื™ื ื•ื™ ื”ืจืฉืื•ืช ื‘ืชื™ืงื™ื” ื—ื“ืฉื” ื ื™ืฆื•ืจ 3 ืงื‘ืฆื™ื. ื”ืจืืฉื•ืŸ ื”ื•ื Dockerfile:
FROM ubuntu:22.04

WORKDIR /app

COPY . .

RUN chmod +x /app/startup.sh

CMD ["/app/startup.sh"]
ื”ืฉื ื™ ื ืงืจื startup.sh ื•ืžื›ื™ืœ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
#!/bin/bash

echo Hello World
ื•ื”ืฉืœื™ืฉื™ docker-compose.yml ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
version: "3.9"

services:
  app:
    build: .
    volumes:
      - .:/app
ืื ื™ ืžืคืขื™ืœ:
$ docker compose build
$ docker compose run
ื•ืžืงื‘ืœ ืืช ื”ืฉื’ื™ืื”:
[+] Running 1/1
 โ ฟ Container chmod-in-run-app-1  Recreated                                                                         0.2s
Attaching to chmod-in-run-app-1
Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/app/startup.sh": permission denied: unknown
ืžื” ืงืจื” ืฉื? ืื™ืš ื ืชืงืŸ? ## ื”ืกื‘ืจ ื•ืคื™ืชืจื•ืŸ ืงืœ ืœืจืื•ืช ืฉื”ื‘ืขื™ื” ื”ื™ื ืฉืœืงื•ื‘ืฅ startup.sh ืื™ืŸ ื”ืจืฉืืช ื”ืจืฆื”, ืื‘ืœ ืžืขื ื™ื™ืŸ ืœื”ื‘ื™ืŸ ืื™ืš ื–ื” ืงืจื” ืžืื—ืจ ื•ื” Dockerfile ื›ื•ืœืœ ืืช ื”ืฉื•ืจื”:
RUN chmod +x /app/startup.sh
ื•ืœืชืขืœื•ืžื” ื”ืคืขื ื™ืฉ ื”ืกื‘ืจ ืคืฉื•ื˜ - ื” Dockerfile ื™ืฆืจ ืื™ืžื’', ื”ืขืชื™ืง ืืช ื”ืงื•ื‘ืฅ startup.sh ืœืชื•ืš ื”ืื™ืžื’' ื•ืฉื™ื ื” ื‘ืื™ืžื’' ืืช ื”ืจืฉืื•ืช ื”ื”ืจืฆื”. ืื‘ืœ ืื– ื‘ื ื” docker-compose.yml ื•ื”ื—ืœื™ื˜ ืœืžืคื•ืช ืืช ืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ื”ื ื•ื›ื—ื™ืช ื‘ืชื•ืจ volume ืœ /app. ืžื™ืคื•ื™ ื–ื” ื“ืจืก ืืช ื”ืงื•ื‘ืฅ startup.sh ืขื ื”ืจืฉืื•ืช ื”ื”ืจืฆื” ื•ื”ืกืชื™ืจ ืื•ืชื• ื‘ืืžืฆืขื•ืช ื”ืงื•ื‘ืฅ startup.sh ืฉืงื™ื™ื ื›ื‘ืจ ื‘ืชื™ืงื™ื” ื•ืฉืื™ื ื• ื›ื•ืœืœ ื”ืจืฉืื•ืช ื”ืจืฆื”. ื•ืื—ืจื™ ืฉืžื‘ื™ื ื™ื ืืช ื”ื‘ืขื™ื” ื”ืคื™ืชืจื•ืŸ ื”ื•ื ื‘ืจื•ืจ - ื‘ืžืงื•ื ืœื”ืขืชื™ืง ืืช startup.sh ืœืชื•ืš ืชื™ืงื™ื™ืช /app ืฉื ื”ื•ื ื™ื•ืกืชืจ, ืื ื™ ืžืขืชื™ืง ืื•ืชื• ืœืชื™ืงื™ื” ืื—ืจืช ื‘ื–ืžืŸ ื™ืฆื™ืจืช ื”ืื™ืžื’', ื›ืœื•ืžืจ ืžืฉื ื” ืืช ื” Dockerfile ืœืชื•ื›ืŸ ื”ื‘ื:
FROM ubuntu:22.04

WORKDIR /app

COPY . .

COPY ./startup.sh /usr/local/bin/startup.sh

RUN chmod +x /usr/local/bin/startup.sh

CMD ["/usr/local/bin/startup.sh"]
ืขื›ืฉื™ื• ืจื’ืข ืจื’ืข ื™ื’ื™ื“ื• ื”ืงื•ืจืื™ื ื”ืขืจื ื™ื™ื - ืงืœืงืœืช ื”ื›ืœ. ืงื•ื“ื ื”ื™ืชื” ืœืš ืžืขืจื›ืช (ืœื ืขื•ื‘ื“ืช, ื ื›ื•ืŸ, ืื‘ืœ ืžืขืจื›ืช) ืฉื‘ื” ื›ืฉืื ื™ ืžืฉื ื” ืืช startup.sh ื‘ืชื™ืงื™ื” ืขืœ ื”ืžื—ืฉื‘ ื”ืžืืจื— ืื ื™ ืœื ืฆืจื™ืš ืœื‘ื ื•ืช ืžื—ื“ืฉ ืืช ื”ืื™ืžื’' ื›ื“ื™ ืœืจืื•ืช ืืช ื”ืฉื™ื ื•ื™, ื•ืื™ืœื• ืขื›ืฉื™ื• ื—ื™ื™ื‘ื™ื ืœื”ืจื™ืฅ build ืžื—ื“ืฉ ื›ืœ ืคืขื ืฉืžืฉื ื™ื ืืช startup.sh. ืื ื–ืืช ื‘ืขื™ื” ื’ื ืขื‘ื•ืจื›ื ื›ืœ ืžื” ืฉืฆืจื™ืš ื–ื” ืœืคืฆืœ ืืช ื”ืกืงืจื™ืคื˜ startup.sh ืœืฉื ื™ื™ื - ื—ืœืง ืื—ื“ ืฉืœื• ื™ืฉื‘ ื‘ /usr/local/bin, ื™ื•ื’ื“ืจ ื‘ืชื•ืจ ื” CMD ืฉืœ ื”ืื™ืžื’', ื™ืฉื ื” ืืช ื”ื”ืจืฉืื•ืช ื•ื™ืจื™ืฅ ืืช /app/startup.sh ื•ื”ื—ืœืง ื”ืฉื ื™, ื”ื•ื /app/startup.sh, ื•ื”ื•ื ื–ื” ืฉื™ื”ื™ื” ืžืžื•ืคื” ืœืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ื‘ืžื—ืฉื‘ ื”ืžืืจื— ื•ื™ืชืขื“ื›ืŸ ืื•ื˜ื•ืžื˜ื™ืช ืขื ื›ืœ ืฉื™ื ื•ื™.

ToCode
1 419
# ืœื ืจื•ืื” ืืช ื–ื” ืœื ืจื•ืื” ืืช ื–ื” ืœื ืจื•ืื” ืืช ื–ื” ืœื ืจื•ืื” ืืช ื–ื” ืœื ืจื•ืื” ืืช ื–ื” ืœื ืจื•ืื” ืืช ื–ื” ืจื•ืื” ืืช ื–ื” ืชื”ืœื™ืš ืœื™ืžื•ื“ื™ ื”ื•ื ื‘ืกืš ื”ื›ืœ ืžืขื‘ืจ ืžืžืฆื‘ ืฉืœ "ืœื ืจื•ืื” ืืช ื–ื”" ืœืžืฆื‘ ืฉืœ "ืจื•ืื” ืืช ื–ื”". ื”ืจื‘ื” ืžื•ืจื™ื ืžืชื—ื™ืœื™ื ืื• ืื ืฉื™ื ื˜ื›ื ื™ื™ื ืฉืฆืจื™ื›ื™ื ืœืœืžื“ ืื—ืจื™ื ืžืชืคืชื™ื ืœื—ืฉื•ื‘ ืฉื›ืœ ืžื” ืฉืฆืจื™ืš ื›ื“ื™ ืœืงืฆืจ ืืช ื”ื“ืจืš ื–ื” "ืœื”ืจืื•ืช ืืช ื–ื”". ื”ื ืœืคืขืžื™ื ื ื–ื›ืจื™ื ื‘ื“ื•ื’ืžื” ื”ืื—ืจื•ื ื” ืฉื”ื ืจืื• ืฉืื—ืจื™ื” ื”ื ืคืชืื•ื ื”ื‘ื™ื ื•, ื•ืžื“ืžื™ื™ื ื™ื ืฉืื ื”ื ืจืง ื™ืจืื• ืืช ืื•ืชื” ื“ื•ื’ืžื” ืื• ื™ืกืคืจื• ืืช ืื•ืชื• ื”ืกื‘ืจ ื”ื‘ืŸ ืื“ื ืฉืžืงืฉื™ื‘ ืคืชืื•ื ื™ื‘ื™ืŸ ื’ื. ืžื”ืจ ืžืื•ื“ ื”ื ืžื’ืœื™ื ืฉื™ื“ืข ืœื ืžื“ื‘ืง. ืžื•ืจื™ื ื˜ื•ื‘ื™ื ืœื ืฆืจื™ื›ื™ื ืœื—ืคืฉ ืืช ืงื™ืฆื•ืจ ื”ื“ืจืš ืื• ืืช ื”ืžืฆื’ืช ื”ืžื•ืฉืœืžืช ืฉืื—ืจื™ื” ื›ืœ ื”ืชืœืžื™ื“ื™ื ื™ื‘ื™ื ื• ืืช ื”ื—ื•ืžืจ. ืื™ืŸ ื›ื–ืืช. ื”ืจื‘ื” ื™ื•ืชืจ ื—ืฉื•ื‘ ืœืขื–ื•ืจ ืœืื ืฉื™ื ืœื”ืืžื™ืŸ ืฉื‘ืกื•ืฃ ื”ื ื™ืจืื• ืืช ื–ื”, ื•ืœืชืช ืœื”ื ืืช ื”ื›ื— ืœื”ืชืžื™ื“ ื‘ืžืกืœื•ืœ ืขื“ ืฉื–ื” ืงื•ืจื”.

ToCode
1 419
# ื”ืขืจื›ื” ื˜ื›ื ื•ืœื•ื’ื™ืช ืžืชื—ื™ืœื” ื‘ Trade Offs ื›ืฉืื ื—ื ื• ื‘ืื™ื ืœื‘ื—ื•ืจ ื›ืœื™ ืื• ืฉื™ื˜ืช ืขื‘ื•ื“ื” ืžืกื•ื™ืžื™ื ื”ื›ื™ ืงืœ ืœืžืฆื•ื ืืช ื”ื™ืชืจื•ื ื•ืช ื”ืžื•ื—ืœื˜ื™ื ืฉืœ ืื•ืชื• ื›ืœื™ ืื• ืืช ื”ื—ืกืจื•ื ื•ืช ื”ืžื•ื—ืœื˜ื™ื ืฉืœื•. ื‘ื“ื•ื’ืžื” ืคืฉื•ื˜ื” ืื ืื ื™ ืžืชืœื‘ื˜ ื‘ื™ืŸ React ืœ Solid.JS, ืื– ืจื•ื‘ ื”ืชื•ืฆืื•ืช ื‘ื—ื™ืคื•ืฉ ื‘ื’ื•ื’ืœ ืฉืœ ื”ื”ืฉื•ื•ืื” ื™ืชื™ื—ืกื• ืœื–ื” ืฉืจื™ืืงื˜ ื™ื•ืชืจ ืคื•ืคื•ืœืจื™ ื•ืœื›ืŸ ื™ืฉ ื™ื•ืชืจ ืกืคืจื™ื•ืช ื•ืžืงื•ืžื•ืช ืœืœืžื•ื“ ืžื”ื; ื•ืฉืกื•ืœื™ื“ ื ื•ืชืŸ ื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื ื™ื•ืชืจ ื•ื”ืงื•ื“ ืฉืœื• ืจื™ืืงื˜ื™ื‘ื™ ื™ื•ืชืจ. ืื‘ืœ ืื ืื ื™ ืžื’ื™ืข ืœื‘ืฆืข ื”ืขืจื›ื” ื˜ื›ื ื•ืœื•ื’ื™ืช ืฉืœ ื›ืœื™ ื”ืžื˜ืจื” ืฉืœื™ ื”ื™ื ื‘ื“ืจืš ื›ืœืœ ืœื ืœื›ืชื•ื‘ ืคื•ืกื˜ ืœื‘ืœื•ื’ ืืœื ืœื”ืชืื™ื ื›ืœื™ ืœืคืจื•ื™ืงื˜. ื•ื‘ืฉื‘ื™ืœ ื–ื” ื”ืจื‘ื” ื™ื•ืชืจ ืžืขื ื™ื™ืŸ ื™ื”ื™ื” ืœืžืฆื•ื ืืช ื” Trade Offs, ื›ืœื•ืžืจ ืืช ื”ื™ืชืจื•ื ื•ืช ื•ื”ื—ืกืจื•ื ื•ืช ื”ืกืคืฆื™ืคื™ื™ื ืฉืœ ื”ื›ืœื™ ืœืคืจื•ื™ืงื˜ ืฉืœื™. ืžื” ืื ื™ ืžืงื‘ืœ ื•ืžื” ืื ื™ ืžืฉืœื ื‘ืฉื‘ื™ืœ ื–ื”. ืžื” ื”ื—ืกืจื•ื ื•ืช ืฉืœ ืฉื™ืœื•ื‘ ื˜ื™ื™ืคืกืงืจื™ืคื˜ ื‘ืคืจื•ื™ืงื˜? ืื™ืš ื–ื” ื™ืฉืคื™ืข ืขืœ ืงืฆื‘ ื”ืคื™ืชื•ื—? ืื™ืš ื–ื” ื™ืฉืคื™ืข ืขืœ ื”ืขื‘ื•ื“ื” ืฉืœื™ ืขื ืžืชื›ื ืชื™ื ื—ื™ืฆื•ื ื™ื™ื? ืื™ืš ื–ื” ื™ืฉืคื™ืข ืขืœ ื’ื™ื•ืก ืžืชื›ื ืชื™ื ื—ื“ืฉื™ื ืœืฆื•ื•ืช? ืื™ืš ื–ื” ื™ืฉืคื™ืข ืขืœ ื”ื”ืจื’ืฉื” ืฉืœ ื”ื•ื•ืชื™ืงื™ื? ืื™ืš ื–ื” ื™ืฉืคื™ืข ืขืœ ื”ืืคืฉืจื•ืช ืœืฉื™ืชื•ืฃ ืงื•ื“ ื‘ื™ืŸ ืžืขืจื›ื•ืช? ื‘ืžื™ืœื™ื ืื—ืจื•ืช - ืžื” ื”ื—ืกืจื•ื ื•ืช ืฉืœ ื˜ื™ื™ืคืกืงืจื™ืคื˜ ื‘ืคืจื•ื™ืงื˜ ื”ืกืคืฆื™ืคื™ ืฉืœื›ื? ื•ืœืžืจื•ืช ืฉื–ื” ื ืฉืžืข ืคืจื“ื•ืงืกืœื™, ืื ื™ ื”ืจื‘ื” ื™ื•ืชืจ ืจื’ื•ืข ื›ืฉืื ื™ ืจื•ืื” ืœืฆื“ ื”ื™ืชืจื•ื ื•ืช ื’ื ืืช ื”ื—ืกืจื•ื ื•ืช ืฉืœ ืฉื™ื˜ืช ื”ืขื‘ื•ื“ื” ืฉืื ื™ ืจื•ืฆื” ืœื‘ื—ื•ืจ. ื•ื–ื” ื”ืจื‘ื” ืคืขืžื™ื ืœื ืงืœ ืœืžืฆื•ื ืื•ืชื. ืื– ืื ื ืฉื™ื ืืช ื˜ื™ื™ืคืกืงืจื™ืคื˜ ื‘ืฆื“ ื•ื ื—ื–ื•ืจ ืœืจื™ืืงื˜, ื”ืคืจืกื•ืžื™ื ืขืœ ื’ื™ืจืกื” 18 ืฉืœ ืจื™ืืงื˜ ืžืกืคืจื™ื ื‘ื”ืชืœื”ื‘ื•ืช ืขืœ ื” Concurrent Rendering ื•ืื™ืš ื–ื” ืขื•ื–ืจ ืœืฉืคืจ ื‘ื™ืฆื•ืขื™ื. ืœืงื— ืœื™ ื”ืจื‘ื” ื–ืžืŸ ืœื”ื‘ื™ืŸ ืฉ Render Tearing ื–ืืช ื‘ืขื™ื” ืืžื™ืชื™ืช ื•ื”ื™ื ืžืฉืคื™ืขื” ืขืœ ืฉื™ื˜ืช ื”ืขื‘ื•ื“ื” ืฉืœื™ ื’ื ืื ื”ื™ื•ื ืื ื™ ืœื ืžืฉืชืžืฉ ื‘ Concurrent Rendering. ืœื›ืŸ ืื ืืชื ืื—ืจืื™ื ืขืœ ื”ื‘ื—ื™ื ื” ื”ื˜ื›ื ื•ืœื•ื’ื™ืช, ื—ื•ืฅ ืž POC ืœื›ืœื™ ื”ื—ื“ืฉ ืฉื•ื•ื” ืœืขืฉื•ืช ืžืืžืฅ ืžื•ื’ื‘ืจ ื›ื“ื™ ืœืžืฆื•ื ื›ืžื” ืฉื™ื•ืชืจ ื—ืกืจื•ื ื•ืช ืžืจืืฉ. ื›ื™ ื”ื‘ืขื™ื” ืขื ื—ืกืจื•ื ื•ืช ื”ื™ื ืฉื”ื ื ื•ื˜ื™ื ืœื”ืคืชื™ืข ื‘ื“ื™ื•ืง ื‘ืจื’ืข ื”ืœื ื ื›ื•ืŸ. ื .ื‘. ื”ืกืงื™ืจื” ื”ื–ืืช ืขืœ ืจืืกื˜: https://www.bunniestudios.com/blog/?p=6375 ื”ื™ื ื“ื•ื’ืžื” ืžืขื•ืœื” ืœืกืงื™ืจื” ื˜ื›ื ื•ืœื•ื’ื™ืช ืฉืžืฆื™ื’ื” ื’ื ืืช ื”ืขืœื•ื™ื•ืช ื•ืœื ืจืง ื™ืชืจื•ื ื•ืช ืžื•ื‘ื”ืงื™ื ืื• ื—ืกืจื•ื ื•ืช ืžื•ื‘ื”ืงื™ื.

ToCode
1 419
ื”ืงื•ื‘ืฅ ื”ืฉืœื™ืฉื™ ื”ื•ื src/App.js (ื•ืœื jsx, ื›ื™ ืื™ืŸ ื™ื•ืชืจ jsx) ื•ื”ื•ื ืžืงื‘ืœ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
import { html } from 'htm/react';
import React from "react";

export default function App() {
  const [count, setCount] = React.useState(0);
  function inc() {
    setCount(c => c + 1);
  }

  return (
    html`<div>
      <p>Welcome To The Future</p>
      <button onClick=${inc}>Value: ${count}. Click To Increase</button>
    </div>
    `
  );
}
ื”ื›ืœ ื›ืืŸ ืจื™ืืงื˜ ืจื’ื™ืœ ืœื’ืžืจื™, ื—ื•ืฅ ืžื” JSX ืฉื”ืคืš ืœ Template Strings ืฉืžืื•ื“ ื“ื•ืžื™ื ืœื•. ## ื”ืจืฆื” ืฉืœื•ืฉืช ื”ืงื‘ืฆื™ื ื”ืืœื”, ื‘ืœื™ ื•ื•ื‘ืคืืง, ื‘ืœื™ node.js, ื‘ืœื™ ื‘ื™ื™ื‘ืœ ื•ื‘ืœื™ ืฉื•ื ื˜ืจื ืกืคื™ืœืฆื™ื”, ืจืง ืฉืœื•ืฉื” ืงื‘ืฆื™ื - ืžืกืคื™ืงื™ื ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ื™ื™ืฉื•ื ืจื™ืืงื˜ ื‘ื“ืคื“ืคืŸ. ืื ื™ ืžืคืขื™ืœ ืฉืจืช ืžืงื•ืžื™ ืขืœ ืคื•ืจื˜ 8080 ืขื ื”ืคืงื•ื“ื”:
$ npx http-server
ื ื›ื ืก ืžื”ื“ืคื“ืคืŸ ืœืฉืจืช ืžืงื•ืžื™ ืขื ื”ืคื•ืจื˜ ื”ืžืชืื™ื ื•ืžืงื‘ืœ ื›ืคืชื•ืจ ืฉืžืจืื” ื›ืžื” ืคืขืžื™ื ืœื—ืฆืชื™ ืขืœื™ื•. ## ืžื—ืฉื‘ื•ืช ืœืขืชื™ื“ ื›ืžื” ืžื—ืฉื‘ื•ืช ื•ื”ืขืจื•ืช ืื—ืจื™ ื›ืชื™ื‘ืช ื”ืงื•ื“ ื”ื–ื”: 1. ื”ืืชืจ ga.jspm.io ื”ื•ื ื–ื” ืฉืžื’ื™ืฉ ืืช ืงื‘ืฆื™ ื” JavaScript ื‘ืคื•ืขืœ ื•ื”ื•ื ืžืชืคืงื“ ื‘ืชื•ืจ CDN. ื–ื” ืžืื•ื“ ืžื–ื›ื™ืจ ืืช ื”ื—ื™ื™ื ื‘ืคื™ืชื•ื— ื•ื•ื‘ ืœืคื ื™ ืขืฉืจ ืฉื ื™ื, ื›ืฉื‘ืฉื‘ื™ืœ ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื” ื”ื™ื™ื ื• ืคืฉื•ื˜ ืžื“ื‘ื™ืงื™ื ืืช ื”ืœื™ื ืง ืืœื™ื” ืœ html. ืื ื™ ืžืชืืจ ืœืขืฆืžื™ ืฉื”ืจื‘ื” ืื ืฉื™ื ื™ืขื“ื™ืคื• ืขื“ื™ื™ืŸ ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืชืœื•ื™ื•ืช ื”ืืœื” ืืฆืœื ื‘ืคืจื•ื™ืงื˜ ืื• ืขืœ cdn ื‘ืฉืœื™ื˜ืชื, ื•ื–ื” ื‘ืกื“ืจ - ืœ Import Maps ืœื ืื›ืคืช ืžืื™ืคื” ื”ื•ื ืžื‘ื™ื ืืช ื”ืžื•ื“ื•ืœื™ื. 2. ื™ื”ื™ื” ืžืขื ื™ื™ืŸ ืœืจืื•ืช ืื ืœืื•ืจืš ื–ืžืŸ ืืคืฉืจ ื™ื”ื™ื” ืœืžืฆื•ื ื”ืฆื“ืงื” ืœ webpack ื• babel, ื›ืฉืจื•ื‘ ืžื” ืฉื”ื ืขื•ืฉื™ื ืืคืฉืจ ืœืขืฉื•ืช ื”ื™ื•ื ื™ืฉื™ืจื•ืช ื‘ื“ืคื“ืคืŸ. ื ื›ื•ืŸ - scss ื–ื” ื—ืžื•ื“ ื•ืœ TypeScript ื™ืฉ ื™ืชืจื•ื ื•ืช, ืื‘ืœ ื”ืžื—ื™ืจ ืฉืœ ื”ื›ืœื™ื ื”ืืœื” ืžืชื—ื™ืœ ืœื”ื™ื•ืช ืžืฉืžืขื•ืชื™ ื›ื›ืœ ืฉื”ืืœื˜ืจื ื˜ื™ื‘ื” ื”ืคืฉื•ื˜ื” ื™ื•ืชืจ ื™ื›ื•ืœื” ืœืชืช ืžืขื ื” ืžืœื ืœืจื•ื‘ ื”ืฆืจื›ื™ื.

ToCode
1 419
# ื”ื—ื™ื™ื ืื—ืจื™ ื‘ื™ื™ื‘ืœ ืืช AMD ื”ื›ืจืชื™ ื‘ืืžืฆืขื•ืช require.js ืฉื”ื™ืชื” ืœื”ื™ื˜ ื‘ืื–ื•ืจ ืฉื ืช 2012 (ืžื” ืฉื ืงืจื, ืขื•ื‘ื“ ื‘ IE6) ื•ื›ื ืจืื” ื’ื ืงืฆืช ืงื•ื“ื. ืžื” ืฉ require ืขืฉืชื” ื”ื™ื” ืœืืคืฉืจ ืœื›ื ืœื›ืชื•ื‘ ื‘ืชื•ืš ืงื•ื‘ืฅ JavaScript ืื—ื“ ืคืงื•ื“ื” ืฉืชื˜ืขืŸ ืงื•ื‘ืฅ JavaScript ืื—ืจ. ื ื›ื•ืŸ, ืœืคื ื™ require ื”ื™ืชื” ืืช dojo ืฉืขื‘ื“ื” ืขืœ ืื•ืชื• ืžื ื’ื ื•ืŸ ืื‘ืœ ื–ื” ื›ื‘ืจ ืœืžืชืงื“ืžื™ื. ืœ Require ื”ื™ื” ื›ืœื™ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœื•ืงื— ืงื‘ืฆื™ื ืฉื›ืชื•ื‘ื™ื ื‘ AMD ื•ืžืื—ื“ ืื•ืชื ื™ื—ื“ ืœืงื•ื‘ืฅ ืื—ื“ ื•ื›ื›ื” ืžืฆืœื™ื— ืœืฉืคืจ ืืช ื–ืžืŸ ื˜ืขื™ื ืช ื”ืขืžื•ื“, ื›ื™ ืฆืจื™ืš ืœืฉืœื•ื— ืคื—ื•ืช ืงื‘ืฆื™ื ืœื“ืคื“ืคืŸ. ืื—ืจื™ ื–ื” ื”ื’ื™ืขื• grunt, gulp, webpack ื• babel ื•ืื ื—ื ื• ืขื‘ืจื ื• ืœื”ืฉืชืžืฉ ื‘ื›ืชื™ื‘ ื” import/export ื•ืœื”ืจื™ืฅ ืงื•ื“ ืขืœ ืงื‘ืฆื™ ื” JavaScript ื‘ืชื•ืš ืฉืœื‘ ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”. ื”ืจืฆืช ื”ืงื•ื“ ืื™ืคืฉืจื” ืœื™ืฆื•ืจ ืชื—ื‘ื™ืจื™ื ื—ื“ืฉื™ื ื›ืžื• TypeScript ื• JSX, ืฉืžืชืงืžืคืœื™ื ืœ JavaScript ื•ืžืกืคืงื™ื ื—ื•ื•ื™ื” ื˜ื•ื‘ื” ื™ื•ืชืจ ืœืžืชื›ื ืชื™ื. ื‘ื’ืœืœ ืฉืžืžื™ืœื ื”ืจืฆื ื• ื•ื•ื‘ืคืืง ืœื ื”ื™ืชื” ืขืœื•ืช ืœืฉื™ืžื•ืฉ ื‘ื›ืœื™ื ืืœื”. ื‘ืกืš ื”ื›ืœ ืขื•ื“ ืคืœืื’ื™ืŸ ืœื”ืชืงื™ืŸ. ื ื’ืœื’ืœ ืงื“ื™ืžื” ืœ 2022 ื•ื”ืขื•ืœื ื”ืฉืชื ื” ืฉื•ื‘. ื”ื™ื•ื ื“ืคื“ืคื ื™ื ืชื•ืžื›ื™ื ืชืžื™ื›ื” ืžืœืื” ื‘ ES Modules ื•ื‘ื˜ืขื™ื ืช ืงื•ื‘ืฅ JavaScript ืžืชื•ืš ืงื•ื‘ืฅ ืื—ืจ. ื‘ื ื•ืกืฃ ืชืงืŸ HTTP/2 ืชื•ืžืš ื‘ Server Push ืฉืื•ืžืจ ืฉืื™ืŸ ื™ื™ืชืจื•ืŸ ืžื‘ื—ื™ื ืช ื‘ื™ืฆื•ืขื™ื ืœ Bundling. ื•ื›ื›ื” ืื ื—ื ื• ืงืžื™ื ื‘ื•ืงืจ ืื—ื“ ื•ืžื’ืœื™ื ืฉื–ื” ื”ื–ื ื‘ ืฉืžืงืฉืงืฉ ื‘ื›ืœื‘ - ืฉื” JSX, ืฉืžื›ืจื• ืœื ื• ืื•ืชื• ื›ืžื• ืชื•ืกืคืช ื—ื‘ื™ื‘ื” ืฉืœื ืขื•ืœื” ื›ืœื•ื, ื ืฉืืจ ื”ืกื™ื‘ื” ื”ื™ื—ื™ื“ื” ืœื”ืžืฉื™ืš ืœื”ืฉืชืžืฉ ื‘ื›ืœ ื”ืงื•ื ืกื˜ืจื•ืงืฆื™ื” ืฉืœ ื•ื•ื‘ืคืืง ื• babel. ื•ื”ื’ืœื’ืœ ืžืชื—ื™ืœ ืœื”ืกืชื•ื‘ื‘ ืฉื•ื‘. ื”ืกืคืจื™ื” htm ืžืฆื™ืขื” ืœืžื™ ืฉืจื•ืฆื” ืœื•ื•ืชืจ ืขืœ ืฉืœื‘ ื”ืงื•ืžืคื™ืœืฆื™ื” ื“ืจืš ื”ื—ื•ืฆื”, ื‘ืืžืฆืขื•ืช ืชื—ื‘ื™ืจ ืฉื ืจืื” ืžืื•ื“ ื“ื•ืžื” ืœ JSX ืื‘ืœ ืขื•ื‘ื“ ื‘ื“ืคื“ืคืŸ. ืฉื™ืœื•ื‘ ืฉืœ htm ืขื ื›ืœ ืฉืืจ ื”ื—ื™ื“ื•ืฉื™ื ื‘ืขื•ืœื ื” web ืžืืคืฉืจ ื‘ื ื™ื” ืฉืœ ืืคืœื™ืงืฆื™ื™ืช ืจื™ืืงื˜ ืžืœืื” ื‘ืœื™ ืงื•ืžืคื™ืœืฆื™ื”. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“. ## ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ืื ื™ ื›ื•ืชื‘ ืงื•ื‘ืฅ ื‘ืฉื index.html ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
<!DOCTYPE html>
<html lang="en">
  <head><title>Hello World</title></head>
  <body>
    <main id="app"></main>
  <script type="importmap">
  {
    "imports": {
      "htm/react": "https://ga.jspm.io/npm:htm@3.1.1/react/index.module.js",
      "react": "https://ga.jspm.io/npm:react@18.1.0/dev.index.js",
      "react-dom": "https://ga.jspm.io/npm:react-dom@18.1.0/dev.index.js"
    },
    "scopes": {
      "https://ga.jspm.io/": {
        "htm": "https://ga.jspm.io/npm:htm@3.1.1/dist/htm.module.js",
        "object-assign": "https://ga.jspm.io/npm:object-assign@4.1.1/index.js",
        "scheduler": "https://ga.jspm.io/npm:scheduler@0.20.2/dev.index.js",
        "scheduler/tracing": "https://ga.jspm.io/npm:scheduler@0.20.2/dev.tracing.js"
      }
    }
  }
  </script>
  
  <!-- ES Module Shims: Import maps polyfill for modules browsers without import maps support (all except Chrome 89+) -->
  <script async src="https://ga.jspm.io/npm:es-module-shims@1.5.1/dist/es-module-shims.js" crossorigin="anonymous"></script>

    <script type="module" src="src/main.js"></script>
  </body>
</html>
ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืืžื•ืจ ืœื”ื™ื•ืช ืœื›ื ืžื•ื–ืจ - ื”ืžื ื’ื ื•ืŸ ื ืงืจื Import Maps ื•ื”ื•ื ืืžื•ืจ ืœืืคืฉืจ ื‘ืขืชื™ื“ ื ื™ื”ื•ืœ ืชืœื•ื™ื•ืช ืžืกื•ื“ืจ ืžืชื•ืš ES Modules. ื›ืจื’ืข, ื”ื‘ืขื™ื” ืขื ืชืœื•ื™ื•ืช ื”ื™ื ืฉื›ืฉืืชื ื›ื•ืชื‘ื™ื:
import React from 'react';
ืœื“ืคื“ืคืŸ ืื™ืŸ ืžื•ืฉื’ ืžืื™ืคื” ืœื”ื‘ื™ื ืืช react. ื‘ node ืื• webpack ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืงื•ื‘ืฅ package.json ื‘ืฉื‘ื™ืœ ืœืžืคื•ืช ืืช ื”ืฉื ื”ื–ื” ืœืงื•ื‘ืฅ ืืžื™ืชื™, ื•ื‘ืชื•ืš ื“ืคื“ืคืŸ Import Maps ื”ื•ื ื”ืฆืขื” ืื—ืช ืœืžื™ืžื•ืฉ ื›ื–ื” ืžื ื’ื ื•ืŸ. ืืคืฉืจ ืœืงืจื•ื ืขืœื™ื• ื›ืืŸ: https://github.com/WICG/import-maps ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื”ื•ื ืฉื›ืจื’ืข ื™ืฉ ืคื•ืœื™ืคื™ืœ ืฉืขื•ื‘ื“ ื•ื”ืจื‘ื” ื›ืœื™ื ืฉื™ื•ื“ืขื™ื ืœืงื—ืช ืงื•ื‘ืฅ package.json ื•ืœื”ืคื•ืš ืื•ืชื ืœ Import Maps, ื•ื’ื ืžืžืฉืง ื’ืจืคื™ ืื•ื ืœื™ื™ื ื™ ืœื‘ื ื™ื™ืช Import Maps ืฉืืคืฉืจ ืœืžืฆื•ื ื‘ืงื™ืฉื•ืจ ื”ื–ื”: https://generator.jspm.io/#. ืœื›ืŸ ื”ื—ืœืง ืฉืœ ื” Import Maps ืžืงื‘ื™ืœ ืœ package.json ืฉื™ื”ื™ื” ืœื ื• ื‘ืคืจื•ื™ืงื˜ webpack ืงืœืืกื™. ื—ื•ืฅ ืžืžื ื• ื™ืฉ ืกืงืจื™ืคื˜ ื‘ืฉื main ืฉืžื•ื’ื“ืจ ื›ืžื•ื“ื•ืœ ื•ื”ื•ื ื ืงื•ื“ืช ื”ื›ื ื™ืกื” ืœื™ื™ืฉื•ื. ื‘ืงื•ื‘ืฅ src/main.js ืื ื™ ื›ื•ืชื‘ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
import { html } from 'htm/react';
import ReactDOM from 'react-dom';
import App from './App.js';

ReactDOM.render(html`<${App} />`, document.querySelector('#app'));
ื•ืคื” ืื ื—ื ื• ืžืชื—ื™ืœื™ื ืœืจืื•ืช ืืช ืกืคืจื™ื™ืช htm ื‘ืคืขื•ืœื”. ืืคืฉืจ ืœืจืื•ืช ืฉื”ืงื•ื“ ืื™ื ื• JSX ืื‘ืœ ื”ื•ื ื›ืŸ ืžืื•ื“ ื“ื•ืžื” ื‘ื–ื›ื•ืช ื”ืฉื™ืžื•ืฉ ื‘ Template Strings. ืื’ื‘, ื—ื•ืฅ ืžื–ื” ืืคืฉืจ ื”ื™ื” ื‘ืงืœื•ืช ืœื˜ืขื•ืช ื•ืœื—ืฉื•ื‘ ืฉืื ื—ื ื• ื‘ืคืจื•ื™ืงื˜ ื•ื•ื‘ืคืืง. ื›ืœ ื” import-ื™ื ืขื•ื‘ื“ื™ื ืจื’ื™ืœ ืœื’ืžืจื™.

ToCode
1 419
# ืžื“ืจื™ืš: ืื™ืš ืœื‘ื“ื•ืง ืคืจื•ื™ืงื˜ vite ืขื vitest ืœืคื ื™ ื›ืžื” ื—ื•ื“ืฉื™ื ื”ืขื‘ืจืชื™ ื›ืืŸ ื•ื•ื‘ื™ื ืจ ืขืœ ื•ื™ื˜, ื›ืœื™ ืฉื•ืจืช ืคืงื•ื“ื” ืœื‘ื ื™ื™ืช ืคืจื•ื™ืงื˜ื™ ื•ื•ื‘. ืœื•ื™ื˜ ื™ืฉ ืชืคืจื™ื˜ื™ื ื™ืคื™ื ื›ื“ื™ ืœื™ืฆื•ืจ ืคืจื•ื™ืงื˜ื™ื ืžื›ืœ ืžื™ื ื™ ืกื•ื’ื™ื (ืจื™ืืงื˜, ื•ื™ื•, ืกื‘ืœื˜), ืื‘ืœ ื”ื•ื ื’ื ืชื•ืžืš ื‘ืกืคืจื™ื•ืช ืื—ืจื•ืช ื‘ืืžืฆืขื•ืช ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืœืžืฉืœ ืกื•ืœื™ื“. ื›ืฉื”ืขื‘ืจืชื™ ืืช ื”ื•ื•ื‘ื™ื ืจ vitest ื”ื™ื” ืขื“ื™ื™ืŸ ื‘ืชื—ื™ืœืช ื”ื“ืจืš ื•ืœื ื”ื™ืชื” ื“ืจืš ืกื˜ื ื“ืจื˜ื™ืช ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช ืœืคืจื•ื™ืงื˜ื™ ื•ื™ื˜. ื–ื” ื”ืฉืชื ื” ืœืื—ืจื•ื ื” ื• vitest ืžืกืคืง ืื™ื ื˜ื’ืจืฆื™ื” ื˜ื•ื‘ื” ืขื ื•ื™ื˜, ืชื—ื‘ื™ืจ ื›ืžืขื˜ ื–ื”ื” ืœืžื” ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ืž jest ื•ืขื•ื“ ื›ืžื” ืคื™ืฆ'ืจื™ื ืžืขื ื™ื™ื ื™ื ื›ืžื• ื”ืจืฆืช ื‘ื“ื™ืงื•ืช ื‘ืžืงื‘ื™ืœ ืื• ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ื‘ื’ื•ืฃ ื”ืงื•ื“. ื‘ืžื“ืจื™ืš ื–ื” ืื ื™ ืืฆื•ืจ ืืชื›ื ืคืจื•ื™ืงื˜ react ืขื vite, ืืชืงื™ืŸ ืืช vitest ื•ืื›ืชื•ื‘ ืืช ื”ื‘ื“ื™ืงื” ื”ืจืืฉื•ื ื” ืœืคืจื•ื™ืงื˜. ืžื•ื›ื ื™ื? ื”ื ื” ื–ื” ื‘ื. ## ื™ืฆื™ืจืช ืคืจื•ื™ืงื˜ ืจื™ืืงื˜ ืขื vite ืฉืœื‘ ืจืืฉื•ืŸ ื”ื•ื ื™ืฆื™ืจืช ืคืจื•ื™ืงื˜ ืจื™ืืงื˜ ื—ื“ืฉ ืขื ื•ื™ื˜. ืื ื™ ืžืจื™ืฅ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
$ npm create vite@latest my-react-app
ื‘ื•ื—ืจ ื‘ืชืคืจื™ื˜ ืืช ื”ืืคืฉืจื•ืช react ื•ืื—ืจื™ ื–ื” ืฉื•ื‘ react ื•ืžืคืขื™ืœ ืืช ืฉืœื•ืฉืช ื”ืคืงื•ื“ื•ืช ืฉืžื•ืคื™ืขื•ืช ืขืœ ื”ืžืกืš ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืคืจื•ื™ืงื˜ ื ื‘ื ื”:
$ cd my-react-app
$ npm install
$ npm run dev
ื•ื™ื˜ ื™ืจื™ื ืฉืจืช ืฉืžืื–ื™ืŸ ืœืคื•ืจื˜ 3000 ื•ื™ืฆื™ื’ ืœื•ื’ื• ืžืกืชื•ื‘ื‘ ืฉืœ ืจื™ืืงื˜ ื™ื—ื“ ืขื ื›ืคืชื•ืจ ืžื•ื ื” ืœื—ื™ืฆื•ืช. ื›ืœ ืœื—ื™ืฆื” ืขืœ ื”ื›ืคืชื•ืจ ืžืขืœื” ืืช ื”ืžืกืคืจ ื‘-1. ## ื”ื•ืกืคืช vitest ื‘ืฉื‘ื™ืœ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช ืœืคืจื•ื™ืงื˜ ืื ื™ ืžื•ืกื™ืฃ ืืช ื•ื™ื˜ืกื˜ ื‘ืืžืฆืขื•ืช ื”ืจืฆืช:
$ npm install -D vitest jsdom @testing-library/react @testing-library/jest-dom @testing-library/user-event
ื‘ื ื•ืกืฃ ืœ vitest ื”ืชืงื ืชื™ ื’ื ืืช jsdom ื›ื“ื™ ืฉืื•ื›ืœ ืœื‘ื“ื•ืง ื“ื‘ืจื™ื ืฉืงืฉื•ืจื™ื ืœื“ืคื“ืคืŸ (ื”ื‘ื“ื™ืงื•ืช ืจืฆื•ืช ื‘ node.js), ื•ืืช ื›ืœ ื”ื—ื‘ื™ืœื” ืฉืœ react-testing-library ื• jest-dom. ืืช ื’'ืกื˜ ืขืฆืžื• ืื ื™ ืœื ืฆืจื™ืš ืœื”ืชืงื™ืŸ ื›ื™ ืื ื™ ืœื ืืฉืชืžืฉ ื‘ื•. ื•ื™ื˜ืกื˜ ืžืฉืชืžืฉ ื‘ chai, ืื‘ืœ ืžืกืชื‘ืจ ืฉ jest-dom ื™ื›ื•ืœ ืœื”ืชื—ื‘ืจ ืœ chai ื•ื”ื›ืœ ื™ืขื‘ื•ื“. ืื—ืจื™ ื”ื”ืชืงื ื” ืื ื™ ืžืžืฉื™ืš ืœืขื“ื›ื•ืŸ ื”ื”ื’ื“ืจื•ืช. ื‘ืงื•ื‘ืฅ vite.config.js ืื ื™ ืžื•ืกื™ืฃ ื‘ืœื•ืง test ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  test: {
    environment: "jsdom",
    globals: true,
    setupFiles: 'src/setupTests.js',
  },
})
ื‘ื™ืงืฉืชื™ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื‘ืชื•ืš jsdom ื•ืœืคื ื™ ื”ืจืฆืช ื”ื‘ื“ื™ืงื•ืช ืœื”ืจื™ืฅ ืงื•ื‘ืฅ ื‘ืฉื src/setupTests.js. ืื ื™ ื™ื•ืฆืจ ื’ื ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” ื•ื›ื•ืชื‘ ื‘ืชื•ื›ื•:
import '@testing-library/jest-dom'
ื‘ืฉื‘ื™ืœ ืœื˜ืขื•ืŸ ืืช jest-dom ืœืคื ื™ ืฉืžืจื™ืฆื™ื ืืช ื”ื‘ื“ื™ืงื•ืช. ื›ืžื• ื›ืŸ, jest-dom ืžืฆืคื” ืœืžืฆื•ื ืืช expect ื‘ืชื•ืจ ืžืฉืชื ื” ื’ืœื•ื‘ืืœื™ ืฉื›ื‘ืจ ืžื•ื’ื“ืจ ื‘ืขืžื•ื“ ื•ื‘ื’ืœืœ ื–ื” ื”ื•ืกืคืชื™ ืืช globals: true ืœื”ื’ื“ืจื•ืช ื”ื‘ื“ื™ืงื•ืช (ืฉื™ืขื‘ื•ื“ ื›ืžื” ืฉื™ื•ืชืจ ื“ื•ืžื” ืœืžื” ืฉืื ื™ ืจื’ื™ืœ ืž jest). ืฉื™ื ื•ื™ ื”ื’ื“ืจื•ืช ืื—ืจื•ืŸ ื”ื•ื ื‘ืงื•ื‘ืฅ package.json ืฉื ืื ื™ ืžื•ืกื™ืฃ ืกืงืจื™ืคื˜ ืฉืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช:
  "scripts": {
    "test": "vitest",
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
## ื›ืชื™ื‘ืช ื‘ื“ื™ืงื” ืจืืฉื•ื ื” ื–ื” ื”ื›ืœ ืœื’ื‘ื™ ื”ื”ืชืงื ื•ืช ื•ืขื›ืฉื™ื• ืืคืฉืจ ืœื™ืฆื•ืจ ืงื•ื‘ืฅ App.test.jsx ืขื ื”ื‘ื“ื™ืงื•ืช ื”ืจืืฉื•ื ื•ืช:
import { screen, render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import App from './App';

describe('App', () => {
  it('shows Hello text', () => {
    render(<App />);
    expect(screen.getByText('Hello Vite + React!')).toBeInTheDocument();
  });

  it('increases the value when button is pressed', async () => {
    render(<App />);
    const btn = screen.getByRole('button', { name: /count is/ });
    await userEvent.click(btn);
    expect(btn).toHaveTextContent('count is: 1');
  });
});
ื•ื›ืžื• ืขื ื’'ืกื˜ ื‘ืฉื‘ื™ืœ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ืžืกืคื™ืง ืœื”ืคืขื™ืœ:
$ npm run test
ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ vitest ื™ืขืœื” ื•ื™ืชื—ื™ืœ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ื™ืžืฉื™ืš ืœื”ืจื™ืฅ ืžื—ื“ืฉ ืืช ื”ื‘ื“ื™ืงื•ืช ื”ืจืœื•ื•ื ื˜ื™ื•ืช ื›ืœ ืคืขื ืฉืชืขื“ื›ื ื• ืืช ื”ืงื•ื“.

ToCode
1 419
# ื˜ื™ืค ื’ื™ื˜: ื ื’ืžืœื™ื ืž push ื ื ืขืœืชื™ ืžื—ื•ืฅ ืœื‘ื™ืช ื”ืฉื‘ื•ืข. ื›ืŸ, ื™ืฉ ืœื™ ื“ืœืช ื›ื–ืืช ืฉืžืจื’ืข ืฉืกื•ื’ืจื™ื ืื•ืชื” ื”ื™ื ื ื ืขืœืช, ื•ื‘ืœื™ ืœืฉื™ื ืœื‘ ืกื’ืจืชื™ ืืช ื”ื“ืœืช ื›ืฉื”ืžืคืชื—ื•ืช ื”ื™ื• ื‘ืชื•ืš ื”ื‘ื™ืช. ืžื”ืœืš ื‘ืœืชื™ ื”ืคื™ืš ื“ื•ืžื” ืงื•ืจื” ืœื™ ื‘ git ื›ืœ ืคืขื ืื—ืจื™ ืฉืื ื™ ืขื•ืฉื” commit - ื•ื”ืคืขื ืื ื™ ืžื“ื‘ืจ ืขืœ push. ืกื™ื‘ื” ืื—ืช ืœื”ืคืขื™ืœ push ืžื™ื“ ืื—ืจื™ ืงื•ืžื™ื˜ ื”ื•ื ื‘ื’ื™ื‘ื•ื™ื™ื. ื”ืคืขืœืช push ื“ื•ื—ืคืช ืืช ื”ืžืื’ืจ ืœืฉืจืช ืžืจื•ื—ืง ืฉืื•ืœื™ ืžืชื’ื‘ื” ื‘ืชื“ื™ืจื•ืช ื’ื‘ื•ื”ื” ื™ื•ืชืจ ืžื”ืžื—ืฉื‘ ืฉืœื™. ืื ื”ื ื•ืฉื ื”ื–ื” ื—ืฉื•ื‘ ืœื›ื ืื ื™ ืžืฆื™ืข ืœื™ื™ืฆืจ ืžื ื’ื ื•ืŸ ื’ื™ื‘ื•ื™ื™ื ื˜ื•ื‘ ื™ื•ืชืจ ืขืœ ืชื—ื ืช ื”ืขื‘ื•ื“ื” ืฉืœื›ื, ืื• ืœื™ืฆื•ืจ ืžืื’ืจ ืžืจื•ื—ืง ืฉื™ืฉืžืฉ ืืชื›ื ืจืง ืœืฆื•ืจืš ื’ื™ื‘ื•ื™ ื•ืœื ืœืฆื•ืจืš ืฉื™ืชื•ืฃ ืงื•ื“ ืขื ืื ืฉื™ื ืื—ืจื™ื. ืื’ื‘ - ื›ื‘ืจ ื›ืชื‘ืชื™ ื‘ืขื‘ืจ ืžื“ืจื™ืš ืื™ืš ืœืขื‘ื•ื“ ืขื ืžืกืคืจ ืžืื’ืจื™ื ืžืจื•ื—ืงื™ื ื‘ื’ื™ื˜. ืกื™ื‘ื” ืฉื ื™ื” (ืื• ื™ื•ืชืจ ื ื›ื•ืŸ ืื™ืœื•ืฅ) ืœื”ืคืขื™ืœ push ืžื™ื“ ืื—ืจื™ commit ื”ื™ื ื‘ืฉื‘ื™ืœ ืœื”ืคืขื™ืœ ืื™ื–ื” pipeline ืฉื™ื‘ื“ื•ืง ืืช ื”ืฉื™ื ื•ื™ ืขืœ ืฉืจืช ืžืจื•ื—ืง. ื’ื ืคื” ืื ืืคืฉืจ ืฉื•ื•ื” ืœื™ื™ืฆืจ ืžืื’ืจ ืื—ื“ ืขื‘ื•ืจ ื” pipelines ื•ื”ื‘ื“ื™ืงื•ืช, ื•ืžืื’ืจ ืฉื ื™, ืืžื™ืชื™, ืœืฆื•ืจืš ืฉื™ืชื•ืฃ ืงื•ื“ ืขื ืื ืฉื™ื ืื—ืจื™ื. ื•ื›ืœ ื–ื” ื‘ื’ืœืœ ืฉื”ื—ื™ืกืจื•ืŸ ื‘ื”ืคืขืœืช push ืžื™ื“ ืื—ืจื™ ื”ืงื•ืžื™ื˜ื™ื ื”ื•ื ืฉืžืจื’ืข ืฉืขืฉื™ืชื™ push ืื ื™ ื›ื‘ืจ ืœื ื™ื›ื•ืœ ืœืขืจื•ืš ืืช ื”ืงื•ืžื™ื˜ื™ื. ื•ืงืฆืช ื›ืžื• ื›ืฉื ื ืขืœื™ื ืžื—ื•ืฅ ืœื‘ื™ืช, ื’ื ืคื” ื‘ื“ื™ื•ืง ื‘ืฉื ื™ื” ืฉืื ื™ ืœื•ื—ืฅ ืขืœ ื” Enter ืคืชืื•ื ืื ื™ ืžื‘ื™ืŸ ืฉืขื“ื™ืฃ ื”ื™ื” ืœื”ืคืจื™ื“ ืืช ื”ืฉื™ื ื•ื™ ืœืฉื ื™ ืงื•ืžื™ื˜ื™ื, ืื• ืฉืฉื›ื—ืชื™ ืœื”ื•ืกื™ืฃ ืงื•ื‘ืฅ ื‘ืงื•ืžื™ื˜, ืื• ืฉื”ื™ืชื” ืœื™ ืื™ื–ื” ืฉื’ื™ืืช ื›ืชื™ื‘ ื‘ืงื•ื“ ืื• ื‘ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜. ืจืง ืฉืžื” ืฉืœืคื ื™ ืฉื ื™ื” ื”ื™ื” ืขื ื™ื™ืŸ ืคืฉื•ื˜ ืฉืœ ืœืคืชื•ื— ืืช ื”ืืจื•ืŸ ื•ืœื”ื•ืฆื™ื ืืช ื”ืžืคืชื—ื•ืช, ื”ื•ืคืš ืœืขืกืง ื”ืจื‘ื” ื™ื•ืชืจ ืžืกื•ื‘ืš ืื—ืจื™ ื” push, ื›ื™ ืขื›ืฉื™ื• ืฆืจื™ืš ืœืจื•ืฅ ืœื›ืœ ื”ืื ืฉื™ื ืฉื‘ื˜ืขื•ืช ืงื™ื‘ืœื• ืืช ื”ืงื•ืžื™ื˜ ื”ื–ื” ื•ืœื‘ืงืฉ ืžื”ื ืœื”ืชืขืœื ืžืžื ื• ืื• ืœื”ื™ื–ื”ืจ ื‘ pull ื”ื‘ื ื›ื™ ืื ื™ ื”ื•ืœืš ืœื“ืจื•ืก ืืช ื”ืžืื’ืจ ื”ืžืจื›ื–ื™. ื•ื˜ื™ืค ืœืกื™ื•ื - ืฆืขื“ ื‘ื“ืจืš ืœื’ืžื™ืœื” ืž push ื™ื›ื•ืœ ืœื”ื™ื•ืช ืœื‘ื˜ืœ ืืช ื” upstream tracking ืฉืœ ื”ืขื ืฃ ืฉืืชื ืขื•ื‘ื“ื™ื ืขืœื™ื•, ื•ื›ืš push ื‘ืœื™ ืฉื ืฉืœ ืขื ืฃ ืœื ื™ืขื‘ื•ื“. ื›ืœื•ืžืจ ืขืœ ืขื ืฃ ืงื™ื™ื ืฉื›ื‘ืจ ืขื•ืงื‘ ืื—ืจ ืขื ืฃ ืžืจื•ื—ืง ื ืคืขื™ืœ:
$ git branch --unset-upstream
ื•ืขื›ืฉื™ื• ื ื™ืกื™ื•ืŸ ืœืขืฉื•ืช push ื™ื™ื›ืฉืœ ืขื ื”ื”ื•ื“ืขื”:
fatal: The current branch mybranch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin mybranch
ืืชื ืขื“ื™ื™ืŸ ื™ื›ื•ืœื™ื ืœืขืฉื•ืช push ืื ืืชื ืžืฉื•ื›ื ืขื™ื ืฉื–ื” ืจืขื™ื•ืŸ ื˜ื•ื‘ ืชื•ืš ืฆื™ื•ืŸ ืฉื ื”ืขื ืฃ ื‘ืฆื•ืจื” ืžืคื•ืจืฉืช, ื‘ืžืงืจื” ืฉืœื™ ื–ื”:
$ git push origin mybranch
ื•ื”ื™ืชืจื•ืŸ ื”ื•ื ืฉื›ื‘ืจ ืื™ ืืคืฉืจ ืœื›ืชื•ื‘ ื‘ื˜ืขื•ืช git push ืžื™ื“ ืื—ืจื™ ืงื•ืžื™ื˜ ื•ืื—ืจื™ ื–ื” ืœืื›ื•ืœ ืืช ื”ืœื‘ ื›ืฉืฆืจื™ืš ืœืชืงืŸ ืฉื’ื™ืืช ื›ืชื™ื‘.

ToCode
1 419
ื‘ืชื™ืขื•ื“ ืฉืœ ืคื™ื™ืชื•ืŸ ื™ืฉ ื“ืฃ ืžื™ื“ืข ืžืขื•ืœื” ืขืœ ืขื‘ื•ื“ื” ืขื ืชืืจื™ื›ื™ื ืฉื›ื•ืœืœ ืืช ื›ืœ ื”ื“ื•ื’ืžืื•ืช ืžื›ืืŸ ื•ื”ืจื‘ื” ื™ื•ืชืจ: https://docs.python.org/3/library/datetime.html

ToCode
1 419
# ืžืชื™ ืชื•ืจื™? ืกืงืจื™ืคื˜ ืคื™ื™ืชื•ืŸ ืคืฉื•ื˜ ืœื—ื™ืฉื•ื‘ ื–ืžืŸ ื”ืžืชื ื” ื”ืœื›ืชื™ ืœืžืฉืจื“ ื”ืคื ื™ื ื”ืฉื‘ื•ืข ืœื—ื“ืฉ ื“ืจื›ื•ืŸ ื•ื’ื™ืœื™ืชื™ ืฉื ื™ ื“ื‘ืจื™ื - ื”ืžืงื•ืžื ื™ื•ืชืจ ื”ื•ื ืฉืฆืจื™ืš ืœืฉืœื ื™ื•ืชืจ ื›ื“ื™ ืฉื”ืคืจื˜ื™ื ืฉืœื™ ืœื ื™ื™ืฉืžืจื• ื‘ืžืื’ืจ ื”ื‘ื™ื•ืžื˜ืจื™ (ื›ื™ ื”ื“ืจื›ื•ืŸ ืชืงืฃ ืจืง ืœื—ืžืฉ ืฉื ื™ื). ื•ืื ื™ ื”ื™ื™ืชื™ ื‘ื˜ื•ื— ืฉืื ื™ ื—ื•ืกืš ืœื”ื ืžืงื•ื ืฉื. ื”ืคื—ื•ืช ืžืงื•ืžื ื”ื•ื ืฉืืคื™ืœื• ืื—ืจื™ ืฉืžื–ืžื™ื ื™ื ืชื•ืจ ื—ืฆื™ ืฉื ื” ืžืจืืฉ, ืขื“ื™ื™ืŸ ืฆืจื™ืš ืœื—ื›ื•ืช ืื™ื–ื• ืฉืขื” ืขื“ ืฉื ื›ื ืกื™ื. ื‘ืฉื‘ื™ืœ ืœื”ืชืžื•ื“ื“ ืขื ื”ืฉื ื™ ื•ื‘ืฉื‘ื™ืœ ืœื ืœื”ืฉืชืขืžื ื‘ืฉืขื” ื”ื–ืืช, ื›ืชื‘ืชื™ ืกืงืจื™ืคื˜ ืคื™ื™ืชื•ืŸ ืงืฆืจ ืฉืขื•ื–ืจ ืœื”ื‘ื™ืŸ ื›ืžื” ื–ืžืŸ ื”ืžืชื ื” ืขื•ื“ ื ืฉืืจ ืœืš. ื”ื•ื ืœื ืžื“ื•ื™ืง ืื‘ืœ ื›ืŸ ืืคืฉืจ ืœืœืžื•ื“ ืžืžื ื• ื“ื‘ืจ ืื• ืฉื ื™ื™ื ืœื’ื‘ื™ ื˜ื™ืคื•ืœ ื‘ื–ืžื ื™ื ื‘ืคื™ื™ืชื•ืŸ, ืื– ืื ื™ ืžืฉืชืฃ. ## ืื™ืš ืขื•ื‘ื“ื™ื ืขื timedelta ื• datetime ื™ืฉ ืžืกืคืจ ืžื—ืœืงื•ืช ืœืขื‘ื•ื“ื” ืขื ื–ืžื ื™ื ื‘ืคื™ื™ืชื•ืŸ. ืืœื” ืฉื™ืขื–ืจื• ืœื ื• ื‘ืกืงืจื™ืคื˜ ื”ืŸ datetime, ืฉืžื™ื™ืฆื’ืช ืื•ื‘ื™ืงื˜ ืชืืจื™ืš ื•ืฉืขื”, ื• timedelta ืฉืžื™ื™ืฆื’ืช ื”ืคืจืฉ ื‘ื™ืŸ ืฉื ื™ ืื•ื‘ื™ืงื˜ื™ datetime. ื”ืคื•ื ืงืฆื™ื” now ืฉืœ datetime ืžื—ื–ื™ืจื” ืื•ื‘ื™ืงื˜ ืฉืžืชืื™ื ืœืžื” ืฉื™ืฉ ืขื›ืฉื™ื•. ื”ื ื” ื›ืžื” ื“ื•ื’ืžืื•ืช ืœืฉื™ืžื•ืฉ ื‘ืžื—ืœืงื•ืช:
>>> from datetime import datetime, timedelta
>>> datetime.now()
datetime.datetime(2022, 5, 16, 21, 34, 23, 446115)

>>> datetime.now() + timedelta(days=1)
datetime.datetime(2022, 5, 17, 21, 35, 3, 13974)

>>> datetime.now() - timedelta(minutes=10)
datetime.datetime(2022, 5, 16, 21, 25, 18, 937076)
ืืคืฉืจ ื’ื ืœื™ืฆื•ืจ ืื•ื‘ื™ืงื˜ datetime ืžืชืืจื™ืš ื•ืฉืขื” ืกืคืฆื™ืคื™ื™ื, ืื• ืœืงื—ืช ืื•ื‘ื™ืงื˜ ืงื™ื™ื ื•ืœื”ื—ืœื™ืฃ ื—ืœืง ืžื”ืฉื“ื•ืช ืฉืœื•. ืœื“ื•ื’ืžื” ื”ืงื•ื“ ื”ื‘ื ืœื•ืงื— ืื•ื‘ื™ืงื˜ datetime ืฉืœ ื”ื™ื•ื ื•ืžื—ืœื™ืฃ ืจืง ืืช ื”ืฉืขื” ื•ื”ื“ืงื•ืช ืœืฉืขื” ืืจื‘ืข ืื—ืจ ื”ืฆื”ืจื™ื™ื:
>>> datetime.now().replace(hour=16, minute=0)
datetime.datetime(2022, 5, 16, 16, 0, 17, 369505)
## ื”ื ืชื•ื ื™ื ืขื›ืฉื™ื• ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ืœืขื‘ื•ื“ ืขื datetime ื• timedelta ื”ื’ื™ืข ื”ื–ืžืŸ ืœืืกื•ืฃ ืงืฆืช ื ืชื•ื ื™ื. ืื ืืชื ื™ื•ืฉื‘ื™ื ื‘ืžืฉืจื“ ื”ืคื ื™ื ืื• ื‘ื“ื•ืืจ ืืคืฉืจ ืคืฉื•ื˜ ืœืจืฉื•ื ื‘ืงื•ื‘ืฅ ืืช ืžื” ืฉืฉื•ืžืขื™ื. ื–ืืช ื”ืจืฉื™ืžื” ืฉืื ื™ ืฉืžืขืชื™:
16:02 484
16:06 501
16:07 504
16:09 508
16:11 510
16:12 513
16:14 511
16:15 516
16:21 521
16:22 523
16:26 478
16:30 524
16:32 525
16:33 530
16:34 532
16:36 527
16:37 531
16:39 534
16:42 542
16:45 541
ื”ืขืžื•ื“ื” ื”ืจืืฉื•ื ื” ืžื™ื™ืฆื’ืช ืฉืขื” ื•ื”ืขืžื•ื“ื” ื”ืฉื ื™ื” ืืช ื”ืžืกืคืจ ืฉืœ ืžื™ ืฉืขื›ืฉื™ื• ื ื›ื ืก. ืื ื™ ื”ื™ื™ืชื™ 547 ื•ืจืฆื™ืชื™ ืœื“ืขืช ื›ืžื” ื–ืžืŸ ืขื•ื“ ื ืฉืืจ ืœื™ ืœื—ื›ื•ืช. ื•ืขื›ืฉื™ื• ืœืกืงืจื™ืคื˜. ## ืื™ืš ืžื—ืฉื‘ื™ื ื‘ืฉื‘ื™ืœ ืœื—ืฉื‘ ื›ืžื” ื–ืžืŸ ื”ืžืชื ื” ืขื•ื“ ื ืฉืืจ, ืžืกืคื™ืง ืœื”ืกืชื›ืœ ืขืœ ื›ืžื” ืฉื•ืจื•ืช ืื—ืจื•ื ื•ืช ื‘ืงื•ื‘ืฅ. ืื ื—ื ื• ืœื ืจื•ืฆื™ื ืœื”ืกืชื›ืœ ืขืœ ื›ืœ ื”ืงื•ื‘ืฅ ื›ื™ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉืžื™ืฉื”ื• ื ืชืงืข ืœืคื ื™ ื—ืฆื™ ืฉืขื”, ืื• ืฉืœืคื ื™ ืฉืขื” ื”ื™ื• ืคื—ื•ืช ืคืงื™ื“ื™ื ืžืžื” ืฉื™ืฉ ืขื›ืฉื™ื•. ื—ืžืฉ ืื• ืขืฉืจ ืฉื•ืจื•ืช ืื—ืจื•ื ื•ืช ื™ืชื ื• ืชื•ืฆืื” ืžื“ื•ื™ืงืช. ืฉืžืชื™ ืœื‘ ื’ื ืฉืื ืฉื™ื ืœื ืชืžื™ื“ ื ื›ื ืกื™ื ืœืคื™ ื”ืกื“ืจ ืื‘ืœ ื”ืชืขืœืžืชื™ ืžื–ื” ื‘ืกืงืจื™ืคื˜ ื›ื™ ื‘ืกื•ืฃ ื”ื’ื™ืข ืชื•ืจื™. ื‘ืฉื‘ื™ืœ ื”ื—ื™ืฉื•ื‘ ื™ืฆืจืชื™ ืจืฉื™ืžื”, ืฉื›ืœ ืชื ื‘ืจืฉื™ืžื” ืžื›ื™ืœ ืื•ื‘ื™ืงื˜ datetime ืฉืœ ืฉืขืช ื”ื›ื ื™ืกื” ื•ืžืกืคืจ ืฉืžื™ื™ืฆื’ ืืช ื”ืžืกืคืจ ืฉืœื•. ืชืžื™ื“ ืืคืฉืจ ืœื”ื›ื ื™ืก ืขื•ื“ ืฉื•ืจื•ืช ืœืจืฉื™ืžื” ื›ืฉืžืงืจื™ืื™ื ืขื•ื“ ืžืกืคืจ, ืื• ืœืงืจื•ื ืงื•ื‘ืฅ ืฉื›ื‘ืจ ื›ืœ ื”ืฉื•ืจื•ืช ื ืžืฆืื•ืช ื‘ื• ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ืจืฉื™ืžื” ืžืืคืก. ืื ื—ื ื• ื›ืŸ ืฆืจื™ื›ื™ื ืœื ืงื•ืช ืคืจื™ื˜ื™ื ื™ืฉื ื™ื ืื ื’ื•ื“ืœ ื”ืจืฉื™ืžื” ืขื•ืœื” ืขืœ ื’ื•ื“ืœ ื”ื“ื’ื™ืžื” ื”ืจืฆื•ื™. ื–ืืช ื”ืคื•ื ืงืฆื™ื” ืฉืžื˜ืคืœืช ื‘ื–ื”:
def invite(when, who):
    if len(sample) == SAMPLE_SIZE:
        sample.pop()

    sample.insert(0, (when, who))
ืื—ืจื™ ืฉืื ื™ ื‘ื•ื ื” ืืช ื›ืœ ื”ืจืฉื™ืžื” ืื ื™ ืจื•ืฆื” ืœื‘ื“ื•ืง ื›ืžื” ืื ืฉื™ื ืžื—ื›ื™ื ืœืคื ื™ื™ ื‘ืชื•ืจ. ืื ื™ ื™ื•ื“ืข ืฉืื ืฉื™ื ืœื ืชืžื™ื“ ื ื›ื ืกื™ื ืœืคื™ ื”ืกื“ืจ ืื– ืื ื™ ืคืฉื•ื˜ ืžื—ืคืฉ ื‘ื“ื’ื™ืžื” ื”ื ื•ื›ื—ื™ืช ืžื™ ื”ืžืกืคืจ ื”ืžืงืกื™ืžืœื™ ื•ืžื—ืกื™ืจ ืื•ืชื• ืžื”ืžืกืคืจ ืฉืœื™:
def people_before_me(my_number):
    last_number = max(x[1] for x in sample)
    return my_number - last_number
ื”ืืชื’ืจ ื”ื‘ื ื™ื”ื™ื” ืœืžืฆื•ื ืžื” ื–ืžืŸ ื”ื”ืžืชื ื” ื”ืžืžื•ืฆืข ืขื‘ื•ืจ ื”ื“ื’ื™ืžื” ืฉื‘ื ื™ืชื™. ื‘ืฉื‘ื™ืœ ื–ื” ืื ื™ ืžื—ืฉื‘ ืืช ื”ื”ืคืจืฉ ื‘ื™ืŸ ื›ืœ ืฉืชื™ ืฉื•ืจื•ืช ื‘ื“ื’ื™ืžื” - ื”ื”ืคืจืฉ ืžื’ื™ืข ื‘ืชื•ืจ ืื•ื‘ื™ืงื˜ timedelta - ื•ืื– ืžื—ืฉื‘ ืืช ืžืžื•ืฆืข ื”ื”ืคืจืฉื™ื:
def average_wait_time():
    wait_times = []
    prev = sample[0]
    for i in sample[1:]:
        wait_times.append(prev[0] - i[0])
        prev = i

    return sum(w.total_seconds() for w in wait_times) / len(wait_times)
ื”ืคื•ื ืงืฆื™ื” total_seconds ืฉืœ timedelta ืžื—ื–ื™ืจื” ืืช ื”ืคืจืฉ ื”ื–ืžืŸ ื”ื›ื•ืœืœ ื‘ืฉื ื™ื•ืช. ืœืกื™ื•ื ืื ื™ ืงื•ืจื ืืช ืงื•ื‘ืฅ ื”ืงืœื˜ ื•ืžืคืขื ื— ืื•ืชื• ืขื ื”ืคื•ื ืงืฆื™ื•ืช ืฉื›ืชื‘ืชื™:
with open('myturn.txt') as f:
    for line in f:
        try:
            parse_line(line)
        except Exception:
            print(f"Skipped line: {line}")

print(f"Please wait {average_wait_time() * people_before_me(547)} Seconds")

ToCode
1 419
# ื–ื” ื™ื™ืงื— ืจืง ื—ืžืฉ ื“ืงื•ืช ื™ืฉ ืžืฆื‘ื™ื ืฉืื ื—ื ื• ื ืชืงืขื™ื ืขืœ ืงื•ื“ ื•ื™ื•ื“ืขื™ื ืžื” ืฉื‘ื•ืจ ื‘ื• ืคืฉื•ื˜ ืœื ืžืฆืœื™ื—ื™ื ืœืจืื•ืช ืืช ื–ื”. ื›ืชื‘ืชื™ ืขืœ ื“ื•ื’ืžื” ื›ื–ืืช ืœืคื ื™ ื›ืžื” ื™ืžื™ื ืขื ื” div-ื™ื ืฉืœื ื ืกื’ืจื• ืœื™ ื˜ื•ื‘ ื‘ HTML, ืื‘ืœ ืื ื—ื ื• ื’ื ืžื›ื™ืจื™ื ืืช ื–ื” ืžืžืฆื‘ื™ื ืฉืฉื›ื—ื ื• ืœืขืฉื•ืช Save, ืฉื˜ืขื™ื ื• ื‘ืื™ื•ืช ืฉืœ ืžืฉืชื ื” ืื• ืฉืฉื›ื—ื ื• ืœื”ืขื‘ื™ืจ ืื™ื–ื” ืคืจืžื˜ืจ ืœืคื•ื ืงืฆื™ื” ืฉื™ื’ืจื•ื ืœื”ื›ืœ ืœื”ืกืชื“ืจ. ืืœื” ื›ื•ืœื ืžืฆื‘ื™ื ืฉื›ืฉืžื™ืฉื”ื™ ืชืจืื” ืœื™ ืžื” ืฉื‘ื•ืจ ืื ื™ ืžื™ื“ ืื’ื™ื“ "ื™ื• ื ื›ื•ืŸ ืื™ืš ืœื ืฉืžืชื™ ืœื‘" ื•ืืžืฉื™ืš ื”ืœืื”. ื•ืืœื” ื”ืชืงืœื•ืช ืฉื”ื›ื™ ื›ื™ืฃ ืœืขื–ื•ืจ ื‘ื”ืŸ ืœืื ืฉื™ื. ืื‘ืœ ืืœื” ืจืง ื—ืœืง ืงื˜ืŸ ืžื”ืžืฆื‘ื™ื. ื‘ื“ืจืš ื›ืœืœ ื›ืฉืžื™ืฉื”ื• ืžื—ืคืฉ ืชืฉื•ื‘ื” ืฉืœ ื—ืžืฉ ื“ืงื•ืช ื™ืฉ ืคืขืจ ื™ื“ืข ืขืฆื•ื ืฉืžืชื—ื‘ื ืžืื—ื•ืจื™ื”, ืฉื™ื”ื™ื” ืงืฉื” ืœืกื’ื•ืจ ื‘ื—ืžืฉ ื“ืงื•ืช. ืื ืžื™ืฉื”ื• ื™ืฉืืœ ืื•ืชื™ ืื™ืš ืœืชืงืŸ ื˜ืงืกื˜ ืฉืœ ื”ื•ื“ืขืช ืงื•ืžื™ื˜ ื‘ื’ื™ื˜, ืื ื™ ื™ื›ื•ืœ ืœืขื ื•ืช git commit --amend, ืื‘ืœ ืื– ืื ื™ ืืฆื˜ืจืš ืœื”ืกื‘ื™ืจ ืžื” ื–ื” ืžืื’ืจ ืžืจื•ื—ืง, ื•ืœืžื” ืœื ื›ื“ืื™ ืœืขืฉื•ืช ืืช ื–ื” ืื—ืจื™ ืฉืขืฉื™ืช push, ื•ืขืœ ื” Immutability ืฉืœ ืงื•ืžื™ื˜ื™ื ื•ืขื•ื“ ืื™ื ืกื•ืฃ ืคืจื˜ื™ื ืขืœ ืื™ืš ื’ื™ื˜ ืขื•ื‘ื“. ืชืฉื•ื‘ื” ืฉืœ ื—ืžืฉ ื“ืงื•ืช ืœื ืชืขื–ื•ืจ ื›ืืŸ. ืื• ื‘ื“ื•ื’ืžื” ืื—ืจืช ืž bash ื”ืคืขื, ื‘ืฉื‘ื™ืœ ืœื”ืกื‘ื™ืจ ืœืžื™ืฉื”ื™ ืื™ืš ืœืชืงืŸ ืืช ื”ืกืงืจื™ืคื˜ ื”ื–ื”:
#!/bin/bash

count=0

ls | while IFS= read -r line;
do
  (( count++ ))
done

echo $count
ืื ื™ ืืฆื˜ืจืš ืœื”ืกื‘ื™ืจ ืœื” ืžื” ื–ื” subshell ื•ืžื” ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ื“ื‘ืจื™ื ืฉืงื•ืจื™ื ื‘ืชื•ืš subshell ืœื“ื‘ืจื™ื ืฉืงื•ืจื™ื ื‘ืกืงืจื™ืคื˜ ื•ืื™ื–ื” ืกื•ื’ื™ ืžื™ื“ืข ืืคืฉืจ ืœื”ืขื‘ื™ืจ ื‘ื™ืŸ ื”ืฉื ื™ื™ื ื•ืื™ืš - ื•ื‘ืงื™ืฆื•ืจ ืชืฉื•ื‘ื” ื˜ื•ื‘ื” ืชื™ืงื— ืœืฉื ื™ื ื• ื”ืจื‘ื” ื™ื•ืชืจ ืžื—ืžืฉ ื“ืงื•ืช. ื—ื™ืคื•ืฉ ืชืฉื•ื‘ื” ืฉืœ 5 ื“ืงื•ืช ื”ื•ื ื”ืกื—ืช ื“ืขืช. ื›ืžืขื˜ ืชืžื™ื“ ื›ืฉืืชื ืชืงื•ืขื™ื ืขืœ "ืžืฉื”ื• ืงื˜ืŸ", ืขื“ื™ืฃ ืœื”ืชืืžืฅ ื•ืœืฉื™ื ืœื‘ ืœืžืฉื”ื• ื”ื’ื“ื•ืœ ืฉื ืžืฆื ืžืชื—ืชื™ื•.

ToCode
1 419
true
ื‘ืžืงื•ื ื–ื”, ื”ื“ืจืš ื”ืžืงื•ื‘ืœืช ื”ื™ื•ื ืœื‘ื“ื•ืง ืื ืื•ื‘ื™ืงื˜ ืžืกื•ื™ื ื”ื•ื ืžืขืจืš ื”ื™ื ื”ืคื•ื ืงืฆื™ื” Array.isArray ืฉืžื•ื‘ื ื™ืช ื‘ืฉืคื” ื•ื ืชืžื›ืช ื‘ื›ืœ ืžืงื•ื:
> const x = { a: 10, length: 20 };
> Array.isArray(x)
false
## ื˜ืจื™ืง 3 - ื‘ื“ื™ืงื” ืื ืฉื“ื” ืžืกื•ื™ื ืฉื™ื™ืš ืœืื•ื‘ื™ืงื˜ ืื• ืœ Prototype ืฉืœื• ื”ืžื ื’ื ื•ืŸ ื”ืžื™ื•ืชืจ ื”ืฉืœื™ืฉื™ ื•ื”ืื—ืจื•ืŸ ื”ื•ื ื”ื‘ื“ื™ืงื”:
if (Object.prototype.hasOwnProperty(k)) {}
ื”ืคื•ื ืงืฆื™ื” hasOwnProperty ื ื•ืขื“ื” ืœื”ื‘ื“ื™ืœ ื‘ื™ืŸ ืžืืคื™ื™ื ื™ื ืฉื”ื "ื‘ืืžืช" ื‘ืื•ื‘ื™ืงื˜ ืฉืœื™, ืœื‘ื™ืŸ ืžืืคื™ื™ื ื™ื ืฉืืคืฉืจ ืœื”ื’ื™ืข ืืœื™ื”ื ืžื”ืื•ื‘ื™ืงื˜ ืฉืœื™ ืื‘ืœ ื”ื ื‘ืขืฆื ืžื•ื’ื“ืจื™ื ืขืœ ืื•ื‘ื™ืงื˜ ืื—ืจ ืฉื”ื•ื ื‘ืžืขืœื” ื” Prototype Chain. ืœื“ื•ื’ืžื” ื”ืžืืคื™ื™ืŸ toString ื–ืžื™ืŸ ืขืœ ื›ืœ ืื•ื‘ื™ืงื˜ JavaScript:
> const x = { a: 10 }
> x.toString()
'[object Object]'
ืื‘ืœ ืœื ื”ื™ื™ื ื• ืจื•ืฆื™ื ืœืงื‘ืœ ืื•ืชื• ื‘ืื™ื˜ืจืฆื™ื” ืฉืœ forEach ื›ื™ ื”ื•ื ืžื•ื’ื“ืจ ื‘ Object.prototype ื•ืœื ืขืœ ื”ืื•ื‘ื™ืงื˜ ืฉืขืœื™ื• ืื ื™ ืจืฅ. ื”ื˜ืจื™ืง ื”ื–ื” ืขื“ื™ื™ืŸ ืจืœื•ื•ื ื˜ื™ ืื ืืชื ืžื‘ืฆืขื™ื ืœื•ืœืืช for ... in ืขืœ ืื•ื‘ื™ืงื˜, ืื‘ืœ ืžื” ืฉื”ื•ืคืš ืื•ืชื• ืœืžื™ื•ืฉืŸ ื–ื” ืฉื›ืžืขื˜ ืื™ืŸ ืกื™ื‘ื” ืœื‘ื™ืฆื•ืข ืœื•ืœืื•ืช ื›ืืœื”. ื”ืœื•ืœืื” ืฉื”ืจืื™ืชื™ ื‘ืชื—ื™ืœืช ื”ืคื•ืกื˜:
for (const [k, v] of Object.entries(x)) {
  handler(v, k);
}
ืื•ื˜ื•ืžื˜ื™ืช ืžืกื ื ืช ื”ื—ื•ืฆื” ืืช ื›ืœ ื”ืžืืคื™ื™ื ื™ื ืฉื”ื’ื™ืขื• ืœืื•ื‘ื™ืงื˜ ื“ืจืš ื” Prototype ืฉืœื• ื•ื ื•ืชื ืช ืชื•ืฆืื” ื–ื”ื” ื‘ืชื—ื‘ื™ืจ ื™ื•ืชืจ ื ื•ื—. ื ื›ื•ืŸ, ืื ื—ื ื• ืžืคืกื™ื“ื™ื ื‘ื‘ื™ืฆื•ืขื™ื ืื‘ืœ ืงืฉื” ืœื™ ืœื”ืืžื™ืŸ ืฉื”ืคืขืจ ื™ื”ื™ื” ืžื•ืจื’ืฉ ื‘ืื™ื–ื•ืฉื”ื™ ืืคืœื™ืงืฆื™ื” ืืžื™ืชื™ืช.

ToCode
1 419
# ืฉืœื•ืฉื” ื˜ืจื™ืงื™ื ืฉืœ foreach ืฉื›ื‘ืจ ืœื ื›ื“ืื™ ืœืขืฉื•ืช ื”ื—ื‘ื™ืœื” foreach ืขืœืชื” ืœื›ื•ืชืจื•ืช ืœื ืžื–ืžืŸ ื›ืฉืฆื™ื™ืฆืŸ ืื—ื“ ื˜ืขืŸ ืฉื”ืฆืœื™ื— ืœื”ืฉืชืœื˜ ืขืœ ื—ืฉื‘ื•ืŸ ื” npm ืฉืžื ื”ืœ ืื•ืชื”. ื–ื” ื”ืกืชื‘ืจ ื‘ืชื•ืจ ืคื™ื™ืง ื ื™ื•ื– ืื‘ืœ ืขืฉื” ื”ืจื‘ื” ืจืขืฉ, ื•ื”ื–ื›ื™ืจ ืœืžื™ ืฉื”ื™ื” ืฆืจื™ืš ืชื–ื›ื•ืจืช ื›ืžื” ืฉื‘ื™ืจ ื›ืœ ื”ืขืกืง ื”ื–ื” ืฉืœ ื—ื‘ื™ืœื•ืช npm. ื‘ื™ื ืชื™ื™ื ื•ื‘ื’ืœืœ ืฉื”ื—ื‘ื™ืœื” ื›ื•ืœืœืช ื‘ืกืš ื”ื›ืœ ืคื•ื ืงืฆื™ื” ืื—ืช ืœื ืžืกื•ื‘ื›ืช, ื—ืฉื‘ืชื™ ืœื ืฆืœ ืืช ื”ื‘ืื– ื›ื“ื™ ืœืœื›ืช ืœืงืจื•ื ืืช ื”ืงื•ื“ ื•ืœืœืžื•ื“ ืžืžื ื• ืฉืœื•ืฉื” ื˜ืจื™ืงื™ื ืฉืคืขื ื”ื™ื• ืžืงื•ื‘ืœื™ื ื‘ JavaScript ืื‘ืœ ื”ื™ื•ื ื›ื‘ืจ ืœื ื›ื“ืื™ ืœื”ืฉืชืžืฉ ื‘ื”ื: ## ืงื•ื“ื ื›ืœ ื”ืงื•ื“ ืžื˜ืจืช ื”ื—ื‘ื™ืœื” ื‘ื’ื“ื•ืœ ืœืืคืฉืจ ืœืžืชื›ื ืชื™ื ืœืจื•ืฅ ื‘ืœื•ืœืื” ืขืœ ืื•ื‘ื™ืงื˜ ื‘ืœื™ ืœื“ืขืช ืื ื”ื•ื ืžืขืจืš ืื• ืื•ื‘ื™ืงื˜. ืื ื”ื•ื ืžืขืจืš ื”ืœื•ืœืื” ืชืคืขื™ืœ ืคื•ื ืงืฆื™ื™ืช ื˜ื™ืคื•ืœ ื•ืชืขื‘ื™ืจ ืœื” ื›ืœ ืคืขื ืื™ื ื“ืงืก ื•ืขืจืš, ื•ืื ื”ื•ื ืื•ื‘ื™ืงื˜ ื”ืœื•ืœืื” ืชืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” ื•ืชืขื‘ื™ืจ ืœื” ื›ืœ ืคืขื ืžืคืชื— ื•ืขืจืš. ื‘ readme ื”ื ื ื•ืชื ื™ื ืืช ื”ื“ื•ื’ืžื” ื”ื‘ืื”:
var each = require('foreach');

each([1,2,3], function (value, key, array) {
    // value === 1, 2, 3
    // key === 0, 1, 2
    // array === [1, 2, 3]
});

each({0:1,1:2,2:3}, function (value, key, object) {
    // value === 1, 2, 3
    // key === 0, 1, 2
    // object === {0:1,1:2,2:3}
});
ืœืžืจื•ืช ืฉืื ื™ ืœื ืžืžืฉ ืจื•ืื” ืืช ื”ืขืจืš ื‘ื›ื–ืืช ืกืคืจื™ื”, ื”ืจื‘ื” ื›ื•ืชื‘ื™ ืกืคืจื™ื•ืช ืื—ืจื™ื ื‘ npm ื›ืŸ ืจืื• ืืช ื”ืขืจืš ื•ื‘ืืชืจ ื™ืฉ 141 ืกืคืจื™ื•ืช ืฉืชืœื•ื™ื•ืช ื‘ foreach ื›ืืฉืจ ื”ื’ื™ืจืกื” ื”ืงื•ื“ืžืช (ืœืคื ื™ ืคืจืฉื™ื™ืช ื”ื”ืฉืชืœื˜ื•ืช ื”ืžื–ื•ื™ืคืช) ื”ื’ื™ืขื” ื›ืžืขื˜ ืœ 6 ืžื™ืœื™ื•ืŸ ื”ื•ืจื“ื•ืช ืกืš ื”ื›ืœ ื‘ 8 ื”ืฉื ื™ื ืžืื– ืคื•ืจืกืžื”. ืฆืจื™ืš ืœื”ื’ื™ื“, ื”ืกืคืจื™ื” ื“ื™ ื ื˜ื•ืฉื” ื•ืขื JavaScript ืžื•ื“ืจื ื™ ืื™ืŸ ืžืžืฉ ื˜ืขื ืœื”ืฉืชืžืฉ ื‘ื”. ื”ืงื•ื“ ื”ื‘ื ืขื•ื‘ื“ ื‘ื›ืœ ื”ื“ืคื“ืคื ื™ื ื•ื ื•ืชืŸ ืœื•ืœืื” ื–ื”ื” ืœืžืขืจื›ื™ื ื•ืื•ื‘ื™ืงื˜ื™ื:
const x = [10, 20, 30, 40];

const y = { a: 10, b: 20, c: 30, d: 40 };

function handler(value, key) {
  console.log(`value ${value}; key ${key}`);
}

for (const [k, v] of Object.entries(x)) {
  handler(v, k);
}

console.log('---');

for (const [k, v] of Object.entries(y)) {
  handler(v, k);
}
ืื‘ืœ ืื ื—ื ื• ืœื ืคื” ื›ื“ื™ ืœื—ืคื•ืจ ื‘ืขื‘ืจ ืืœื ื›ื“ื™ ืœืœืžื•ื“ ืžืžื ื•, ื•ืœื›ืŸ ืœืœื ื“ื™ื—ื•ื™ ื‘ื•ืื• ื ืจืื” ืื™ื–ื” ืื•ืฆืจื•ืช ื ื•ื›ืœ ืœืžืฆื•ื ื‘ืงื•ื“ ืฉืœ foreach. ื–ื” ื›ืœ ื”ืงื•ื“ ืžืชื•ืš ื”ืžืื’ืจ ืฉืœื”ื ื‘ื’ื™ื˜ื”ืื‘:

var hasOwn = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;

module.exports = function forEach (obj, fn, ctx) {
    if (toString.call(fn) !== '[object Function]') {
        throw new TypeError('iterator must be a function');
    }
    var l = obj.length;
    if (l === +l) {
        for (var i = 0; i < l; i++) {
            fn.call(ctx, obj[i], i, obj);
        }
    } else {
        for (var k in obj) {
            if (hasOwn.call(obj, k)) {
                fn.call(ctx, obj[k], k, obj);
            }
        }
    }
};
## ื˜ืจื™ืง 1 - ื‘ื“ื™ืงื” ืื ืื•ื‘ื™ืงื˜ ื”ื•ื ืคื•ื ืงืฆื™ื” ื”ื˜ืจื™ืง ื”ืจืืฉื•ืŸ ื‘ืคื•ื ืงืฆื™ื” ื”ื•ื ื”ื‘ื“ื™ืงื” ื”ืื ื”ืคืจืžื˜ืจ ื”ืฉื ื™ ื”ื•ื ืคื•ื ืงืฆื™ื”. ื”ื ืžืฉืชืžืฉื™ื ื‘ื‘ืœื•ืง ื”ื‘ื:
if (toString.call(fn) !== '[object Function]') {
    throw new TypeError('iterator must be a function');
}
ืžืฆื“ ืื—ื“ ืื ื™ ืื•ื”ื‘ ืฉืกืคืจื™ื•ืช ืžื ืกื•ืช ืœืขื–ื•ืจ ืœื™ ื•ืœื’ืœื•ืช ืฉื’ื™ืื•ืช, ืื‘ืœ ืžืฆื“ ืฉื ื™ ื‘ืจื•ื‘ ื”ืžืงืจื™ื ื‘ื“ื™ืงื•ืช ืžืชื•ื—ื›ืžื•ืช ืžื“ื™ ืขืœื•ืœื•ืช ืœื˜ืขื•ืช ื’ื ื”ืŸ ื•ืื– ื”ื›ืœ ื ื”ื™ื” ื™ื•ืชืจ ืžื‘ืœื‘ืœ. ื‘ืžืงืจื” ืฉืœื ื• ื”ื‘ื“ื™ืงื” ื”ืคืฉื•ื˜ื” ืื ืžืฉื”ื• ื”ื•ื ืคื•ื ืงืฆื™ื” ื”ื™ืชื” ืฆืจื™ื›ื” ืœื”ื™ื•ืช:
if (typeof(fn) !== 'function') {}
ืื• ื™ื•ืชืจ ื˜ื•ื‘ ืœื›ืชื•ื‘ ืืช ื”ืงื•ื“ ื‘ืชื•ืš try/catch ื•ืœื–ื”ื•ืช TypeError. ื”ืกื™ื‘ื” ืœื”ืžืจื” ืœ String ื”ื™ื ื›ื“ื™ ืœื ืœืชืคื•ืก ืคื•ื ืงืฆื™ื•ืช ืžืขืจื›ืช ืžืกื•ื™ืžื•ืช ื•ืœื”ื›ืจื™ื— ืืช ื”ืงื•ืจื ืœื”ืขื‘ื™ืจ ืคื•ื ืงืฆื™ื” ืฉื”ื•ื ื”ื’ื“ื™ืจ ืœื‘ื“. ื”ื‘ืขื™ื” ืขื ื–ื” ื”ื™ื ืฉื”ื™ื•ื ื™ืฉ ื”ืจื‘ื” ืคื•ื ืงืฆื™ื•ืช ืืžื™ืชื™ื•ืช ืฉืžืฉืชืžืฉ ืžื’ื“ื™ืจ ืœื‘ื“ ืฉื™ื—ื–ื™ืจื• ื˜ืงืกื˜ ืื—ืจ ื‘ toString ืฉืœื”ืŸ, ืœื“ื•ื’ืžื” ืคื•ื ืงืฆื™ื•ืช ืืกื™ื ื›ืจื•ื ื™ื•ืช:
> async function h() { }
undefined
> Object.prototype.toString.call(h)
'[object AsyncFunction]'
## ื˜ืจื™ืง 2 - ื‘ื“ื™ืงื” ืื ืื•ื‘ื™ืงื˜ ื”ื•ื ืžืขืจืš ื”ื—ืœืง ื”ื‘ื ืฉืœ ื”ืงื•ื“ ืฆืจื™ืš ืœื”ืคืขื™ืœ ืœื•ืœืื” ืื—ืจืช ืขืœ ืื•ื‘ื™ืงื˜ ื•ืœื•ืœืื” ืื—ืจืช ืขืœ ืžืขืจืš. ื”ื ื‘ื•ื“ืงื™ื ืžื” ื”ื ืงื™ื‘ืœื• ื‘ืืžืฆืขื•ืช ื”ืžืืคื™ื™ืŸ length - ืื ื™ืฉ ืœืš length ืืชื” ืžืขืจืš, ื‘ืœืขื“ื™ื• ืืชื” ืื•ื‘ื™ืงื˜. ื›ืืŸ ืื ื—ื ื• ื›ื‘ืจ ืœื ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ typeof ื›ื™:
> typeof [1,2,3]
'object'
ืื‘ืœ ืžืฆื“ ืฉื ื™ ื”ืžืืคื™ื™ืŸ length ื”ื•ื ื’ื ืœื ืจืขื™ื•ืŸ ื˜ื•ื‘. ื‘ืชื•ืจ ื”ืชื—ืœื” ืื ื™ ื™ื›ื•ืœ ืœื”ื•ืกื™ืฃ ืืช ื”ืžืืคื™ื™ืŸ length ืœื›ืœ ืื•ื‘ื™ืงื˜ ืฉืœื™, ื•ืื– ื”ืคื•ื ืงืฆื™ื” each ืชืชื™ื—ืก ืืœื™ื• ื‘ื˜ืขื•ืช ื›ืžื• ืœืžืขืจืš:
> const x = { a: 10, length: 20 };
>  var l = x.length;
> l === +l