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
+130 kunlar
Postlar arxiv
ToCode
1 419
// Definitions by: Zlatko Andonovski, Andrew Yang, Chandler Fang and Zac Xu

declare function leftPad(str: string|number, len: number, ch?: string|number): string;

declare namespace leftPad { }

export = leftPad;
ืงืจื™ืื” ืžื”ื™ืจื” ื‘ืงื•ื“ ืžืจืื” ืœื ื• ืฉื ื™ ืฉื™ื ื•ื™ื™ื ืžืฉืžืขื•ืชื™ื™ื ืžื‘ื—ื™ื ืช ื‘ื™ืฆื•ืขื™ื: 1. ืฉื™ื ื•ื™ ื‘ืืœื’ื•ืจื™ืชื ืฉืžืงืฆืจ ืžืฉืžืขื•ืชื™ืช ืืช ื”ืœื•ืœืื”. 2. ืชื•ืกืคืช Cache ืฉืžืงืฆืจืช ืžืฉืžืขื•ืชื™ืช ืืช ื–ืžืŸ ื”ื—ื™ืฉื•ื‘ ืขื‘ื•ืจ ืงืœื˜ื™ื ืงืฆืจื™ื. ื ืชื—ื™ืœ ืขื ื” cache. ื‘ื ื’'ืžืŸ ื’ืจื™ื ื‘ืื•ื ื”ื•ืกื™ืฃ ืื•ืชื• ืขื ื”ืขืจืช ื”ืงื•ืžื™ื˜ ื”ื‘ืื”: > Cache for very common cases > I estimate that the majority of people who left pad use it for formatting in which case performing any calculations at all is silly. ืื ื™ ืœื ื‘ื˜ื•ื— ืžื” ื’ื•ื“ืœ ื”ื—ื™ืกื›ื•ืŸ ืฉืœ ื” Cache ื›ื™ ื”ื•ื ื‘ืืžืช ืžืฉืžืฉ ืจืง ืœืื•ืจื›ื™ื ืžืื•ื“ ืงื˜ื ื™ื, ืื‘ืœ ืžื‘ื—ื™ื ืช ืงื•ื“ ื–ื” ื‘ืืžืช ื ื•ืชืŸ ื˜ืืฆ' ืžื•ืฉืงืข. ื”ืฉื™ื ื•ื™ ื”ื™ื•ืชืจ ืžืฉืžืขื•ืชื™ ื”ื•ื ื–ื” ืฉืžื•ืคื™ืข ื‘ PR ื”ื–ื”: https://github.com/camwest/left-pad/pull/5 ื•ื”ื•ื ื”ืฉื™ื ื•ื™ ื‘ืืœื’ื•ืจื™ืชื. ื”ื ื” ื”ื—ืœืง ื”ืžืจื›ื–ื™ ืžืžื ื• ื‘ืœื™ ื”ืขืจื•ืช ื›ื“ื™ ืฉื™ื”ื™ื” ืœื ื• ืงืœ ืœืงืจื•ื:
while (true) {
  if (len & 1) pad += ch;

  len >>= 1;

  if (len) {
    ch += ch;
  } else {
    break;
  }
}
// pad `str`!
return pad + str;

ืžื” ืงื•ืจื” ื›ืืŸ? ืื– ืื ื ื—ืฉื•ื‘ ืขืœ ื–ื” ืจื’ืข ื”ืืชื’ืจ ืฉืœื ื• ื”ื•ื ืœื‘ื ื•ืช ืžื—ืจื•ื–ืช ื‘ืื•ืจืš len ืฉืžื•ืจื›ื‘ืช ืžืจื•ื•ื—ื™ื ื‘ืœื‘ื“, ื•ืื•ืชื” ืœื”ืฆืžื™ื“ ืœื”ืชื—ืœื” ืฉืœ str. ื‘ื’ื™ืจืกื” ื”ืœื ื™ืขื™ืœื” ืฉืงืจืื ื• ืงื•ื“ื ื”ื‘ื ื™ื” ื”ื™ืชื” ื‘ืืžืฆืขื•ืช ืœื•ืœืื” ืฉื›ืœ ืคืขื ื”ื•ืกื™ืคื” ืจื•ื•ื— ืื—ื“ ื•ืœื›ืŸ ื”ื™ืชื” ืฆืจื™ื›ื” len ืื™ื˜ืจืฆื™ื•ืช. ื‘ื’ื™ืจืกื” ืฉืœ ื‘ื ื’'ืžืŸ ื™ืฉ ืœื ื• ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืžืขื ื™ื™ื ื™ืช: ื ืฉื™ื ืœื‘ ืฉื›ืœ ืžืกืคืจ ืืคืฉืจ ืœื™ื™ืฆื’ ื‘ืืžืฆืขื•ืช ืกื›ื•ื ืฉืœ ื—ื–ืงื•ืช ืฉืœ 2. ื–ื” ื‘ืขืฆื ื”ื™ื™ืฆื•ื’ ืฉืœ ื”ืžืกืคืจ ื‘ื‘ืกื™ืก 2. ืœื“ื•ื’ืžื” ื”ืžืกืคืจ 8 ื”ื•ื ืคืฉื•ื˜ 2 ื‘ื—ื–ืงืช 3, ื”ืžืกืคืจ 20 ื”ื•ื 2 ื‘ื—ื–ืงืช 4 ื•ืขื•ื“ 2 ื‘ื—ื–ืงืช 2, ื•ื”ืžืกืคืจ 73 ื”ื•ื ื‘ืกืš ื”ื›ืœ 64 (ื›ืœื•ืžืจ 2 ื‘ื—ื–ืงืช 6) ื•ืขื•ื“ 8 (ื›ืœื•ืžืจ 2 ื‘ื—ื–ืงืช 3) ื•ืขื•ื“ 1 (ืฉื–ื” 2 ื‘ื—ื–ืงืช 0). ืื ื‘ืžืงื•ื ืœื”ื•ืกื™ืฃ ื›ืœ ืคืขื ืจื•ื•ื— ืื—ื“, ื ื›ืคื™ืœ ืืช ืžืกืคืจ ื”ืจื•ื•ื—ื™ื ืฉืื ื—ื ื• ืขื•ื‘ื“ื™ื ืื™ืชื ื ื•ื›ืœ ืœื”ื’ื™ืข ืœืกื™ื“ืจืช ืžื—ืจื•ื–ื•ืช ื”ืจื•ื•ื—ื™ื ื”ื‘ืื”:
" "
"  "
"    "
"        "
"                "
ื‘ื›ืœ ืื™ื˜ืจืฆื™ื” ืื ื—ื ื• ื ื•ืกื™ืฃ ืœืžื—ืจื•ื–ืช ื”ืจื•ื•ื—ื™ื ืืช ืขืฆืžื”, ื•ื›ืš ื ื›ืคื™ืœ ืืช ืื•ืจื›ื” ื‘ืคืขื•ืœื” ืื—ืช. ื–ืืช ืžืฉืžืขื•ืช ื”ืฉื•ืจื”:
ch += ch;
ืžืงื•ื“ ื”ืชื•ื›ื ื™ืช. ื”ืื•ืจืš ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ื•ืกื™ืฃ ื›ืžื•ื‘ืŸ ืœื ื›ื•ืœืœ ืืช ื›ืœ ืžื—ืจื•ื–ื•ืช ื”ืจื•ื•ื—ื™ื ื‘ืกื™ื“ืจื” ืืœื ืจืง ืืช ืืœื” ืฉืžืชืื™ืžื•ืช ืœื™ื™ืฆื•ื’ ื”ื‘ื™ื ืืจื™ ืฉืœ len. ื‘ืฉื‘ื™ืœ ืœืžืฆื•ื ืื•ืชืŸ ืื ื—ื ื• ืžื—ืœืงื™ื ืืช len ื‘-2 ื‘ื›ืœ ืื™ื˜ืจืฆื™ื” ื•ืœื•ืงื—ื™ื ืจืง ืืช ื”ืžื—ืจื•ื–ื•ืช ืขื‘ื•ืจืŸ ืชื•ืฆืืช ื”ื—ืœื•ืงื” ื”ื™ื ืื™ ื–ื•ื’ื™ืช. ื–ื• ืžืฉืžืขื•ืช ื”ืฉื•ืจื”:
if (len & 1) pad += ch;
ื‘ื•ืื• ื ื ืกื” ืืช ื–ื” ืขื ืื•ืจืš 20 ื›ื“ื™ ืœืจืื•ืช ืฉื”ืžื ื’ื ื•ืŸ ืขื•ื‘ื“: 1. ื‘ืกื™ื‘ื•ื‘ ื”ืจืืฉื•ืŸ len ื”ื•ื 20, ch ืžื›ื™ืœ ืจื•ื•ื— ื‘ื•ื“ื“ ื• pad ื”ื•ื ืจื™ืง. ืžื—ืœืงื™ื ืืช len ื‘ 2 ื›ื“ื™ ืœืงื‘ืœ 10, ื”ื•ื ื’ื“ื•ืœ ืžืืคืก ื•ืœื›ืŸ ืžื›ืคื™ืœื™ื ืืช ื”ืื•ืจืš ืฉืœ ch ื•ืžืžืฉื™ื›ื™ื ืœืื™ื˜ืจืฆื™ื” ื”ื‘ืื”. 2. ื‘ืกื™ื‘ื•ื‘ ื”ืฉื ื™ len ื”ื•ื ื‘ืื•ืจืš 10, ch ืžื›ื™ืœ ืฉื ื™ ืจื•ื•ื—ื™ื ื• pad ืขื“ื™ื™ืŸ ืจื™ืง. ื–ื™ื›ืจื• ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืืช 16 ื• 4 ื›ื“ื™ ืœื”ื’ื™ืข ืœ 20. ื’ื ื”ืคืขื len ื”ื•ื ื–ื•ื’ื™ ืื– ืžื—ืœืงื™ื ืื•ืชื• ื‘ 2 ื•ืžืžืฉื™ื›ื™ื ืœืื™ื˜ืจืฆื™ื” ื”ื‘ืื”. 3. ื‘ืกื™ื‘ื•ื‘ ื”ืฉืœื™ืฉื™ len ื”ื•ื ื‘ืื•ืจืš 5. ื–ื• ื”ืคืขื ื”ืจืืฉื•ื ื” ืฉื”ื•ื ืื™ ื–ื•ื’ื™ ื•ืœื›ืŸ ืื ื—ื ื• ืœื•ืงื—ื™ื ืืช ch, ืฉื›ืจื’ืข ื™ืฉ ื‘ื• 4 ืจื•ื•ื—ื™ื, ื•ืžืขืชื™ืงื™ื ืื•ืชื• ืœ pad. ืื ื—ื ื• ืžืฉืชืžืฉื™ื ื‘ืžืกืคืจ 4 ืฉืžืฆืื ื• ื›ื“ื™ ืœื‘ื ื•ืช ืืช ืžื—ืจื•ื–ืช ื”ืจื•ื•ื—ื™ื. ืขื›ืฉื™ื• ืžืžืฉื™ื›ื™ื ืœืคื™ ื”ืชื•ื›ื ื™ืช - ืžื—ืœืงื™ื ืืช len ืœ 2 ื‘ื—ืœื•ืงืช ืžืกืคืจื™ื ืฉืœืžื™ื ื•ื ืฉืืจื™ื ืขื 2, ื•ืฉื•ื‘ ืžื›ืคื™ืœื™ื ืืช ch ื›ืš ืฉืขื›ืฉื™ื• ื™ืฉ ื‘ื• 8 ืจื•ื•ื—ื™ื. 4. ื‘ืกื™ื‘ื•ื‘ ื”ืจื‘ื™ืขื™ len ื”ื•ื ื‘ืื•ืจืš 2, ื›ืœื•ืžืจ ื–ื•ื’ื™. ืืคืฉืจ ืœื”ื›ืคื™ืœ ืืช ch ื•ืœืงื‘ืœ ืฉื ืžื—ืจื•ื–ืช ืขื 16 ืจื•ื•ื—ื™ื ื•ืœื”ืžืฉื™ืš ืœืื™ื˜ืจืฆื™ื” ื”ื‘ืื”. 5. ื‘ืกื™ื‘ื•ื‘ ื”ื—ืžื™ืฉื™ len ื™ื•ืจื“ ืœืื•ืจืš 1 (ื›ื™ 2 ื—ืœืงื™ 2 ื ื•ืชืŸ 1). ื–ื” ืื™ ื–ื•ื’ื™ ืื– ืžื•ืกื™ืคื™ื ืœ pad ืืช ื”ืขืจืš ื”ื ื•ื›ื—ื™ ืฉืœ ch ื›ืœื•ืžืจ ืืช ื” 16 ืจื•ื•ื—ื™ื. ืงื•ื“ื ื”ื™ื• ื‘ื• 4 ืจื•ื•ื—ื™ื ื•ืœื›ืŸ ืขื›ืฉื™ื• ื‘ pad ื™ืฉ 20 ืจื•ื•ื—ื™ื. ืžืžืฉื™ื›ื™ื ืœืกื™ื‘ื•ื‘ ื”ื‘ื. 6. ื‘ืื™ื˜ืจืฆื™ื” ื”ืื—ืจื•ื ื” len ืžืชืืคืก ื•ืื ื—ื ื• ื™ื•ืฆืื™ื ืžื”ืœื•ืœืื” ื‘ืงืจื™ืื” ืœ break. ืกืš ื”ื›ืœ ื‘ืฉื‘ื™ืœ ืœื™ื™ืฆืจ ืžื—ืจื•ื–ืช ืฉืœ 20 ืชื•ื•ื™ื ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืจืง 5 ืื™ื˜ืจืฆื™ื•ืช ื‘ืžืงื•ื 20 - ืื• ื‘ืžืงืจื” ื”ื›ืœืœื™ log2(n) ืื™ื˜ืจืฆื™ื•ืช. ื–ื” ื—ื™ืกื›ื•ืŸ ืžืฉืžืขื•ืชื™ ื‘ื–ืžืŸ ืจื™ืฆื” ืื ืžืฉืชืžืฉื™ื ื‘ืคื•ื ืงืฆื™ื” ื”ืจื‘ื” ืคืขืžื™ื. ## ื•ืงื˜ื ื” ืขืœ ch ืœืคื ื™ ืฉื ื™ืคืจื“ ื‘ื•ืื• ื ืชืขื›ื‘ ืจื’ืข ืขืœ ืฉื•ืจืช ื”ื’ื“ืจืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืœืžืฉืชื ื” ch:
if (!ch && ch !== 0) ch = ' ';
ื‘ JavaScript ื”ื™ื•ื ื”ื™ื™ืชื™ ืžื’ื“ื™ืจ ืขืจืš ื‘ืจื™ืจืช ืžื—ื“ืœ ืœืคืจืžื˜ืจ ื‘ืฉื•ืจืช ื”ื—ืชื™ืžื” ืฉืœ ื”ืคื•ื ืงืฆื™ื”, ืื‘ืœ ื‘ื’ื™ืจืกืื•ืช ื™ืฉื ื•ืช ื™ื•ืชืจ ืฉืœ JavaScript ื–ื” ืœื ื”ื™ื” ืืคืฉืจื™. ืขื“ื™ื™ืŸ ื”ื‘ื“ื™ืงื” ื”ื›ืคื•ืœื” ื ืจืื™ืช ื—ื›ืžื” ืžื“ื™ ื‘ืฉื‘ื™ืœ ื ื™ืกื™ื•ืŸ ืจืืฉื•ืŸ. ืฉื™ืžื•ืฉ ื‘ git blame ืžื’ืœื” ืœื™ ืฉืฉื•ืจื” ื–ื• ื ื›ื ืกื” ืœืงื•ื“ ื‘ืงื•ืžื™ื˜ 0e04eb4d ืขื ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ ื”ืžื•ืคืœืื”:

