ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
+130 kunlar
Postlar arxiv
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 ืขื ืืืืขืช ืืงืืืื ืืืืคืืื: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: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 ืืื ืืืจืืง ืฉืื ืฉืืืื.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 yoyo1 419
# ืงื ืืฉื ืืช
ืื ื ืจืฉืืื ืืืงืืช ืฉื ืืืจืื ืฉืื ืื ื ืืื ืื ืืกืืืจืื ืืคื ืืื ืงื ืืฉื ืืช ืืืชื:
1. ืืืืืฉ ืฉื ืคืื ืงืฆืื
2. ืืชืืื ืฉื ืคืื ืงืฆืื
3. ืจืฉืืืช ืคืื ืงืฆืืืช ืื ืืืืงืืช ืฉืืืืฆืืืช ืืืืืื
4. ืจืฉืืืช ืืืืืืช ื DB ืืขืืืืืช ืฉื ืื ืืืื
5. ืจืฉืืืช API Routes ืืืืืื ืขื ืืคืจืืืจืื ืฉื ืื ื ืชืื
6. ืคืจืืืืงืืืื ืืชืงืฉืืจืช ืืื ืืขืจืืืช (API ืฆืืืืจื)
ืงืื ืืฉืชื ื ืื ืืืื, ืขืืืื ืื ืืืกืืก ืื ืชืื ืื ืืจืื ืืืชืจ ืืืืืื ืืืกืืื ืื, ืขืืืื ืฉื API Routes ืขืืื ืืืฉืคืืข ืขื ืืขืจืืืช ืืืฆืื ืืืช ืืืื ืืืจืฉ ืกืื ืืจืื ืฉืื ืืืื ืืื ืืกืคืจ ืฆืืืชืื, ืฉืื ืื Public API ืืืืจ ืฉืืจืื ืืงืืืืช ืฉืืื ืืฆืืจืื ืืขืืื ืืช ืืงืื ืฉืืื ืืื ืกืื ืืจืื ืืคืืื ืืืชืจ ืืืจืื ืืฉืื ืื ืคื ืืื ืืืจืืื.
ืืื ืืืช ืืืฆืจ ืืืฉ ืฉืืื ืืฉืื ืื ืืืืงื ืืช ืืืฉืงืขื ืืืงืื ืื ืืื - ืืืืจืช API ืฆืืืืจื ืืขืืืชื ืขืืืื ืืกืื ืืื ืืช ืืงืื ืฉื ืื ืืืขืจืืช ืืฆืืจื ืฉืืืื ืืืื ืงืฉื ืืชืงื ืืืืฉื.
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.
ืื ืืื ืืื ืืื ืฉืฆืจืื ืชืืืื ืืจืืืช ืขื ืืืกื ืืช ืื ืืชืืื ืืช ืฉืืขืืืชื.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;
}1 419
# ืื ืฉืืืืจ
ืืขืืจืชื ืืืื ืงืืจืก (ืืืื - ื ื ืงืืจืื ื ืืื), ืืืื ืฉืงืืจื ืืงืืจืกืื ืืฉืื ื ืฉืืื ืฉืืื ืื ืืืขื ืชืืื ืืืชื ืื ืฉืื: ืืืชื ืื ืฉืื ืฉืขืื ืื, ืืืชื ืื ืฉืื ืฉืฉืืืืื ืฉืืืืช ืืจืืื, ืืืชื ืื ืฉืื ืฉืืืชืืจืื ืืืชื ืขื ืืืืืืช, ืืืชื ืื ืฉืื ืฉืจืืฆืื ืืืขืช ืืืชืจ.
ืืืืืจื ืืืืืช "ืื ืฉืืืืจ" ืืื ืื ืืืื ืช ืืืืื. ืืื ืืืืืช ืืช ืืกืืืื ืืฉืืื ืืฉืื ืืคืฉื, ืื ืืืืื ืชืฉืืื ืื ืืกืคืืง ืืืื ืื ืืืืื ืืช ืขืฆืื ืขื ืืืื ืื ืกืื ืื ืืืืืจ ืื ืืกืคืืง "ื ืืื ืื".
ืื ืชืชืืืื ืืืฉืื ืืืืชืืื ืื ืืืืื ืจืง ืืฉืฉืืืืื ืืืชื ืื ืืืืืจื ืืืืจ ืืื ืืืืช ืงืฉื. ืืจืืข ืืืืช ืื ืฉืืฉ ืื ืืืืื ืืฃ ืคืขื ืื ื ืจืื ืืกืคืืง ืืื.
ืืืจื ืืืืืช "ืื ืฉืืืืจ" ืืื ืืืืืื ืืช ืื ืืจืืฉ, ืืืืืฅ ืขื ืืืคืชืืจ ืื ืืคื ื ืฉืืชืฉืืื ืฉืื ืืกืคืืง ืืืื ืืืฉืคืจ ืชืื ืืื ืชื ืืขื. ืืื ืืื ืืชืจืืืื ืืื ืฉืืื ืืช ืืืืืฅ.
1 419
# ืืืืงืืช ืืืืฅ ืืงืืคืกื
ืืืืงืืช ืืืืืืืืืช ืืงืื ืืชืืืจืืช ืืจืื ืขื ืืืืื ื ืืื ืืช ืฉื ืืงืื ืืชืืืฉืช ืืืืืื ืืืคืชืืื ืืืื ืืืื ืฉืืืขืจืืช ืขืืฉื ืื ืฉืืื ืฆืจืืื ืืขืฉืืช. ืื ื ืืื ืืคืขืืื, ืืื ืืจืื ืคืขืืื ืื ืื ื ืืืชืืื ืืืืงืืช ืืกืืืืช ื ืืกืคืืช ืืื ืคืืืช ืืฉืืืืช:
1. ืืืืงืืช ืืชืืขืื - ืืืืงื ืืืืื ืืืจืืืช ืืืชืื ืชืื ืืืจืื ืืื ืืืืจืื ืืืฉืชืืฉ ืืคืื ืงืฆืื ืฉืื, ืืคืขืืื ืืืชืจ ืืื ืืชืืขืื ืืงืกืืืืื. ืืฉ ืื ืืืื ืืืืืืืืื ืืื doctest ืืขืืื ืฉื ืคืืืชืื ืฉืืื ื ืืืืงืืช ืืืืืืืืช ืขื ืกืื ืชืืขืื (ืืคืืจืื ืืืืื) ืฉืื ืื ื ืืืชืืื.
2. ืืืืงืืช ืืื ืืืงืืจ ืงืื ืืืฆืื ื - ืงืื ืืืืงื ืืืื ืืขืืืจ ืื ืืืจืืฅ ืืงืืืช ืืื ืคืื ืงืฆืืืช ืืงืื ืืืฆืื ื - ืืืืืื ืื ืื ื ืจืืฆื ืืืืื ืืื ืกืคืจืื ืืกืืืืช ืขืืืืช - ืืืืืื ืืกืืืืืช ืืื ืงืฉื ืื ืืงืื REPL ืืชืื ืืขืจืืช ืขืืืืช. ื ืืื, ืืคืฉืจ ืืืชืื ืกืงืจืืคื ืงืื ืฉืืขืฉื ืืช ืืืืงืจ, ืืื ืืืืืงื ืืฉ ืืืชืจืื ืฉืืื ืชืืฉืืจ ืืืชื ืื ืืขืชืื ืืชืืคืฉืจ ืืืืฉืื ืืืงืืจ ืืฉืืืื ืื ืฉืืืืช ืืืฉืืช.
3. ืืืืงืืช ืืื ืืืฉืื ืขื ืืืฉืง - ืื ืฉื TDD ืืืื ืืืืืื ืืช ืื. ืืจืขืืื ืฉืืฉืืชื ืืชืืื ืืื ืืช ืืืฉืง ืืืืืงื ืื ืืืืื ืืกืืื ืื ืขืืืจ ืื ืกืืช ืืืชืื ืงืื ืฉืืฉืชืืฉ ืืืืฉืง ืืื ืืื ืืืืื ืขื ืืื ืืื ื ืื. ืชืืื ืืช ืืืืงื ืืื ืืงืื ืืฆืืื ืืขืฉืืช ืืฉืืงืื ืืืื.
4. ืืืืงืืช ืืื ืืืืื ืขื ืืื - ืื ืืจืื ืืืชืจ ืงื ืืงืื ืืืืื ืขื ืชืืื ืืช ืืืืงื ืืคืืจืืช ืฉืืฉืืืจืช ืืช ืืืื ืืืฉืจ ืชืืืืจ ืืงืกืืืืื ืื'ืืจื.
5. ืืืืงืืช ืืื ืืฉืคืจ ื ืืืฉืืช - ืกืคืจืืืช ืืืืงื ืืื testing-library ืืื ืื ืกืื ืืื ืืขืืื ืืื ืืืชืจ ืื ืืืชืจ ื ืืืฉ, ืื ืกืคืจืืืช ืืืืืงื, ืืื ืงืืจื ืืกื, ืฆืจืืื ืืชืงืฉืจ ืขื ืืืืื ืืื ืฉืขื ืืืกื ืืจืืืฉื ืืจืื ืืืชืจ ืืงืื ืืืฉืจ ืืขืืฆืืืื ืืฆืืขืื. ืื ืคืขื ืงืจื ืื ืฉืืืกืคืชื ืชืืืืช ืืงืกื ืื ืืืคืืื aria-label ืจืง ืืฉืืื ืฉืืืื ืื ืืืชืจ ืงื ืืชืคืืก ืืืื ื ืืกืืื ืืกืคืจืืืช ืืืืืงื.
6. ืืืืงืืช ืืคื ื ืจืืคืงืืืจืื ื - ืื ืื ืื ื ืืืื ืืืจืื ืืืืฉ ืงืื ืฉืืืจืื ืขื ืคืื ืงืฆืืื ืืืืืช ืืกืืืืช, ืื ื ืืืื ืืคื ื ืชืืืืช ืืขืืืื ืืืชืื ืืื ืืืืงืืช ืฉืืขืืจื ืื ืืืืื ืฉื Refactoring ืืกืชืืื ืืืฆืืื.
7. ืืืืงืืช ืืื ืืืืืืจ ืืขืฆืื ืคืืฆ'ืจ ืฉืจืฆืืชื ืืื ืืช - ืื ืจืขืืื ืืช ืืืืื ืืืืืื ืืืืืข ืื ืืืื ืื ืืืืฆืื ืืืชืจ ืืฉืื ืืคืฉืจ ืืืืฉ ืืืชื, ืืื ืชืืื ืืคืฉืจ ืืืชืื ืืืืงื ืงืื ื ืฉืชืืืืจ ืื ืขื ืื ืืขืืื ืืฉืฉืื ืืืื ืืื.
ืืืื ื ืฉืืฉ ืขืื ืกืืืืช ืืืชืืืช ืืืืงืืช ืืืื ืฉืืืจื ืขื ืืฆืืืืช ืืืขืจืืช ืขืืืจืช ืื ื ืืชืืืง ืืื ืืืชืจ ืืช ืืืืืงืืช ืืื ืืืจืืืฉ ืจืข ืืฉืฆืจืื ืืืืืง ืืืืงืืช ืืฉื ืืช. ืืืืจื ืืื ืืืก ืืืืืืชื ืืืืืงืืช ืืื ืืจื ืืฆืืื ืช ืืฉืคืจ ืืช ืืืฆืืืืช ืฉื ืืืขืจืืช.
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 ืืืืื ืืืจืฉืื ืชืจืืื. ืืื ืฉืืชืืื ืื ืืืชืจ ืขื ืืืืื ืืืจืื ืืงืื ืืื ืื ื ืืื ืืืชืจ ืงื. ืื ืืขื ืงืืจื ืฉืื ื ืืืื ืงืืข ืงืื ืืืงืื ืืืงืื ืืืืจื ืืื ืืืื ืืืืืจ ืืืชื ืืืื ื ืืงืืื - ืืงืื ืื ืื ื ืชืืื ืืืคืฉืื ืืช ืืืื ื ืืืื ืืืืชืจ, ืืื ืืกืื ืืื ืืืง ืืฉืื ืืืืฉืืง.
1 419
ืืคืืจืืืจ 2017 ื'ืื ืืืืืื ืืืืื ืืืืื ืืืืคืืจ ืืื ืื ืงืืืืช ืคืกืืง ื lodash. ืขืืฉืื ืืกืืคืืจ ืฉื ื semicolons ื JavaScript ืื ืืืฉ. ืขืื ื 2012 ืืื ืืืืื ืฆืืืืจื ืืืื ืื ืืฉื ืืืื ื ืืฉื ืขื ืืืื. ืืืืืื ืืชืื ืืช ืคืจืืืงื create-react-app ืืืฉ ืฉืชืืฆืจื ืชืืฆืื ื ืงืืื ืคืกืืง ืืกืืฃ ืื ืฉืืจื ืืื ืืชืื ืืช ืคืจืืืงื React ืฉืชืืฆืจื ืขื vite ืื ืชืืฆืื ืืช ืื ืงืืืืช-ืคืกืืงืื. ืืืืืฉ ืืืงืืช ืืช ืืฆื ืฉืืชื ืื ืื ืงืืื ืคืกืืง, ืืื ืืกืืจ ืื ืื ืื ืื ืืืก ืืชื ืฉืื.
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.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