ToCode
1 419
# ืงืจื™ืื” ืžื•ื“ืจื›ืช ื‘ืงื•ื“ ืฉืœ left-pad ื‘ืžืจืฅ 2016 ืžืชื›ื ืช ื‘ืฉื Azer Koรงulu (ืœื ื‘ื˜ื•ื— ืฉืื ื™ ื™ื•ื“ืข ืœืชืจื’ื ืืช ื”ืฉื ื”ื–ื” ืœืขื‘ืจื™ืช) ืฉื‘ืจ ืืช ื”ืื™ื ื˜ืจื ื˜. ื”ื•ื ืžื—ืง ืž npm ื›ืžื” ืžื•ื“ื•ืœื™ื ืฉืคื™ืจืกื ื‘ืคืจืฉื” ืฉื”ื‘ื™ืื” ื‘ืคืขื ื”ืจืืฉื•ื ื” ืืช ืžื ื”ืœื™ npm ืœื”ื—ื–ื™ืจ ืžื•ื“ื•ืœ ืฉืžืฉืชืžืฉ ืžื—ืง. ื”ืžื•ื“ื•ืœ ื‘ืžืจื›ื– ื”ืคืจืฉื” ื ืงืจื left-pad ื•ืžื” ืฉืžื™ื•ื—ื“ ื‘ื• ื”ื•ื ืฉืื™ื ืกืคื•ืจ ื—ื‘ื™ืœื•ืช npm ื”ืฉืชืžืฉื• ื‘ื• ื‘ืชื•ืจ ื“ืจื™ืฉืช ืงื“ื. ื‘ืจื’ืข ืฉืžื•ื“ื•ืœ ื–ื” ื™ืจื“, ืื™ ืืคืฉืจ ื”ื™ื” ื™ื•ืชืจ ืœื”ืชืงื™ืŸ ืืฃ ื—ื‘ื™ืœื” ืฉืชืœื•ื™ื” ื‘ื• ื•ื›ืš ืžืื•ืช ืืœืคื™ ืžืชื›ื ืชื™ื ื‘ืจื—ื‘ื™ ื”ืขื•ืœื ืœื ื”ืฆืœื™ื—ื• ืœื”ืคืขื™ืœ npm install. ื‘ืคื•ืกื˜ ื–ื” ืืจืฆื” ืœืฆืœื•ืœ ืืชื›ื ืœืงื•ื“ ืฉืœ left-pad, ืœื”ื‘ื™ืŸ ืžื” ื”ื™ื” ืžื™ื•ื—ื“ ื‘ื• ื•ืžื” ื”ืฉืชื ื” ื‘ื• ืœืื•ืจืš ื”ืฉื ื™ื. ## ื”ื’ื™ืจืกื” ืฉื”ื•ืกืจื” ืื ื—ื ื• ืขื•ื‘ื“ื™ื ืขื ื”ืจื™ืคื• https://github.com/left-pad/left-pad ื•ื›ืžื• ืฉืชืฉื™ืžื• ืœื‘ ืื ืชื™ื›ื ืกื• ืœืžืื’ืจ ื”ืžื•ื“ื•ืœ ื”ื•ื Deprecated ืžื” ืฉืื•ืžืจ ืฉืœื ืžื•ืžืœืฅ ืœื”ืฉืชืžืฉ ื‘ื• ื™ื•ืชืจ. ื”ื•ื ื”ื•ื—ืœืฃ ืขืœ ื™ื“ื™ ื”ืคื•ื ืงืฆื™ื” ื”ืžื•ื‘ื ื™ืช Stringโ€‹.prototypeโ€‹.padโ€‹Start ื›ื—ืœืง ืž ES 2017, ื›ืœื•ืžืจ ืงืฆืช ื™ื•ืชืจ ืžืฉื ื” ืื—ืจื™ ื”ืคืจืฉื”. ื˜ื™ื•ื˜ื•ืช ื”ื”ืฆืขื” ื”ืกืชื•ื‘ื‘ื• ื‘ืฉื˜ื— ืขื•ื“ ืž 2015 ื›ืš ืฉืœื ื ืจืื” ืฉื™ืฉ ืงืฉืจ ื‘ื™ืŸ ื”ื“ื‘ืจื™ื. ื“ืคื“ื•ืฃ ื‘ื”ื™ืกื˜ื•ืจื™ื™ืช ื”ื’ื™ื˜ ืžื‘ื™ื ืื•ืชื ื• ืœืงื•ืžื™ื˜ 76979f0a50877c50afd817923acf6f224bba3d36 ื‘ื• Azer ื”ื—ืœื™ื˜ ืœื”ื•ืจื™ื“ ืืช ื”ืžื•ื“ื•ืœ ืž npm, ื•ืœื›ืŸ ื–ื” ื™ื”ื™ื” ื”ืงื•ืžื™ื˜ ื‘ื• ืืจืฆื” ืœื”ืชื—ื™ืœ ืืช ื”ืงืจื™ืื” ืฉืœื™. ื‘ืื•ืชื• ืงื•ืžื™ื˜ ืงื•ื‘ืฅ ื” readme ืžืชืืจ ืืช ื“ืจืš ื”ื”ืชืงื ื” ื”ืžื•ืžืœืฆืช ืœืžื™ ืฉืจื•ืฆื” ืœื”ืฉืชืžืฉ ื‘ืžื•ื“ื•ืœ:
$ npm install azer/left-pad
ื”ื›ืชื™ื‘ npm install ื•ืื—ืจื™ื• ืฉืชื™ ืžื™ืœื™ื ืžื•ืคืจื“ื•ืช ื‘ืœื•ื›ืกืŸ ืžืืคืฉืจ ื”ืชืงื ื” ืฉืœ ืžื•ื“ื•ืœื™ื ื™ืฉื™ืจื•ืช ืžื’ื™ื˜ื”ืื‘ ื‘ืœื™ ืœืขื‘ื•ืจ ื“ืจืš ื”ืจื™ืคื• ื”ืžืจื›ื–ื™ npm ื•ื–ื” ืžืชื•ืขื“ ื›ืืŸ: https://docs.npmjs.com/cli/v8/commands/npm-install. ื”ืงื•ื‘ืฅ ื”ืžืขื ื™ื™ืŸ ื™ื•ืชืจ ื‘ืื•ืชื• ืงื•ืžื™ื˜ ื”ื•ื ื›ืžื•ื‘ืŸ index.js ืฉืžื›ื™ืœ ืืช ื”ืงื•ื“ ืœ left-pad, ื›ืœื•ืžืจ ื”ืคื•ื ืงืฆื™ื” ืฉืœื•ืงื—ืช ืžื—ืจื•ื–ืช ื•ืžื•ืกื™ืคื” ืจื•ื•ื—ื™ื ื‘ืชื—ื™ืœืชื” ืขื“ ืฉืžื’ื™ืขื™ื ืœืื•ืจืš ื”ืจืฆื•ื™. ื–ื” ื”ืžื™ืžื•ืฉ:
module.exports = leftpad;

function leftpad (str, len, ch) {
  str = String(str);

  var i = -1;

  if (!ch && ch !== 0) ch = ' ';

  len = len - str.length;

  while (++i < len) {
    str = ch + str;
  }

  return str;
}
ื”ืืžืช? ืฆื™ืคื™ืชื™ ืœื™ื•ืชืจ. ื”ืคื•ื ืงืฆื™ื” ืคืฉื•ื˜ ืžื—ืฉื‘ืช ืืช ืื•ืจืš ื”ืจื™ืคื•ื“ (ื”ืื•ืจืš ื”ืจืฆื•ื™ ืคื—ื•ืช ืื•ืจืš ื”ืžื—ืจื•ื–ืช), ื•ืื– ืจืฆื” ื‘ืœื•ืœืื” ื›ื“ื™ ืœื‘ื ื•ืช ืืช ื”ืจื™ืคื•ื“. ืื™ืฉื™ืช ืื ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืžืžืฉ ืžื ื’ื ื•ืŸ ื“ื•ืžื” ื”ื™ื™ืชื™ ื”ื•ืœืš ืขืœ join - ื›ืœื•ืžืจ ืžืฉื”ื• ื›ื–ื”:
var pad = new Array(len).join(ch);
ืื‘ืœ ื”ืืžืช ืฉื”ืžื™ืžื•ืฉ ืขื ืœื•ืœืืช ื” while ื™ื•ืชืจ ืžื”ื™ืจ ืื– ืื ื™ ืœื’ืžืจื™ ืžื‘ื™ืŸ ืืช ื”ื”ื’ื™ื•ืŸ. ื‘ื›ืœ ืžืงืจื” ืื ื™ืฉ ื“ื‘ืจ ืื—ื“ ืฉืœืžื“ืชื™ ืžื›ืœ ื”ืกื™ืคื•ืจ ืฉืœ left-pad ื–ื” ืฉื”ืจื‘ื” ื™ื•ืชืจ ื ื•ื— ืœื”ื“ื‘ื™ืง ื—ืชื™ื›ืช ืงื•ื“ ืฉืœื ืื ื—ื ื• ื›ืชื‘ื ื• ืžืืฉืจ ืœืžืžืฉ ืœื‘ื“ ื•ืœื”ืจื’ื™ืฉ ืจืข ืขื ื–ื” ืฉื”ืงื•ื“ ืœื ืžืกืคื™ืง ื™ืคื”. ## ืœืคื˜ ืคื“ ื”ื™ื•ื ื“ื‘ืจ ืื—ื“ ื˜ื•ื‘ ืฉื›ืŸ ื™ืฆื ืžืคืจืฉื™ื™ืช left-pad ื”ื™ื” ื”ืคื™ืจืกื•ื ืฉื”ืกืคืจื™ื” ื–ื›ืชื” ืœื”. ืื—ืจื™ ื”ื”ืกืจื” ื”ื™ื ืงื™ื‘ืœื” Maintainer ื—ื“ืฉ, ื‘ื“ื™ืงื•ืช ื˜ื•ื‘ื•ืช ื™ื•ืชืจ ื•ื”ื›ื™ ื—ืฉื•ื‘ ืžื™ืžื•ืฉ ื”ืจื‘ื” ื™ื•ืชืจ ื™ืขื™ืœ. ื›ืš ื ืจืื™ืช ื”ืคื•ื ืงืฆื™ื” ื”ื™ื•ื:
'use strict';
module.exports = leftPad;

var cache = [
  '',
  ' ',
  '  ',
  '   ',
  '    ',
  '     ',
  '      ',
  '       ',
  '        ',
  '         '
];

function leftPad (str, len, ch) {
  // convert `str` to a `string`
  str = str + '';
  // `len` is the `pad`'s length now
  len = len - str.length;
  // doesn't need to pad
  if (len <= 0) return str;
  // `ch` defaults to `' '`
  if (!ch && ch !== 0) ch = ' ';
  // convert `ch` to a `string` cuz it could be a number
  ch = ch + '';
  // cache common use cases
  if (ch === ' ' && len < 10) return cache[len] + str;
  // `pad` starts with an empty string
  var pad = '';
  // loop
  while (true) {
    // add `ch` to `pad` if `len` is odd
    if (len & 1) pad += ch;
    // divide `len` by 2, ditch the remainder
    len >>= 1;
    // "double" the `ch` so this operation count grows logarithmically on `len`
    // each time `ch` is "doubled", the `len` would need to be "doubled" too
    // similar to finding a value in binary search tree, hence O(log(n))
    if (len) ch += ch;
    // `len` is 0, exit the loop
    else break;
  }
  // pad `str`!
  return pad + str;
}
ื•ื‘ื ื•ืกืฃ ืงื™ื‘ืœื ื• ื‘ืชื™ืงื™ื” ื’ื ืงื•ื‘ืฅ index.d.ts ืขื ื”ื’ื“ืจืช ื”ื˜ื™ืคื•ืกื™ื ืœ TypeScript:

ToCode
1 419
# ื”ื™ื•ื ืœืžื“ืชื™: ื‘ื—ื™ืจืช ื˜ื™ืคื•ืก ืžืžืขืจืš ื‘ TypeScript ื”ื ื” ื˜ืจื™ืง TypeScript ืžื“ืœื™ืง ืฉื™ืขื–ื•ืจ ืœื›ื ืœื”ื•ืกื™ืฃ ื‘ื“ื™ืงืช ื˜ื™ืคื•ืกื™ื ื›ืฉื™ืฉ ืœื›ื ื‘ื™ื“ ืžืขืจืš ืงื‘ื•ืข ื•ืคื•ื ืงืฆื™ื” ืฉืฆืจื™ื›ื” ืœืงื‘ืœ ืขืจืš ืžืชื•ืš ืื•ืชื• ืžืขืจืš. ื‘ื“ื•ื’ืžื” (ืžืชื•ืš ื”ืคื•ืกื˜ ืฉืœื™ืžื“ ืื•ืชื™ ืืช ื–ื”) ื”ื™ื” ืœื ื•:
const animals = [
    { id: 1, name: 'cat' },
    { id: 2, name: 'dog' },
    { id: 3, name: 'mouse' },
];

type AnimalName = 'cat' | 'dog' | 'mouse'

function getAnimal(name: AnimalName) {
  return animals.find(a => a.name === name)
}
ืขื›ืฉื™ื• ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืคืขื™ืœ:
console.log(getAnimal('dog'));
ื•ืœืงื‘ืœ ืืช ื”ืชื•ืฆืื” ื‘ืœื™ ื‘ืขื™ื”, ืื‘ืœ ืื ื ื ืกื” ืœื”ืคืขื™ืœ:
console.log(getAnimal('bird'));
ื ืงื‘ืœ ื›ืฉืœื•ืŸ ื‘ื–ืžืŸ ื”ื‘ื ื™ื” ื›ื™ ืื™ืŸ ื—ื™ื” ื›ื–ืืช ื‘ืžืขืจืš. ืขื›ืฉื™ื• ื–ื” ืžืขื•ืœื” ืื‘ืœ ื”ืฉื•ืจื” ื”ื–ืืช:
type AnimalName = 'cat' | 'dog' | 'mouse'
ืžืจื’ื™ืฉื” ืžื™ื•ืชืจืช - ื”ืจื™ ื›ื‘ืจ ื™ืฉ ืœื™ ืืช ื”ืžืขืจืš, ืœืžื” ืื ื™ ืฆืจื™ืš ืœื—ื–ื•ืจ ืขืœ ื”ืฉืžื•ืช ืฉืœ ื›ืœ ื”ื—ื™ื•ืช ืจืง ื‘ืฉื‘ื™ืœ ืœื”ื’ื“ื™ืจ ื˜ื™ืคื•ืก? ืžืกืชื‘ืจ ืฉื’ื ื‘ืžื™ื™ืงืจื•ืกื•ืคื˜ ื”ื‘ื™ื ื• ืฉื”ื™ื ืžื™ื•ืชืจืช ื•ืœ TypeScript ื™ืฉ ืชื—ื‘ื™ืจ ืžืžืฉ ืคืฉื•ื˜ ืฉืžืืคืฉืจ ืœื•ื•ืชืจ ืขืœื™ื”. ื”ืงื•ื“ ื”ื‘ื ืฉืงื•ืœ ืœื’ืžืจื™ ืœื’ื™ืจืกื” ื”ืจืืฉื•ื ื” ื•ืœื ื›ื•ืœืœ ืืช ื”ื›ืคื™ืœื•ืช:
const animals = [
    { id: 1, name: 'cat' },
    { id: 2, name: 'dog' },
    { id: 3, name: 'mouse' },
] as const;

type AnimalName = typeof animals[number]['name'];

function getAnimal(name: AnimalName) {
  return animals.find(a => a.name === name)
}

console.log(getAnimal('dog'));
ืจืง ืืœ ืชืฉื›ื—ื• ืœื”ื•ืกื™ืฃ ืื—ืจื™ ื”ื’ื“ืจืช ื”ืžืขืจืš ืืช ื”ืžื™ืœื™ื as const ืื—ืจืช TypeScript ื™ื’ื“ื™ืจ ืืช AnimalName ืœื”ื™ื•ืช ืคืฉื•ื˜ string ื•ืœื ื™ื–ืจื•ืง ืฉื•ื ืฉื’ื™ืื”.

ToCode
1 419
# ืœืžื” ืฆืจื™ืš ืœื”ื•ืกื™ืฃ @latest ื‘ื”ืคืขืœืช npx? ืื ืืชื ืžืฉืชืžืฉื™ื ื‘ npx ืžืกืคื™ืง ื–ืžืŸ ืชื•ื›ืœื• ืœืฉื™ื ืœื‘ ืฉื”ื•ื ืœื ืชืžื™ื“ ื‘ื•ื—ืจ ืืช ื”ื’ื™ืจืกื” ื”ื—ื“ืฉื” ื‘ื™ื•ืชืจ ืฉืœ ื”ื›ืœื™ื ืœื”ืจืฆื”. ืืฆืœื™ ืขืœ ื”ืžื›ื•ื ื” npx ื”ืชื—ื™ืœ ืœืื—ืจื•ื ื” ืœืงื˜ืจ ืขืœ create-react-app:
$ npx create-react-app yoyo
Need to install the following packages:
  create-react-app
Ok to proceed? (y)

You are running `create-react-app` 4.0.3, which is behind the latest release (5.0.0).

We no longer support global installation of Create React App.

Please remove any global installs with one of the following commands:
- npm uninstall -g create-react-app
- yarn global remove create-react-app

The latest instructions for creating a new app can be found here:
https://create-react-app.dev/docs/getting-started/
ืžื™ื•ืชืจ ืœืฆื™ื™ืŸ ืฉืื™ืŸ ืœื™ ืฉื•ื ื”ืชืงื ื” ื’ืœื•ื‘ืืœื™ืช ืฉืœ create-react-app ื•ืœื›ืŸ ืฉืชื™ ื”ื”ืฆืขื•ืช ืฉืœื• ืœื”ืกืจืช create-react-app ืœื ื”ื™ื• ืจืœื•ื•ื ื˜ื™ื•ืช. ืžื” ืงืจื” ื›ืืŸ? ื–ื” ืคืฉื•ื˜ - ื’ื ืœ npx ื™ืฉ cache. ื”ื•ื ืฉื•ืžืจ ืื•ืชื• ื‘ืชื™ืงื™ื™ืช ~/.npm/_npx. ื›ืฉื”ื•ื ืฉื•ืืœ ืื•ืชื™ ืื ืœื”ืชืงื™ืŸ ืืช create-react-app ื•ืื ื™ ืžืืฉืจ ื”ื•ื ืฉื ืœื‘ ืฉืœื ื‘ื™ืงืฉืชื™ ื’ื™ืจืกื” ืžืกื•ื™ืžืช, ืื– ื”ื•ืœืš ืœ cache, ืžื•ืฆื ืฉื ืืช ื’ื™ืจืกื” 4 ื•ืžืชืงื™ืŸ ืื•ืชื”. ื“ืจืš ืงืœื” ืœืฆืืช ืžื–ื” ื”ื™ื ืœืฆื™ื™ืŸ ืืช ื”ื’ื™ืจืกื”, ื•ื–ื• ื”ืžืฉืžืขื•ืช ืฉืœ ื›ืจื•ื›ื™ืช latest - ื›ืœื•ืžืจ ื”ืคืขืœื” ื›ื–ื•:
$ npx create-react-app@latest yoyo
ื“ืจืš ืฉื ื™ื” ืฉื ื•ืชื ืช ืคื™ืชืจื•ืŸ ื™ื•ืชืจ ื™ืฆื™ื‘ ื”ื™ื ืคืฉื•ื˜ ืœืจื•ืงืŸ ืืช ื” cach ืฉืœ npx. ื ื›ื•ืŸ ื–ื” ืื•ืžืจ ืฉื”ืžื—ืฉื‘ ืฉืœื›ื ื™ืฆื˜ืจืš ืœืขื‘ื•ื“ ืงืฆืช ื™ื•ืชืจ ืงืฉื” ื‘ืคืขื ื”ื‘ืื” ืฉืชืคืขื™ืœื• ื›ืœื™ื ืฉื”ื™ื• ืฉืžื•ืจื™ื ืฉื ืงื•ื“ื, ืื‘ืœ ืื—ืจื™ ื–ื” ืฉื•ื‘ ื™ื”ื™ื• ืœื›ื ืืช ื”ื’ื™ืจืกืื•ืช ื”ื—ื“ืฉื•ืช ื‘ื™ื•ืชืจ:
$ rm -rf ~/.npm/_npx
$ npx create-react-app yoyo

ToCode
1 419
# ืงืœ ืœืฉื ื•ืช ื”ื ื” ืจืฉื™ืžื” ื—ืœืงื™ืช ืฉืœ ื“ื‘ืจื™ื ืฉืื ื—ื ื• ื‘ื•ื ื™ื ืžืกื•ื“ืจื™ื ืœืคื™ ื›ืžื” ืงืœ ืœืฉื ื•ืช ืื•ืชื: 1. ืžื™ืžื•ืฉ ืฉืœ ืคื•ื ืงืฆื™ื” 2. ื—ืชื™ืžื” ืฉืœ ืคื•ื ืงืฆื™ื” 3. ืจืฉื™ืžืช ืคื•ื ืงืฆื™ื•ืช ืื• ืžื—ืœืงื•ืช ืฉืžื™ื•ืฆืื•ืช ืžืžื•ื“ื•ืœ 4. ืจืฉื™ืžืช ื˜ื‘ืœืื•ืช ื‘ DB ื•ืขืžื•ื“ื•ืช ืฉืœ ื›ืœ ื˜ื‘ืœื” 5. ืจืฉื™ืžืช API Routes ื•ื”ื—ืœื˜ื” ืขืœ ื”ืคืจืžื˜ืจื™ื ืฉืœ ื›ืœ ื ืชื™ื‘ 6. ืคืจื•ื˜ื•ืงื•ืœื™ื ืœืชืงืฉื•ืจืช ื‘ื™ืŸ ืžืขืจื›ื•ืช (API ืฆื™ื‘ื•ืจื™) ืงื•ื“ ืžืฉืชื ื” ื›ืœ ื”ื–ืžืŸ, ืขื“ื›ื•ื ื™ื ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืื™ื˜ื™ื™ื ื•ืžืกื•ื›ื ื™ื, ืขื“ื›ื•ืŸ ืฉืœ API Routes ืขืœื•ืœ ืœื”ืฉืคื™ืข ืขืœ ืžืขืจื›ื•ืช ื—ื™ืฆื•ื ื™ื•ืช ื•ืœื›ืŸ ื“ื•ืจืฉ ืกื™ื ื›ืจื•ืŸ ืฉื™ื ื•ื™ื™ื ื‘ื™ืŸ ืžืกืคืจ ืฆื•ื•ืชื™ื, ืฉื™ื ื•ื™ Public API ืื•ืžืจ ืฉื”ืจื‘ื” ืœืงื•ื—ื•ืช ืฉืœื›ื ื™ืฆื˜ืจื›ื• ืœืขื“ื›ืŸ ืืช ื”ืงื•ื“ ืฉืœื”ื ื•ื–ื” ืกื™ื ื›ืจื•ืŸ ืืคื™ืœื• ื™ื•ืชืจ ืžื•ืจื›ื‘ ืžืฉื™ื ื•ื™ ืคื ื™ืžื™ ื‘ืืจื’ื•ืŸ. ื‘ื‘ื ื™ื™ืช ืžื•ืฆืจ ื—ื“ืฉ ืฉื•ื•ื” ืœืฉื™ื ืœื‘ ื•ืœืžืงื“ ืืช ื”ื”ืฉืงืขื” ื‘ืžืงื•ื ื”ื ื›ื•ืŸ - ื‘ื—ื™ืจืช API ืฆื™ื‘ื•ืจื™ ื‘ืขื™ื™ืชื™ ืขืœื•ืœื” ืœืกื‘ืš ืœื›ื ืืช ื”ืงื•ื“ ืฉืœ ื›ืœ ื”ืžืขืจื›ืช ื‘ืฆื•ืจื” ืฉื™ื”ื™ื” ืžืื•ื“ ืงืฉื” ืœืชืงืŸ ื‘ื”ืžืฉืš.

ToCode
1 419
        console.log(`File uploaded successfully. ${data.Location}`);
    });
};

uploadFile(filename);
ื”ืกืงืจื™ืคื˜ ื ื•ืขื“ ืœื”ืจืฆื” ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื‘ืฆื™ืจื•ืฃ ืฉื ืงื•ื‘ืฅ ื•ื”ื•ื ืžืขืœื” ืืช ื”ืงื•ื‘ืฅ ืœื“ืœื™ ืฉื™ืฆืจื ื•. ื”ืจืฆื” ืœื“ื•ื’ืžื” - ื‘ื”ื ื—ื” ืฉื™ืฉ ืœื›ื ืงื•ื‘ืฅ ื‘ืฉื cat.jpg ื‘ืชื™ืงื™ื” ืชื™ืจืื” ื›ืš:
$ node utils/uploads.js cat.jpg
## ืื™ืš ืžืงื‘ืœื™ื ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืงื‘ืฆื™ื ื‘ Bucket ื•ื”ื—ืœืง ื”ืื—ืจื•ืŸ ื‘ืžืขืจื›ืช ื”ื•ื ืคื ื™ื” ืœ S3 ื›ื“ื™ ืœืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืงื‘ืฆื™ื ื‘ื“ืœื™. ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ื‘ืฉื src/lib/images.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
const s3 = require('./mys3');
const { BUCKET_NAME } = require('./globals');

var params = {
  Bucket: BUCKET_NAME,
};


export async function listImages() {
  console.log('listing images');
  const data = await s3.listObjectsV2(params).promise();
  const images = data.Contents.map(item => `https://${BUCKET_NAME}.s3-eu-west-1.amazonaws.com/${item.Key}`);
  return images;
}
ื”ืคื•ื ืงืฆื™ื” listImages ืคื•ื ื” ืœ s3, ืžืขื‘ื™ืจื” ืืช ืฉื ื”ื“ืœื™ ื•ืžืงื‘ืœืช ืืช ืจืฉื™ืžืช ื›ืœ ื”ืงื‘ืฆื™ื ื‘ื“ืœื™. ื”ืจืฉื™ืžื” ืžื’ื™ืขื” ื‘ืคื•ืจืžื˜ ื›ื–ื”:
{
  IsTruncated: false,
  Contents: [
    {
      Key: 'cat.jpg',
      LastModified: 2022-01-19T13:38:18.000Z,
      ETag: '"df71c370626f34e60ae6c1df9b64eb09"',
      Size: 138421,
      StorageClass: 'STANDARD'
    }
  ],
  Name: 'ynonp-s3-photos',
  Prefix: '',
  MaxKeys: 1000,
  CommonPrefixes: [],
  KeyCount: 1
}
ืื ื™ ืžืฉืชืžืฉ ื‘ key ืฉืœ ื›ืœ ืงื•ื‘ืฅ ื•ืžืฆืจืฃ ืืœื™ื• ืืช ืฉื ื”ื“ืœื™ ื›ื“ื™ ืœืงื‘ืœ URL ืœืชืžื•ื ื”. ืฆืจื™ืš ืœื”ื’ื™ื“ - ื”ืกื™ืคื•ืจ ื”ื–ื” ืขื•ื‘ื“ ื›ืœ ื›ืš ืคืฉื•ื˜ ืจืง ื‘ื’ืœืœ ืฉื›ืœ ื”ืชืžื•ื ื•ืช ืฉืœื™ ื”ืŸ ืฆื™ื‘ื•ืจื™ื•ืช. ืื ื”ืชืžื•ื ื•ืช ื”ื™ื• ืคืจื˜ื™ื•ืช ื”ื™ื™ืชื™ ืฆืจื™ืš ืœืคื ื•ืช ืœืคื•ื ืงืฆื™ื” ื ื•ืกืคืช ื›ื“ื™ ืœืงื‘ืœ Presigned URL ืœื›ืœ ืชืžื•ื ื”. ื”ืืคืœื™ืงืฆื™ื” ืฉื›ืชื‘ืชื™ ื”ื™ื ื‘ Next.JS ื•ืœื›ืŸ ืื ื™ ื™ื›ื•ืœ ืœืขืจื‘ื‘ ืงื•ื“ ืฆื“ ืฉืจืช ื•ืงื•ื“ ืฆื“ ืœืงื•ื— ื‘ืื•ืชื• ืงื•ื‘ืฅ. ื‘ืžืงืจื” ืฉืœื™ ื”ืงื•ื‘ืฅ ื ืงืจื src/pages/index.js ื•ื–ื” ื”ืชื•ื›ืŸ ืฉืœื•:
import Head from 'next/head'
import styles from '../../styles/Home.module.css'
import { listImages } from '../lib/images';


export default function Home(props) {
  const { images } = props;
  return (
    <div className={styles.container}>
      <Head>
        <title>Create Next App</title>
        <meta name="description" content="Generated by create next app" />
        <link rel="icon" href="/favicon.ico" />
      </Head>

      <main className={styles.main}>
        <p>Hello World</p>
        {images.map((imgSource) => (
          <img src={imgSource} />
        ))}
      </main>
    </div>
  )
}

export async function getServerSideProps() {
  const images = await listImages();
  return {
    props: { images },
  };
}
## ืื™ืš ืžืคืขื™ืœื™ื ืืฆืœื›ื ื‘ืฉื‘ื™ืœ ืœื”ืคืขื™ืœ ืืช ื”ืžืขืจื›ืช ืืฆืœื›ื ืชืฆื˜ืจื›ื• ืœืขื‘ื•ืจ ืžืกืคืจ ืฉืœื‘ื™ื: 1. ืฉื›ืคืœื• ืืช ื”ืžืื’ืจ ื”ืžืœื ืฉืœื™ ืžื›ืืŸ: https://github.com/ynonp/s3-photos-demo 2. ืฆืจื• ืžืฉืชืžืฉ ื‘ S3 ื•ืงื‘ืœื• ืืช ืคืจื˜ื™ ื”ื’ื™ืฉื” 3. ืฆืจื• ืžืฉืชื ื™ ืกื‘ื™ื‘ื” ื‘ืฉื AWS_ID ื• AWS_SECRET ืขื ืคืจื˜ื™ ื”ื’ื™ืฉื” ืฉืœื›ื. 4. ื‘ื—ืจื• ืฉื ืœ Bucket ื•ืจืฉืžื• ืื•ืชื• ื‘ืงื•ื‘ืฅ src/lib/globals.js ื‘ืžืงื•ื ื”ืฉื ืฉืื ื™ ื‘ื—ืจืชื™. 5. ื”ืคืขื™ืœื• ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ืืช ื”ืคืงื•ื“ื” ืฉื™ื•ืฆืจืช ืืช ื” Bucket ื•ื•ื“ืื• ืฉื”ื›ืœ ืขื•ื‘ื“. 6. ื”ืคืขื™ืœื• ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื›ืžื” ืคืขืžื™ื ืืช ื”ืกืงืจื™ืคื˜ upload ืขื ื›ืžื” ืชืžื•ื ื•ืช ื›ื“ื™ ืœื”ืขืœื•ืช ืื•ืชืŸ ืœ Bucket 7. ื”ืคืขื™ืœื• ืืช ื”ืžืขืจื›ืช ืขื npm run dev ื•ื›ื ืกื• ืœืžืกืš ื”ืจืืฉื™ ื‘ localhost:3000. ืื ื”ื›ืœ ื”ืœืš ื›ืžื• ืฉืฆืจื™ืš ืชื•ื›ืœื• ืœืจืื•ืช ืขืœ ื”ืžืกืš ืืช ื›ืœ ื”ืชืžื•ื ื•ืช ืฉื”ืขืœื™ืชื.

ToCode
1 419
# ืžื“ืจื™ืš: ืื™ืš ืœื”ืขืœื•ืช ืงื‘ืฆื™ื ืœ AWS S3 ืžืชื•ืš ื™ื™ืฉื•ื Node.JS ื‘ืงื•ืจืก Node.JS ืคื” ื‘ืืชืจ ืื ื™ ืžืœืžื“ ืื™ืš ืœืฉืžื•ืจ ืงื‘ืฆื™ื ื‘ืชื™ืงื™ื” ืžืงื•ืžื™ืช ืขืœ ื”ืฉืจืช ืื• ื‘ื‘ืกื™ืก ื ืชื•ื ื™ื ืฉืœ Mongo. ื‘ืขืงื‘ื•ืช ืฉืืœื” ืฉืœ ืชืœืžื™ื“ ื—ืฉื‘ืชื™ ืœื”ื•ืกื™ืฃ ื›ืืŸ ืžื“ืจื™ืš ืื™ืš ืœื”ืขืœื•ืช ืืช ื”ืงื‘ืฆื™ื ื’ื ืœ AWS S3 ืœืžื™ ืฉืžืขื“ื™ืฃ. ## ืžื” ืื ื—ื ื• ื‘ื•ื ื™ื ื‘ื“ื•ื’ืžื” ื‘ืžื“ืจื™ืš ื–ื” ืื ื™ ืื‘ื ื” ืžืขืจื›ืช ื•ื•ื‘ื™ืช ืคืฉื•ื˜ื” ืœื”ืฆื’ืช ืชืžื•ื ื•ืช. ื”ืžืขืจื›ืช ืžื•ืจื›ื‘ืช ืž: 1. ืกืงืจื™ืคื˜ ื‘ืฉื upload ืฉืžืขืœื” ืงื•ื‘ืฅ ืœื“ืœื™ ื‘ S3. 2. ืืชืจ ืจื™ืืงื˜ ืฉืžืฆื™ื’ ืืช ื›ืœ ื”ืชืžื•ื ื•ืช ืฉืฉืžื•ืจื•ืช ื‘ื“ืœื™. ## ืงื˜ื ื” ืขืœ ื”ืจืฉืื•ืช ืžื ื’ื ื•ืŸ ื”ื”ืจืฉืื•ืช ืฉืœ AWS ื”ื•ื ืžืื•ื“ ืžื•ืจื›ื‘ ื•ื”ื•ื ื›ื ืจืื” ื”ืกื™ื‘ื” ื”ืžืจื›ื–ื™ืช ื‘ื’ืœืœื” ืื ืฉื™ื ืžืกืชื‘ื›ื™ื ืขื AWS. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ืื ื™ ื™ื•ืฆืจ Bucket ืฉืžื—ื–ื™ืง ืชืžื•ื ื•ืช. ื›ืœ ื”ืชืžื•ื ื•ืช ืฆื™ื‘ื•ืจื™ื•ืช ื•ื›ืœ ืื—ื“ ื™ื›ื•ืœ ืœืจืื•ืช ืืช ื›ืœ ื”ืชืžื•ื ื•ืช ืฉืœ ื›ื•ืœื. ื–ื” ื”ื•ืคืš ืืช ื”ื—ื™ื™ื ืœื”ืจื‘ื” ื™ื•ืชืจ ืคืฉื•ื˜ื™ื ืžื‘ื—ื™ื ืช ื”ืงื™ื“ื•ื“ ืื‘ืœ ื›ืžื•ื‘ืŸ ืฉื’ื™ืฉื” ื–ื• ืœื ืžืชืื™ืžื” ืœื›ืœ ืžืขืจื›ืช. ืื ืจื•ืฆื™ื ืœื™ื™ืฆืจ ืงื‘ืฆื™ื ืฉื™ื”ื™ื” ื ื’ื™ืฉื™ื ืจืง ืœืื ืฉื™ื ืžืกื•ื™ืžื™ื ื•ืœื ื ื’ื™ืฉื™ื ืœืื—ืจื™ื ืฆืจื™ืš ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืงื‘ืฆื™ื ืคืจื˜ื™ื™ื ื•ื›ืœ ืคืขื ืฉืžืฉืชืžืฉ ืจื•ืฆื” ืœื’ืฉืช ืœืื—ื“ ืžื”ื ืœื™ื™ืฆืจ ืขื‘ื•ืจื• ืœื™ื ืง ืžื™ื•ื—ื“ ื•ืกืคืฆื™ืคื™ ืœืชืžื•ื ื”. ืืžื–ื•ืŸ ืชื•ืžื›ื™ื ื‘ื–ื” ืขื ื“ื‘ืจ ืฉื ืงืจื Presigned URL ืื‘ืœ ื”ื•ื ืžื—ื•ืฅ ืœืกืงื•ืค ืฉืœ ืžื“ืจื™ืš ื–ื”. ## ืื™ืš ื™ื•ืฆืจื™ื Bucket ืื ื™ ืžื ื™ื— ืฉื™ืฉ ืœื›ื ื—ืฉื‘ื•ืŸ AWS ื•ืฉื™ืฆืจืชื ืืกื™ืžื•ืŸ ื’ื™ืฉื”, ื•ืฉื™ืฉ ืœื›ื ื‘ื™ื“ ืืช ื” id ื•ื” secret ืฉืœ ืืกื™ืžื•ืŸ ื”ื’ื™ืฉื”. ืœืคืจื˜ื™ื ืื™ืš ืœื™ืฆื•ืจ ืืกื™ืžื•ืŸ ื’ื™ืฉื” ื•ืœืงื‘ืœ ืืช ืคืจื˜ื™ ื”ื’ื™ืฉื” ืืคืฉืจ ืœื”ืกืชื›ืœ ื‘ืžื“ืจื™ืš ื”ื–ื”: https://docs.aws.amazon.com/powershell/latest/userguide/pstools-appendix-sign-up.html ื‘ืขื‘ื•ื“ื” ืขื Node.JS ื™ืฉ ืœื ื• ื—ื‘ื™ืœื” ื ื—ืžื“ื” ื‘ืฉื aws-sdk ืฉืขื•ื–ืจืช ืœ Node ืœื”ืชื—ื‘ืจ ืœ AWS. ืื ื™ ืžืชืงื™ืŸ ืืช ื”ื—ื‘ื™ืœื” ืขื:
$ npm install --save aws-sdk
ื•ื™ื•ืฆืจ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืคืจื•ื™ืงื˜ - ืืฆืœื™ ื”ื•ื ื ืงืจื src/lib/mys3.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
const AWS = require('aws-sdk');

// Enter copied or downloaded access ID and secret key here
const ID = process.env.AWS_ID;
const SECRET = process.env.AWS_SECRET;

const s3 = new AWS.S3({
    accessKeyId: ID,
    secretAccessKey: SECRET
});

module.exports = s3;
ื‘ืฉื‘ื™ืœ ืœื ืœืฉืžื•ืจ ื‘ืงื•ื“ ืืช ืžืคืชื—ื•ืช ื”ื’ื™ืฉื” ืฉืžืจืชื™ ืื•ืชื ื‘ืชื•ืจ ืžืฉืชื ื™ ืกื‘ื™ื‘ื”. ื”ืงื•ื“ ืขืฆืžื• ืคืฉื•ื˜ ื™ื•ืฆืจ ืื•ื‘ื™ืงื˜ AWS.S3 ื—ื“ืฉ ื•ืžื™ื™ืฆื ืื•ืชื•, ื›ื“ื™ ืฉืœืงื‘ืฆื™ื ืื—ืจื™ื ื™ื”ื™ื” ื™ื•ืชืจ ื ื•ื— ืœืขื‘ื•ื“ ืขื s3. ื‘ืื•ืชื” ืชื™ืงื™ื” ืื ื™ ื™ื•ืฆืจ ืขื•ื“ ืงื•ื‘ืฅ ื‘ืฉื src/lib/globals.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
// The name of the bucket that you have created
exports.BUCKET_NAME = 'ynonp-s3-photos';
ืฉืžื’ื“ื™ืจ ืืช ืฉื ื”ื“ืœื™ ื‘ื• ืื ื™ ืืฉืžื•ืจ ืืช ื”ืชืžื•ื ื•ืช. ืขื›ืฉื™ื• ืื ื—ื ื• ืžื•ื›ื ื™ื ืœื›ืชื•ื‘ ืืช ื”ืกืงืจื™ืคื˜ ื”ืจืืฉื•ืŸ ืฉื™ื•ืฆืจ ืืช ื”ื“ืœื™. ืื ื™ ื™ื•ืฆืจ ืชื™ืงื™ื” ื‘ืฉื utils ื•ื‘ืชื•ื›ื” ื”ืงื•ื‘ืฅ utils/create-bucket.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
const AWS = require('aws-sdk');
const { BUCKET_NAME } = require('../src/lib/globals');
const s3 = require('../src/lib/mys3');

const params = {
    Bucket: BUCKET_NAME,
    CreateBucketConfiguration: {
        // Set your region here
        LocationConstraint: "eu-west-1"
    }
};

s3.createBucket(params, function(err, data) {
    if (err) console.log(err, err.stack);
    else console.log('Bucket Created Successfully', data.Location);
});
ืืช ื”ืงื•ื‘ืฅ ืืคืฉืจ ืœื”ืจื™ืฅ ืžืฉื•ืจืช ื”ืคืงื•ื“ื”:
$ node utils/create-bucket.js
ื•ืžืกืคื™ืง ืœื”ืจื™ืฅ ืื•ืชื• ืคืขื ืื—ืช ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ื“ืœื™. ืฉื™ืžื• ืœื‘ ืจืง ืœื‘ื—ื•ืจ ืฉื ื™ื™ื—ื•ื“ื™ ืœื“ืœื™ (ื‘ืืžืฆืขื•ืช ืฉื™ื ื•ื™ ื‘ืงื•ื‘ืฅ globals.js) ืœืคื ื™ ืฉืžื ืกื™ื ืœื™ืฆื•ืจ. ื‘ื›ืœ ืžืงืจื” ืื ื”ืฉื ืฉืœื›ื ืœื ืžืกืคื™ืง ืžื™ื•ื—ื“ ืื– s3 ื™ืฆืขืง ืขืœื™ื›ื ื•ืœื ื™ื™ืฆื•ืจ ืืช ื”ื“ืœื™. ## ืื™ืš ืžืขืœื™ื ืงื•ื‘ืฅ ืื—ืจื™ ืฉื™ืฉ ืœื ื• ื“ืœื™ ื ื•ื›ืœ ืœื”ืžืฉื™ืš ืœืกืงืจื™ืคื˜ ื”ืฉื ื™, ื’ื ื”ื•ื ื ื•ืขื“ ืœื”ืจืฆื” ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ื•ืœืคื ื™ ื”ืฉื™ืžื•ืฉ ื‘ืฉืจืช. ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ื‘ืฉื utils/upload.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
const fs = require('fs');
const { BUCKET_NAME } = require('../src/lib/globals');
const s3 = require('../src/lib/mys3');

const filename = process.argv[2];
console.log(filename);

const uploadFile = (fileName) => {
    // Read content from the file
    const fileContent = fs.readFileSync(fileName);

    // Setting up S3 upload parameters
    const params = {
      Bucket: BUCKET_NAME,
      Key: 'cat.jpg', // File name you want to save as in S3
      Body: fileContent,
      ACL:'public-read'
    };

    // Uploading files to the bucket
    s3.upload(params, function(err, data) {
        if (err) {
            throw err;
        }

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

ToCode
1 419
# ื‘ื“ื™ืงื•ืช ืžื—ื•ืฅ ืœืงื•ืคืกื” ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช ืœืงื•ื“ ืžืชื—ื‘ืจื•ืช ืœืจื•ื‘ ืขื ื•ื™ื“ื•ื ื ื›ื•ื ื•ืช ืฉืœ ื”ืงื•ื“ ื•ืชื—ื•ืฉืช ื‘ื™ื˜ื—ื•ืŸ ืœืžืคืชื—ื™ื ื•ืœืžื ื”ืœื™ื ืฉื”ืžืขืจื›ืช ืขื•ืฉื” ืžื” ืฉื”ื™ื ืฆืจื™ื›ื” ืœืขืฉื•ืช. ื–ื” ื ื›ื•ืŸ ืœืคืขืžื™ื, ืื‘ืœ ื”ืจื‘ื” ืคืขืžื™ื ืื ื—ื ื• ื›ื•ืชื‘ื™ื ื‘ื“ื™ืงื•ืช ืžืกื™ื‘ื•ืช ื ื•ืกืคื•ืช ื•ืœื ืคื—ื•ืช ื—ืฉื•ื‘ื•ืช: 1. ื‘ื“ื™ืงื•ืช ื›ืชื™ืขื•ื“ - ื‘ื“ื™ืงื” ื™ื›ื•ืœื” ืœื”ืจืื•ืช ืœืžืชื›ื ืชื™ื ืื—ืจื™ื ืื™ืš ืืžื•ืจื™ื ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” ืฉืœื™, ืœืคืขืžื™ื ื™ื•ืชืจ ื˜ื•ื‘ ืžืชื™ืขื•ื“ ื˜ืงืกื˜ื•ืืœื™. ื™ืฉ ื’ื ื›ืœื™ื ืื•ื˜ื•ืžื˜ื™ื™ื ื›ืžื• doctest ื‘ืขื•ืœื ืฉืœ ืคื™ื™ืชื•ืŸ ืฉื™ื‘ื ื• ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ืช ืขืœ ืกืžืš ืชื™ืขื•ื“ (ื‘ืคื•ืจืžื˜ ืžื™ื•ื—ื“) ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื. 2. ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœื—ืงื•ืจ ืงื•ื“ ื—ื™ืฆื•ื ื™ - ืงื•ื“ ื‘ื“ื™ืงื” ื™ื›ื•ืœ ืœืขื–ื•ืจ ืœื™ ืœื”ืจื™ืฅ ื‘ืงืœื•ืช ื›ืžื” ืคื•ื ืงืฆื™ื•ืช ืžืงื•ื“ ื—ื™ืฆื•ื ื™ - ืœื“ื•ื’ืžื” ืื ืื ื™ ืจื•ืฆื” ืœืœืžื•ื“ ืื™ืš ืกืคืจื™ื” ืžืกื•ื™ืžืช ืขื•ื‘ื“ืช - ื‘ืžื™ื•ื—ื“ ื‘ืกื‘ื™ื‘ื•ืช ื‘ื”ืŸ ืงืฉื” ืœื™ ืœืงื‘ืœ REPL ืœืชื•ืš ืžืขืจื›ืช ืขื•ื‘ื“ืช. ื ื›ื•ืŸ, ืืคืฉืจ ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืงื˜ืŸ ืฉื™ืขืฉื” ืืช ื”ืžื—ืงืจ, ืื‘ืœ ืœื‘ื“ื™ืงื” ื™ืฉ ื™ื™ืชืจื•ืŸ ืฉื”ื™ื ืชื™ืฉืืจ ืื™ืชื™ ื’ื ื‘ืขืชื™ื“ ื•ืชืืคืฉืจ ืœื”ืžืฉื™ืš ืœื—ืงื•ืจ ื›ืฉื™ื”ื™ื• ืœื™ ืฉืืœื•ืช ื—ื“ืฉื•ืช. 3. ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœื—ืฉื•ื‘ ืขืœ ืžืžืฉืง - ืื ืฉื™ TDD ืžืื•ื“ ืื•ื”ื‘ื™ื ืืช ื–ื”. ื”ืจืขื™ื•ืŸ ืฉื›ืฉืืชื” ืžืชื—ื™ืœ ืœื‘ื ื•ืช ืžืžืฉืง ืœืžื—ืœืงื” ืื• ืžื•ื“ื•ืœ ืžืกื•ื™ื ื–ื” ืขื•ื–ืจ ืœื ืกื•ืช ืœื›ืชื•ื‘ ืงื•ื“ ืฉืžืฉืชืžืฉ ื‘ืžืžืฉืง ื”ื–ื” ื›ื“ื™ ืœื”ื‘ื™ืŸ ืขื“ ื›ืžื” ื”ื•ื ื ื•ื—. ืชื•ื›ื ื™ืช ื‘ื“ื™ืงื” ื”ื™ื ืžืงื•ื ืžืฆื•ื™ืŸ ืœืขืฉื•ืช ืžืฉื—ืงื™ื ื›ืืœื”. 4. ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœื“ื•ื•ื— ืขืœ ื‘ืื’ - ื›ื™ ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœืงื‘ืœ ื“ื™ื•ื•ื— ืขื ืชื•ื›ื ื™ืช ื‘ื“ื™ืงื” ืžืคื•ืจื˜ืช ืฉืžืฉื—ื–ืจืช ืืช ื”ื‘ืื’ ืžืืฉืจ ืชื™ืื•ืจ ื˜ืงืกื˜ื•ืืœื™ ื‘ื’'ื™ืจื”. 5. ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœืฉืคืจ ื ื’ื™ืฉื•ืช - ืกืคืจื™ื•ืช ื‘ื“ื™ืงื” ื›ืžื• testing-library ืื‘ืœ ื’ื ืกืœื ื™ื•ื ื™ืขื‘ื“ื• ื˜ื•ื‘ ื™ื•ืชืจ ืื ื”ืืชืจ ื ื’ื™ืฉ, ื›ื™ ืกืคืจื™ื™ืช ื”ื‘ื“ื™ืงื”, ื›ืžื• ืงื•ืจื ืžืกืš, ืฆืจื™ื›ื” ืœืชืงืฉืจ ืขื ื”ืืœืžื ื˜ื™ื ืฉืขืœ ื”ืžืกืš ื•ืจื’ื™ืฉื” ื”ืจื‘ื” ื™ื•ืชืจ ืœืงื•ื“ ืžืืฉืจ ืœืขื™ืฆื•ื‘ื™ื ื•ืฆื‘ืขื™ื. ืœื ืคืขื ืงืจื” ืœื™ ืฉื”ื•ืกืคืชื™ ืชื•ื•ื™ืช ื˜ืงืกื˜ ืื• ืžืืคื™ื™ืŸ aria-label ืจืง ื‘ืฉื‘ื™ืœ ืฉื™ื”ื™ื” ืœื™ ื™ื•ืชืจ ืงืœ ืœืชืคื•ืก ืืœืžื ื˜ ืžืกื•ื™ื ื‘ืกืคืจื™ื™ืช ื”ื‘ื“ื™ืงื”. 6. ื‘ื“ื™ืงื•ืช ืœืคื ื™ ืจื™ืคืงื˜ื•ืจื™ื ื’ - ื›ื™ ืื ืื ื™ ื”ื•ืœืš ืœืืจื’ืŸ ืžื—ื“ืฉ ืงื•ื“ ืฉืื—ืจืื™ ืขืœ ืคื•ื ืงืฆื™ื•ื ืืœื™ื•ืช ืžืกื•ื™ืžืช, ืื ื™ ื™ื›ื•ืœ ืœืคื ื™ ืชื—ื™ืœืช ื”ืขื‘ื•ื“ื” ืœื›ืชื•ื‘ ื›ืžื” ื‘ื“ื™ืงื•ืช ืฉื™ืขื–ืจื• ืœื™ ืœื”ื‘ื™ืŸ ืฉื” Refactoring ื”ืกืชื™ื™ื ื‘ื”ืฆืœื—ื”. 7. ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœื”ื–ื›ื™ืจ ืœืขืฆืžื™ ืคื™ืฆ'ืจ ืฉืจืฆื™ืชื™ ืœื‘ื ื•ืช - ื›ื™ ืจืขื™ื•ื ื•ืช ื˜ื•ื‘ื™ื ื™ื›ื•ืœื™ื ืœื”ื’ื™ืข ื’ื ื‘ื–ืžื ื™ื ืœื—ื•ืฆื™ื ื™ื•ืชืจ ื›ืฉืื™ ืืคืฉืจ ืœืžืžืฉ ืื•ืชื, ืื‘ืœ ืชืžื™ื“ ืืคืฉืจ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื” ืงื˜ื ื” ืฉืชื–ื›ื™ืจ ืœื™ ืขืœ ืžื” ืœืขื‘ื•ื“ ื›ืฉืฉื•ื‘ ื™ื”ื™ื” ื–ืžืŸ. ื”ื”ื‘ื ื” ืฉื™ืฉ ืขื•ื“ ืกื™ื‘ื•ืช ืœื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ืžืœื‘ื“ ืฉืžื™ืจื” ืขืœ ื™ืฆื™ื‘ื•ืช ื”ืžืขืจื›ืช ืขื•ื–ืจืช ืœื ื• ืœืชื—ื–ืง ื˜ื•ื‘ ื™ื•ืชืจ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ืœื ืœื”ืจื’ื™ืฉ ืจืข ื›ืฉืฆืจื™ืš ืœืžื—ื•ืง ื‘ื“ื™ืงื•ืช ื™ืฉื ื•ืช. ืœืื•ืจืš ื–ืžืŸ ื™ื—ืก ื™ื“ื™ื“ื•ืชื™ ืœื‘ื“ื™ืงื•ืช ื”ื•ื ื“ืจืš ืžืฆื•ื™ื ืช ืœืฉืคืจ ืืช ื”ื™ืฆื™ื‘ื•ืช ืฉืœ ื”ืžืขืจื›ืช.

ToCode
1 419
# ื˜ื›ื ื™ืงื•ืช Refactoring ืœืงื•ื“ ืจื™ืืงื˜ ืฉืฉื•ื•ื” ืœื”ืชืืžืŸ ืขืœื™ื”ืŸ ืื—ื“ ื”ื“ื‘ืจื™ื ืฉื”ื›ื™ ื›ื™ืฃ ืœืขืฉื•ืช ื‘ืขื‘ื•ื“ื” ืขื ืงื•ื“ ื”ื•ื ืœื”ื–ื™ื– ื“ื‘ืจื™ื ืžืžืงื•ื ืœืžืงื•ื ื›ื“ื™ ืฉื™ื”ื™ื” ื™ื•ืชืจ ืงืœ ืœื”ืžืฉื™ืš ืœืขื‘ื•ื“ ืขืœ ื”ืงื•ื“ - ืžื” ืฉื ืงืจื Refactoring. ื™ืฉ ื˜ื›ื ื™ืงื•ืช ื’ื ืจื™ื•ืช ืฉืืคืฉืจ ืœื”ืคืขื™ืœ ื‘ื›ืœ ืฉืคืช ืชื›ื ื•ืช, ื›ืžื• ืœืงื—ืช ื›ืžื” ืฉื•ืจื•ืช ืฉืœ ืงื•ื“ ื•ืœื”ื•ืฆื™ื ืื•ืชืŸ ืœืคื•ื ืงืฆื™ื” ื ืคืจื“ืช, ื•ื˜ื›ื ื™ืงื•ืช ืกืคืฆื™ืคื™ื•ืช ืœืฉืคื” ืื• ืกื‘ื™ื‘ื” ืžืกื•ื™ืžืช. ืืœื” ื”ื˜ื›ื ื™ืงื•ืช ื”ืžืจื›ื–ื™ื•ืช ืฉืื ื™ ืžืฉืชืžืฉ ื‘ื”ืŸ ื‘ืขื‘ื•ื“ื” ืขืœ ืงื•ื“ ืจื™ืืงื˜: 1. ืœื”ืขืœื•ืช State ืœืงื•ืžืคื•ื ื ื˜ื” ืขืœื™ื•ื ื” (ื•ืœืงื‘ืœ ืื•ืชื• ื—ื–ืจื” ื› Props). 2. ืœื”ื•ืจื™ื“ State ืœืงื•ืžืคื•ื ื ื˜ื” ืคื ื™ืžื™ืช (ื•ืื ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืœื” ืคื•ื ืงืฆื™ื•ืช Callback ืœืขื“ื›ื•ืŸ ื›ืฉื”ืกื˜ื™ื™ื˜ ืžืฉืชื ื”). 3. ืœื”ื•ืฆื™ื State ืœ Context. 4. ืœื”ื—ื–ื™ืจ State ืž Context ืœืงื•ืžืคื•ื ื ื˜ื” ืขืœื™ื•ื ื”, ื•ืœื”ืขื‘ื™ืจ ืื•ืชื• ืœืžื˜ื” ื‘ืชื•ืจ Props ืœืงื•ืžืคื•ื ื ื˜ื•ืช ื”ืคื ื™ืžื™ื•ืช. 5. ืœื”ื•ืฆื™ื ื—ืœืง ืžืงื•ืžืคื•ื ื ื˜ื” ืœืงื•ืžืคื•ื ื ื˜ื” ื—ื™ืฆื•ื ื™ืช ื—ื“ืฉื”, ื›ื“ื™ ืœืคืฉื˜ ืงื•ืžืคื•ื ื ื˜ื•ืช ืžืกื•ื‘ื›ื•ืช. 6. ืœืื—ื“ ืงื•ืžืคื•ื ื ื˜ื•ืช ืคืฉื•ื˜ื•ืช ืœืงื•ืžืคื•ื ื ื˜ื” ืื—ืช ื™ื•ืชืจ ื’ื“ื•ืœื”, ื›ื“ื™ ืœื ื”ืœ ืืช ื” State ืฉืœ ื›ื•ืœืŸ ื‘ืžืงื•ื ืื—ื“. 7. ืœื”ื•ืฆื™ื ื”ื—ื•ืฆื” ืœื•ื’ื™ืงื” + State ืœ Custom Hook. 8. ืœื™ืฆื•ืจ ืงื•ืžืคื•ื ื ื˜ื” ื—ื“ืฉื” ืžืงื•ืžืคื•ื ื ื˜ื” ืงื™ื™ืžืช ื›ื“ื™ ืœืงืจื•ื ืœ Hook ื‘ืฆื•ืจื” ืžื•ืชื ื™ืช. 9. ืœื”ื•ืฆื™ื ืคื•ื ืงืฆื™ื” ืฉื”ื•ื’ื“ืจื” ื‘ืชื•ืš ืงื•ืžืคื•ื ื ื˜ื” ืœืงื•ื‘ืฅ ื ืคืจื“, ืื ื”ื™ื ืœื ืžืฉืชืžืฉืช ื‘ืžื™ื“ืข ื”ืคื ื™ืžื™ ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”. 10. ืœื”ื—ื–ื™ืจ ืคื•ื ืงืฆื™ื” ืžืงื•ื‘ืฅ ื ืคืจื“ ืœืงื•ืžืคื•ื ื ื˜ื” ื›ืฉื”ื™ื ืฆืจื™ื›ื” ื’ื™ืฉื” ืœ State, ืœ Props ืื• ืœืžื™ื“ืข ืื—ืจ ืกืคืฆื™ืคื™ ืœืงื•ืžืคื•ื ื ื˜ื”. ื—ืœืง ืžื”ื˜ืจื™ืงื™ื ื”ืืœื” ื–ืžื™ื ื™ื ื‘ืœื—ื™ืฆืช ื›ืคืชื•ืจ ื‘ IDE ื•ื›ื•ืœื ื“ื•ืจืฉื™ื ืชืจื’ื•ืœ. ื›ื›ืœ ืฉืžืชืืžื ื™ื ื™ื•ืชืจ ืขืœ ืœื”ื–ื™ื– ื“ื‘ืจื™ื ื‘ืงื•ื“ ื›ื›ื” ื–ื” ื ื”ื™ื” ื™ื•ืชืจ ืงืœ. ืœื ืžืขื˜ ืงื•ืจื” ืฉืื ื™ ืžื–ื™ื– ืงื˜ืข ืงื•ื“ ืžืžืงื•ื ืœืžืงื•ื ื•ืื—ืจื™ ื›ืžื” ื™ืžื™ื ืžื—ื–ื™ืจ ืื•ืชื• ืœืžื‘ื ื” ื”ืงื•ื“ื - ื‘ืงื•ื“ ืื ื—ื ื• ืชืžื™ื“ ืžื—ืคืฉื™ื ืืช ื”ืžื‘ื ื” ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ, ื•ื”ื ื™ืกื•ื™ ื”ื•ื ื—ืœืง ื—ืฉื•ื‘ ืžื”ืžืฉื—ืง.

ToCode
1 419
ื‘ืคื‘ืจื•ืืจ 2017 ื’'ื•ืŸ ื“ื™ื™ื•ื™ื“ ื“ืœื˜ื•ืŸ ื”ื—ืœื™ื˜ ืœื”ื™ืคื˜ืจ ืžื›ืœ ื”ื ืงื•ื“ื•ืช ืคืกื™ืง ื‘ lodash. ืขื›ืฉื™ื• ื”ืกื™ืคื•ืจ ืฉืœ ื” semicolons ื‘ JavaScript ืœื ื—ื“ืฉ. ืขื•ื“ ื‘ 2012 ื”ื™ื” ื•ื™ื›ื•ื— ืฆื™ื‘ื•ืจื™ ื’ื“ื•ืœ ื‘ื ื•ืฉื ื•ื”ื•ื ื ืžืฉืš ืขื“ ื”ื™ื•ื. ืœื“ื•ื’ืžื” ื‘ืชื‘ื ื™ืช ืคืจื•ื™ืงื˜ create-react-app ื—ื“ืฉ ืฉืชื™ืฆืจื• ืชืžืฆืื• ื ืงื•ื“ื” ืคืกื™ืง ื‘ืกื•ืฃ ื›ืœ ืฉื•ืจื” ืื‘ืœ ื‘ืชื‘ื ื™ืช ืคืจื•ื™ืงื˜ React ืฉืชื™ืฆืจื• ืขื vite ืœื ืชืžืฆืื• ืืช ื”ื ืงื•ื“ื•ืช-ืคืกื™ืงื™ื. ืœื•ื“ืืฉ ืœื•ืงื—ืช ืืช ื”ืฆื“ ืฉืžืชื ื’ื“ ืœื ืงื•ื“ื” ืคืกื™ืง, ื•ื–ื” ื‘ืกื“ืจ ื’ื ืื ื–ื• ืœื ื›ื•ืก ื”ืชื” ืฉืœื™.

ToCode
1 419
    if (hasOwnProperty.call(result, key)) {
      result[key].push(value)
    } else {
      baseAssignValue(result, key, [value])
    }
    return result
  }, {})
}
ื”ืจืขื™ื•ืŸ ื”ื‘ืกื™ืกื™ ืฉืœ ื”ืืœื’ื•ืจื™ืชื ื‘ืจื•ืจ: ืจืฆื™ื ืขืœ ื›ืœ ื”ืืœืžื ื˜ื™ื ื‘ืจืฉื™ืžื” ืขื reduce ื•ืžืฉืชืžืฉื™ื ื‘ืื•ื‘ื™ืงื˜ ื”ืชื•ืฆืื” ื‘ืชื•ืจ Accumulator. ืขื‘ื•ืจ ื›ืœ ืืœืžื ื˜ ืื ื—ื ื• ืžื—ืฉื‘ื™ื ืžื” ื”"ืžืคืชื—" ืฉืœื•, ื•ืื– ืžืขื“ื›ื ื™ื ืืช ื” Accumulator ื•ืžื•ืกื™ืคื™ื ืœืžืคืชื— ื”ืžืชืื™ื ืืช ื”ืืœืžื ื˜. ื‘ื’ืœืœ ืฉื–ื” reduce ืฆืจื™ืš ืœื”ื—ื–ื™ืจ ืืช ื” Accumulator. ื ื›ื•ืŸ, ืžื™ืžื•ืฉ ืคื•ื ืงืฆื™ื•ื ืืœื™ ื˜ื”ื•ืจ ืื•ืœื™ ื”ื™ื” ื‘ื›ืœ ืื™ื˜ืจืฆื™ื” ืžื™ื™ืฆืจ Accumulator ื—ื“ืฉ ื›ื“ื™ ืœื ืœืฉื ื•ืช ืžื™ื“ืข In Place, ืื‘ืœ ืื ื—ื ื• ื‘ืกืคืจื™ื” ืฉืฆืจื™ื›ื” ืœืชืช ื‘ื™ืฆื•ืขื™ื ื˜ื•ื‘ื™ื ื•ื‘ืฉืคืช JavaScript ื›ืš ืฉื”ื’ื™ืฉื” ืฉืœื”ื ืฉืœ ืขื“ื›ื•ืŸ ื•ื”ื—ื–ืจืช ื”ืžืฆื‘ื™ืข ื”ื™ื ื‘ื”ื—ืœื˜ ื”ื’ื™ื•ื ื™ืช. ื›ืฉืœื•ืงื—ื™ื ืืช ื”ืืœื•ื’ืจื™ืชื ืœืงื•ื“ ืขื•ืœื•ืช ืžืกืคืจ ืฉืืœื•ืช: 1. ื”ืคื•ื ืงืฆื™ื” reduce ืžืงื‘ืœืช ืคื•ื ืงืฆื™ื” ื•ืžืคืขื™ืœื” ืื•ืชื” ืจืง ืขื ืฉื ื™ ืคืจืžื˜ืจื™ื: accumulator ื• value. ืœืžื” ื‘ืงื•ื“ ืฉืœ groupBy ืžืขื‘ื™ืจื™ื ื’ื ืคืจืžื˜ืจ ืฉืœื™ืฉื™ ื‘ืฉื key? 2. ืœืžื” ืœื”ืฉืชืžืฉ ื‘ hasOwnProperty ื‘ืชื•ืจ ืคื•ื ืงืฆื™ื” ื’ืœื•ื‘ืืœื™ืช ื•ืœื ืœื”ืคืขื™ืœ ืื•ืชื• ืžืชื•ืš result? ื›ืœื•ืžืจ ืœืžื” ืœื ืœื›ืชื•ื‘ result.hasOwnProperty(key) 3. ืžื” ื–ื” baseAssignValue ? ืœืžื” ืœื ืœื”ืฉืชืžืฉ ืคืฉื•ื˜ ื‘ื›ืชื™ื‘ ื”ืกื•ื’ืจื™ื™ื ื”ืžืจื•ื‘ืขื™ื ื›ื“ื™ ืœื›ืชื•ื‘ ืืช ื”ืขืจืš? ## ืžืื™ืคื” ื”ื’ื™ืข ื” key? ื”ืคืจืžื˜ืจ ื”ืฉืœื™ืฉื™ ืœืคื•ื ืงืฆื™ื” ืฉ reduce ืžืงื‘ืœืช ื ืงืจื ื‘ืžื™ืžื•ืฉ key ืื‘ืœ ื”ื•ื ืœื ื‘ืฉื™ืžื•ืฉ. ื›ื‘ืจ ื‘ืฉื•ืจื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื”ื•ื ื ื“ืจืก ืขื ื”ืฉื•ืจื”:
key = iteratee(value)
ืื– ื”ืœื›ืชื™ ืœ git ื‘ื ื™ืกื™ื•ืŸ ืœื”ื‘ื™ืŸ ืœืžื” ื”ื•ื ืฉื ื•ื”ื’ืขืชื™ ืœื’ื™ืจืกื” ื”ื™ืฉื ื” ื™ื•ืชืจ ืฉืœ ื”ืงื•ื“:
var groupBy = createAggregator(function(result, value, key) {
  if (hasOwnProperty.call(result, key)) {
    result[key].push(value);
  } else {
    baseAssignValue(result, key, [value]);
  }
});
ืขื•ืฉื” ืจื•ืฉื ืฉื‘ืขื‘ืจ ื”ืฉืชืžืฉื• ื‘ืคื•ื ืงืฆื™ื” ืฉืœื”ื ืฉื ืงืจืืช createAggregator ืฉืขืฉืชื” ืืช ืจื•ื‘ ื”ืขื‘ื•ื“ื” ื•ื“ืื’ื” ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” iteratee ืขืœ ื”ืขืจืš ื•ืœื”ืขื‘ื™ืจ ืœื ื• ืืช ื”ืžืคืชื—. ื‘ืฉืœื‘ ืžืกื•ื™ื ื’'ื•ืŸ ื“ื™ื™ื•ื™ื“ ื“ืœื˜ื•ืŸ (ื”ื™ื•ืฆืจ ืฉืœ lodash) ื”ื—ืœื™ื˜ ืœืขื‘ื•ืจ ืœื”ืฉืชืžืฉ ื‘ reduce ื”ืจื’ื™ืœื” ื•ื›ื ืจืื” ืฉ key ื ืฉืืจ ื‘ื˜ืขื•ืช ืžื”ื—ืชื™ืžื” ื”ื™ืฉื ื”. ## ืžื” ื–ื” baseAssignValue? ืชื”ื™ื™ื” ืฉื ื™ื” ืฉืขืœืชื” ืœื™ ืœื’ื‘ื™ ื”ืžื™ืžื•ืฉ ื ื•ื’ืขืช ืœืคื•ื ืงืฆื™ื” baseAssignValue. ืขืœ ืคื ื™ื• ื‘ืฉื‘ื™ืœ ืœื›ืชื•ื‘ ืžืคืชื— ื—ื“ืฉ ืœืื•ื‘ื™ืงื˜ result ื“ืžื™ื™ื ืชื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘:
result[key] = [value];
ื”ื ื” ืžื” ืฉื”ื ืขื•ืฉื™ื ื‘ืžืงื•ื:
function baseAssignValue(object, key, value) {
  if (key == '__proto__') {
    Object.defineProperty(object, key, {
      'configurable': true,
      'enumerable': true,
      'value': value,
      'writable': true
    })
  } else {
    object[key] = value
  }
}
ืžืขื ื™ื™ืŸ! ืžืกืชื‘ืจ ืฉื‘ JavaScript ืื ื™ ืœื ื™ื›ื•ืœ ืœืฉื ื•ืช ืืช ื”ืฉื“ื” __proto__ ืฉืœ ืื•ื‘ื™ืงื˜, ื•ืœื›ืŸ ืื ื‘ืžืงืจื” ื”ืคื•ื ืงืฆื™ื” ืฉืื—ืจืื™ืช ืขืœ ืืจื’ื•ืŸ ื”ืคืจื™ื˜ื™ื ืœืงื‘ื•ืฆื•ืช ืชื’ืœื” ืฉื”ืžืคืชื— ืฉืœ ืคืจื™ื˜ ืžืกื•ื™ื ื”ื•ื __proto__ ื‘ืžื™ืžื•ืฉ ื ืื™ื‘ื™ ื”ื™ื ืœื ืชื•ื›ืœ ืœื›ืชื•ื‘ ืืช ื”ืžืคืชื— ื”ื–ื”. ื’'ื•ืŸ ื“ื™ื™ื•ื™ื“ ื“ืœื˜ื•ืŸ ื”ืฉืชืžืฉ ื‘ defineProperty ื›ื“ื™ ืœืขืงื•ืฃ ืืช ื”ืžื’ื‘ืœื” ื•ื›ืŸ ืœืืคืฉืจ ื›ืชื™ื‘ื” ืœืฉื“ื” __proto__. ## ื•ืžื” ืœื’ื‘ื™ hasOwnProperty? ืฉืืœื” ื”ืฉืœื™ืฉื™ืช ืœืกืงื™ืจื” ื–ื• ื ื•ื’ืขืช ืœ hasOwnProperty - ืœืžื” ืœื”ืฉืชืžืฉ ื‘ Object.prototype.hasOwnProperty ื•ืœื ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” ืขืœ ืื•ื‘ื™ืงื˜ ื” result ืฉื™ืฉ ืœื ื• ื‘ื™ื“? ืื ื”ื’ืขืชื ืขื“ ืคื” ื‘ืงืจื™ืื” ืื ื™ ืžืงื•ื•ื” ืฉื”ืชืฉื•ื‘ื” ื›ื‘ืจ ื‘ืจื•ืจื”: ื’ื hasOwnProperty ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื ืฉืœ ืžืคืชื— ื‘ื• ืืžื•ืจ ืœื”ื™ื•ืช ืžืชื•ื™ื’ ืื—ื“ ื”ืขืจื›ื™ื, ื•ืื ื–ื” ื”ืžืฆื‘ ืื– result.hasOwnProperty ื™ื—ื–ื™ืจ ืืช ืจืฉื™ืžืช ื”ืขืจื›ื™ื ืฉืžืชืื™ืžื™ื ืœืžืคืชื— ื–ื” ื‘ืžืงื•ื ืืช ื”ืคื•ื ืงืฆื™ื” Object.prototype.hasOwnProperty. ื•ืื’ื‘ ื‘ื—ื–ืจื” ืœืฉื•ืจืช ื”ื”ืขืจื” ืฉืจืื™ื ื• ื‘ืจืืฉ ื”ืงื•ื‘ืฅ, ืื ื”ื™ื• ืฉื•ืืœื™ื ืื•ืชื™ ื”ื™ื™ืชื™ ืžืฆื™ืข ืœื”ื—ืœื™ืฃ ืื•ืชื” ืœืžืฉื”ื• ืฉืจื•ืžื– ืœืžืงืจื” ื”ื–ื”, ืœื“ื•ื’ืžื”:
/** Saving hasOwnProperty in a global variable allows us to call it even if one of the value's key will be the string "hasOwnProperty" */
const hasOwnProperty = Object.prototype.hasOwnProperty
## ื .ื‘. ืžื” ืงืจื” ืœื ืงื•ื“ื” ืคืกื™ืง? ื—ื“ื™ ื”ืขื™ืŸ ื‘ื™ื ื™ื›ื ืื•ืœื™ ื”ื‘ื—ื™ื ื• ืฉื‘ื’ื™ืจืกื” ื”ื™ืฉื ื” ืฉืœ ื”ืงื•ื“ ืฉืœ groupBy ื”ื™ื• ืกื™ืžื ื™ ; ื‘ืกื•ืฃ ื›ืœ ื‘ื™ื˜ื•ื™, ื•ื‘ื’ื™ืจืกื” ื”ืขื“ื›ื ื™ืช ื”ื ื ืขืœืžื•. ื—ื™ืคื•ืฉ ื‘ git log ืžืœืžื“ ืื•ืชื ื• ืฉื–ื” ืžื›ื•ื•ืŸ:
commit 6cb3460fcefe66cb96e55b82c6febd2153c992cc
Author: John-David Dalton <john.david.dalton@gmail.com>
Date:   Sat Feb 4 23:50:10 2017 -0800

    Remove semicolons.