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
# ืžื” ื”ืื•ืจืš ืฉืœ ื“ื’ืœ ื™ืฉืจืืœ ื‘ 2022 ืœืžืจื•ืช ืฉืขืฉื™ื ื• ื”ืชืงื“ืžื•ืช ืžืฉืžืขื•ืชื™ืช ื‘ื›ืœ ืžื” ืฉืงืฉื•ืจ ืœื˜ื™ืคื•ืœ ื‘ื™ื•ื ื™ืงื•ื“ ื‘ืฉืคื•ืช ืชื›ื ื•ืช, ืคื•ืกื˜ ืฉืขืœื” ืœืื—ืจื•ื ื” ืœืจื“ื™ื˜ ื”ื–ื›ื™ืจ ืœื™ ืฉืœื ื”ื›ืœ ื•ืจื•ื“ ื•ืฉื’ื ื‘ 2022 ืจื•ื‘ ืฉืคื•ืช ื”ืชื›ื ื•ืช ืฉื ืขื‘ื•ื“ ืื™ืชืŸ ื™ื“ืจืฉื• ื˜ื™ืคื•ืœ ืžื™ื•ื—ื“ ื‘ืฉื‘ื™ืœ ืœื—ืฉื‘ ื ื›ื•ืŸ ืื•ืจืš ืฉืœ ืžื—ืจื•ื–ืช. ื”ื ื” ืกืงื™ืจื” ื–ืจื™ื–ื” ืฉืขืฉื™ืชื™ ื‘ืขืงื‘ื•ืช ืื•ืชื• ืคื•ืกื˜ ื›ื“ื™ ืœื”ื‘ื™ืŸ ืžื” ื”ืื•ืจืš ืฉืœ ื“ื’ืœ ื™ืฉืจืืœ ื‘ืฉืคื•ืช ืชื›ื ื•ืช ืฉื•ื ื•ืช ืฉืื ื™ ืžื›ื™ืจ. ## ื’'ืื•ื•ื”ืกืงืจื™ืคื˜ ืื– ืžื™ืœื” ืฉืœ ื”ืงื“ืžื” - ื›ืฉืื ื™ ืฉื•ืืœ ืขืœ ื“ื’ืœ ื™ืฉืจืืœ ืื ื™ ื‘ืขืฆื ืžื“ื‘ืจ ืขืœ ื”ืื™ืžื•ื’'ื™ ืฉืœ ื”ื“ื’ืœ ืฉืืชื ืžื›ื™ืจื™ื ืžื”ื•ื•ื˜ืกืืค. ื‘ HTML ืืคืฉืจ ืœื”ื“ืคื™ืก ืื•ืชื• ื‘ืขืžื•ื“ ืขื ื”ืงื•ื“:
<span>&#127470;&#127473;</span>
ื›ืžื• ื”ืจื‘ื” ื“ื’ืœื™ื ื”ื•ื ืžื•ืจื›ื‘ ืžืฉื ื™ Unicode Codepoints, ื”ืจืืฉื•ืŸ ืžื™ื™ืฆื’ ืืช "ืกื™ืžืŸ ืื–ื•ืจื™ I" ื•ื”ืฉื ื™ "ืกื™ืžืŸ ืื–ื•ืจื™ L". ื‘ื ื™ ืื“ื ืฉืจื•ืื™ื ืืช ื”ืื™ืžื•ื’'ื™ ื”ื–ื” ืžืชื™ื—ืกื™ื ืืœื™ื• ื‘ืชื•ืจ ืชื• ืื—ื“, ื•ื‘ืฉืคื” ืžืงืฆื•ืขื™ืช ื–ื” ื ืงืจื Grapheme ืื—ื“. ื”ืจื‘ื” ืื™ืžื•ื’'ื™ื ืื—ืจื™ื (ืฉืื™ื ื ื“ื’ืœื™ื) ืžื™ื•ืฆื’ื™ื ืขืœ ื™ื“ื™ Codepoint ื™ื—ื™ื“, ื•ืžื” ืฉืžืขื ื™ื™ืŸ ื‘ื“ื’ืœื™ื ื–ื” ืฉื”ื ืžืจืื™ื ืœื ื• ืืช ื”ื”ื‘ื“ืœ ื‘ื™ืŸ Codepoints ืœ Graphemes. ืงื•ื“ืคื•ื™ื ื˜ ื‘ื™ื•ื ื™ืงื•ื“ ื–ื” ืคืฉื•ื˜ ืชื• ื™ื•ื ื™ืงื•ื“ื™ ื™ื—ื™ื“, ื•ื’ืจืคืžื” ื–ื” ืžื” ืฉืื ื—ื ื• ื›ื‘ื ื™ ืื“ื ืชื•ืคืกื™ื ื‘ืชื•ืจ ืชื• ืื—ื“. ืฉืคืช ื”ืชื›ื ื•ืช ื”ืจืืฉื•ื ื” ืฉืจืฆื™ืชื™ ืœื‘ื“ื•ืง ืื™ืš ื”ื™ื ืžื˜ืคืœืช ื‘ื’ืจืคืžื•ืช ื”ื™ื ื’'ืื•ื•ื”ืกืงืจื™ืคื˜ ืคืฉื•ื˜ ื›ื™ ืงื•ื“ JavaScript ื ืจืื” ืœื™ ื›ืžื• ืžืฉื”ื• ืฉื‘ืกื‘ื™ืจื•ืช ื’ื‘ื•ื”ื” ื™ืคื’ื•ืฉ ืื™ืžื•ื’'ื™ื. ืื– ื›ืชื‘ืชื™ ืืช ื”ืชื•ื›ื ื™ืช ื”ื‘ืื”:
console.log("๐Ÿ‡ฎ๐Ÿ‡ฑ".length);
ื•ื ื™ืกื™ืชื™ ืœื”ืจื™ืฅ ืื•ืชื” ื’ื ื‘ node ื•ื’ื ื‘ื›ืจื•ื. ื”ืชื•ืฆืื” ื‘ืฉื ื™ ื”ืžืงื•ืžื•ืช ื”ื™ืชื” ื–ื”ื” - ื”ืžืกืคืจ 4. ื›ืฉื ื™ืกื™ืชื™ ืœืฉืื•ืœ ืืช ื’ื•ื’ืœ ืื ื™ืฉ ื“ืจืš ืœืกืคื•ืจ ื’ืจืคืžื•ืช ื‘ JavaScript ื”ื•ื ืœื ื™ื“ืข ืœื”ืžืœื™ืฅ ืœื™ ืขืœ ื“ืจืš ืžื•ื‘ื ื™ืช ื‘ืฉืคื”, ืื‘ืœ ื›ืŸ ืฉืœื— ืื•ืชื™ ืœืกืคืจื™ื” ื”ื–ืืช: https://github.com/orling/grapheme-splitter ืฉื ืจืื” ืฉื™ื•ื“ืขืช ืœืกืคื•ืจ ื›ืžื• ืฉืฆืจื™ืš. ## ืคื™ื™ืชื•ืŸ ื‘ืคื™ื™ืชื•ืŸ ื”ืžืฆื‘ ืงืฆืช ื™ื•ืชืจ ื˜ื•ื‘. ื”ืชื•ื›ื ื™ืช ืฉื›ืชื‘ืชื™ ื ืจืื™ืช ื›ืš:
print(len("๐Ÿ‡ฎ๐Ÿ‡ฑ"))
ื•ื”ืคืขื ื”ืชื•ืฆืื” ื”ื™ืชื” 2. ืขื“ื™ื™ืŸ ืœื ืžื“ื•ื™ืง ืื‘ืœ ืœืคื—ื•ืช ืงืฆืช ื™ื•ืชืจ ืงืจื•ื‘ ืœืื•ืจืš ื”ืืžื™ืชื™. ื’ื ื›ืืŸ ื’ื•ื’ืœ ืœื ื™ื“ืข ืœื”ืฆื™ืข ืœื™ ื“ืจืš ื ื•ื—ื” ื•ืžื•ื‘ื ื™ืช ื‘ืฉืคื” ืœืกืคื•ืจ ื’ืจืคืžื•ืช, ื•ื‘ืžืงื•ื ืฉืœื— ืื•ืชื™ ืœืกืคืจื™ื” ื”ื–ืืช https://pypi.org/project/grapheme/ ืฉื ืจืื” ืฉืžืฆืœื™ื—ื” ืœื”ืชืžื•ื“ื“ ืขื ื”ืืชื’ืจ. ## ืจื•ื‘ื™ ื’ื ื‘ืจื•ื‘ื™ ื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœื™ ืœืงื‘ืœ ืืช ื”ืื•ืจืš ื”ื—ื–ื™ืจ 2:
puts "๐Ÿ‡ฎ๐Ÿ‡ฑ".length
ืื‘ืœ ื”ืคืขื ื’ื•ื’ืœ ื›ื‘ืจ ื™ื“ืข ืœืกืคืจ ืฉืื ื™ ืคืฉื•ื˜ ืœื ืžืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” ื”ื ื›ื•ื ื”, ื•ื”ื“ืจืš ื”ืืžื™ืชื™ืช ืœืกืคื•ืจ ื’ืจืคืžื•ืช ื‘ืžื—ืจื•ื–ืช ื‘ืจื•ื‘ื™ ื”ื™ื ืคืฉื•ื˜:
puts "๐Ÿ‡ฎ๐Ÿ‡ฑ".grapheme_clusters.length
ื•ื–ื” ื›ื‘ืจ ืžื—ื–ื™ืจ ืืช ื”ืชื•ืฆืื” ื”ื ื›ื•ื ื” - ื›ืœื•ืžืจ 1. ## ืคืจืœ ื‘ืฉื‘ื™ืœ ืœืกื™ื™ื ืืช ืกื‘ื‘ "ืฉืคื•ืช ื”ืกืงืจื™ืคื˜ื™ื" ื—ืฉื‘ืชื™ ืœื ืกื•ืช ืœืจืื•ืช ืžื” ื”ืžืฆื‘ ื‘ืคืจืœ. ื ื›ื•ืŸ, ืžื–ืžืŸ ืœื ื›ืชื‘ืชื™ ื‘ื”, ืื‘ืœ ื–ื” ื›ืžื• ืœืจื›ื‘ ืขืœ ืื•ืคื ื™ื™ื ืื• ืžืฉื”ื•. ื‘ืงื™ืฆื•ืจ ื”ื’ื™ืจืกื” ื”ืจืืฉื•ื ื” ืฉื›ืชื‘ืชื™ ื‘ืคืจืœ ื”ืžืฉื™ื›ื” ืืช ื”ืžืกื•ืจืช ืฉืœ ืคื™ื™ืชื•ืŸ ื•ืจื•ื‘ื™ ื•ื”ื—ื–ื™ืจื” 2:
use v5.30;
use utf8;

say(length("๐Ÿ‡ฎ๐Ÿ‡ฑ"));
ืื‘ืœ ื‘ื ื™ื’ื•ื“ ืœืคื™ื™ืชื•ืŸ, ื‘ืคืจืœ ืžื•ื“ื•ืœ ื”ื‘ื™ื˜ื•ื™ื™ื ื”ืจื’ื•ืœืืจื™ื™ื ืžืกืคื™ืง ืžืฉื•ื›ืœืœ ื›ื“ื™ ืœืกืคื•ืจ ื’ืจืคืžื•ืช ืขื ื”ืชื• ื”ืžื™ื•ื—ื“ \X (ืœื”ื’ื ืช ืคื™ื™ืชื•ืŸ ืฆืจื™ืš ืœื”ื’ื™ื“ ืฉื™ืฉ ืกืคืจื™ื” ื—ื™ืฆื•ื ื™ืช ื‘ืฉื regex ืฉื›ืŸ ืžืกืคืงืช ืืช ื”ื”ืชื ื”ื’ื•ืช ื”ื–ืืช ื’ื ืฉื). ื‘ื›ืœ ืžืงืจื” ื”ืงื•ื“ ื”ื–ื” ื‘ืคืจืœ ื›ื‘ืจ ื”ื“ืคื™ืก ืืช ื”ืชื•ืฆืื” ื”ื ื›ื•ื ื”:
my $str   = "๐Ÿ‡ฎ๐Ÿ‡ฑ";
my $count = 0;
while ($str =~ /\X/g) { $count++ }
say($count);
ืงืฆืช ื™ื•ืชืจ ืืจื•ืš ืžืจื•ื‘ื™ ืื‘ืœ ืขื“ื™ื™ืŸ ืžืกืคื™ืง ื˜ื•ื‘ ื‘ืขื™ื ื™ื™. ## ืืœื™ืงืกื™ืจ ืฉืชื™ ื”ืฉืคื•ืช ื”ืื—ืจื•ื ื•ืช ืœืกืงื™ืจื” ื”ืŸ ืืœื” ืฉืขื•ืฉื•ืช ืืช ื”ื“ื‘ืจ ื”ื ื›ื•ืŸ ืžื”ื”ืชื—ืœื”. ื‘ืืœื™ืงืกื™ืจ, ื”ืคืงื•ื“ื” String.length ืžื—ื–ื™ืจื” ืืช ื”ืื•ืจืš ื‘ื’ืจืคืžื•ืช, ื•ืœื›ืŸ ื”ืชื•ื›ื ื™ืช ื”ื‘ืื” ืžื“ืคื™ืกื” 1:
String.length("๐Ÿ‡ฎ๐Ÿ‡ฑ")
|> IO.inspect
## ืกื•ื•ื™ืคื˜ ื•ืื•ืชื• ื”ืžืฉื—ืง ืงื•ืจื” ื‘ืกื•ื•ื™ืคื˜, ื›ืฉื”ืคื•ื ืงืฆื™ื” count ื”ืจื’ื™ืœื” ืœื—ื™ืฉื•ื‘ ืื•ืจืš ืžื“ืคื™ืกื” ืืช ื”ื“ื‘ืจ ื”ื ื›ื•ืŸ ื‘ืœื™ ืœืขืฉื•ืช ืขื ื™ื™ื ื™ื:
print("๐Ÿ‡ฎ๐Ÿ‡ฑ".count)
ืื ื ืกื›ื - ื’ื ื‘ 2022 ื”ืจื‘ื” ืฉืคื•ืช ืชื›ื ื•ืช ืคื•ืคื•ืœืจื™ื•ืช ืžื›ืจื™ื—ื•ืช ืืชื›ื ืœื”ืชืงื™ืŸ ืกืคืจื™ื” ื—ื™ืฆื•ื ื™ืช ืื• ืœื”ืฉืชืžืฉ ื‘ืงื•ื“ ืžื™ื•ื—ื“ ื›ื“ื™ ืœืกืคื•ืจ ื›ืžื• ืฉืฆืจื™ืš ื›ืžื” ืชื•ื•ื™ื ื™ืฉ ื‘ืžื—ืจื•ื–ืช. ืงืฉื” ืœื™ ืœืจืื•ืช ืืช ื–ื” ืžืฉืชื ื” ื‘ืขืชื™ื“ ื”ืงืจื•ื‘ ืžื˜ืขืžื™ ืชืื™ืžื•ืช ืื—ื•ืจื” ื•ืœื›ืŸ ื”ืื—ืจื™ื•ืช ื‘ื™ื“ื™ื™ื ืฉืœื ื•. ืฉื™ืžื• ืœื‘ ื‘ืื™ื–ื• ืฉืคื” ืืชื ืขื•ื‘ื“ื™ื ื•ืื™ื–ื” ื˜ื™ืคื•ืœ ืžื™ื•ื—ื“ ื ื“ืจืฉ ื‘ืขื‘ื•ื“ื” ืขื ืžื—ืจื•ื–ื•ืช.

ToCode
1 419
https://github.com/axios/axios/issues/1227. ืžืขื‘ืจ ืœ Fetch ื™ืืคืฉืจ ืœื”ืคืขื™ืœ ืืช ื”ืคืจืžื˜ืจ maxRedirects ื’ื ื‘ื“ืคื“ืคืŸ. 2. ื›ืจื’ืข ืื™ืŸ ื‘ื“ื™ืงื•ืช ืœ adapter ืฉืœ xhr. ื”ืกืคืจื™ื” MSW ืžืืคืฉืจืช ืœื‘ื ื•ืช ืฉืจืช http ืงื˜ืŸ ืžืชื•ืš ื”ื“ืคื“ืคืŸ. ื‘ืืžืฆืขื•ืชื” ืืคืฉืจ ืœื‘ื ื•ืช ื‘ื“ื™ืงื•ืช ืœืงื•ื“ ื”ืชืงืฉื•ืจืช ืฉื™ืจื•ืฆื• ื’ื ื‘ื“ืคื“ืคืŸ ื•ื’ื ื‘ Node.JS, ื•ื™ื‘ื“ืงื• ืืช ืฉื ื™ ื” adapters ื‘ืžื›ื” ืื—ืช. 3. ื›ืจื’ืข ื›ืœ adapter ืžื›ื™ืœ ืืช ืงื•ื“ ื”ืชืงืฉื•ืจืช ื”ืžืœื ืฉื”ื•ื ืฆืจื™ืš, ืžื” ืฉื’ื•ืจื ืœื›ืคืœ ืงื•ื“ ื‘ื™ื ื™ื”ื ืœื“ื•ื’ืžื” ื‘ื˜ื™ืคื•ืœ ื‘ื‘ื™ื˜ื•ืœ ื‘ืงืฉื”. ืืคืฉืจ ืœืืจื’ืŸ ืื—ืจืช ืืช ื”ืงื•ื“ ื›ื“ื™ ืœื‘ื˜ืœ ืืช ื›ืคืœ ื”ืงื•ื“ ื”ื–ื”. ืขื“ ืœืคื” ืกืงื™ืจืช ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื”ืžืจื›ื–ื™ืช ืฉืœ axios. ื‘ืจื•ืจ ืฉื™ืฉ ืขื•ื“ ื”ืจื‘ื” ืงื•ื“ ืœื—ื–ื•ืจ ืืœื™ื• ื‘ืกืคืจื™ื” ื”ื–ื•, ื•ืื ื™ ืžืงื•ื•ื” ืฉืกืงื™ืจื” ื–ื• ื ืชื ื” ืœื›ื ืืช ื”ื›ืœื™ื ืœื”ืชืžืฆื ื˜ื•ื‘ ื™ื•ืชืจ ื‘ืกืคืจื™ื” ื•ืœื”ืžืฉื™ืš ืœืฆืœื•ืœ ืœืžื ื’ื ื•ืŸ ืฉืœื” ืฉืžืขื ื™ื™ื ื™ื ืืชื›ื.

ToCode
1 419
        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
      }
    }
ื•ื”ืงื˜ืข ื”ื–ื” ืžื˜ืคืœ ื‘ื‘ื™ื˜ื•ืœ ื‘ืงืฉื” ื‘ืงื•ื‘ืฅ ื” adapter ื”ืฉื ื™, ื”ืงื•ื‘ืฅ adapters/http.js:
    if (config.cancelToken || config.signal) {
      // Handle cancellation
      // eslint-disable-next-line func-names
      onCanceled = function(cancel) {
        if (req.aborted) return;

        req.abort();
        reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);
      };

      config.cancelToken && config.cancelToken.subscribe(onCanceled);
      if (config.signal) {
        config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
      }
    }
ืืจื’ื•ืŸ ืžื—ื“ืฉ ืฉืœ ื”ืงื•ื“ ื‘ืฉื ื™ ื” adapters ื”ื™ื” ื™ื›ื•ืœ ืœื—ืกื•ืš ื—ืœืง ื’ื“ื•ืœ ืžื”ื›ืคื™ืœื•ืช, ื•ืื•ืœื™ ืœืขืฉื•ืช ื—ื™ื™ื ื™ื•ืชืจ ืงืœื™ื ืœืžื™ ืฉื™ื‘ื•ื ืœื‘ื ื•ืช adapter ื—ื“ืฉ. ## ืืจื’ื– ื”ื—ื•ืœ ื•ืชื™ืงื™ื™ืช ื”ื“ื•ื’ืžืื•ืช ืฉืชื™ ื”ืชื™ืงื™ื•ืช ื”ื‘ืื•ืช ื”ืŸ ื›ื‘ืจ ืœื ืกื˜ื ื“ืจื˜ื™ื•ืช ื‘ืคืจื•ื™ืงื˜ื™ ืงื•ื“ ืคืชื•ื—. ื”ืชื™ืงื™ื™ื” examples ื›ื•ืœืœืช ืงื•ื‘ืฅ ื‘ืฉื server.js, ืฉืื ืชืจื™ืฆื• ืื•ืชื• ืชืงื‘ืœื• ืฉืจืช ืฉื™ื•ื“ืข ืœื”ื’ื™ืฉ 6 ื“ื•ื’ืžืื•ืช ืฉื•ื ื•ืช (ืžืกื•ื“ืจื•ืช ื™ืคื” ื‘ืชื•ืš ืชื™ืงื™ื•ืช ื‘ืชื•ืš examples), ื›ืœ ื“ื•ื’ืžื” ืžืกืคืจืช ืžืฉื”ื• ืขืœ ืื™ืš ืœื”ืฉืชืžืฉ ื‘ axios. ืœื“ื•ื’ืžื” ื”ืงื•ื‘ืฅ examples/get/index.html ืžืจืื” ืœื ื• ืื™ืš ืœื”ืฉืชืžืฉ ื‘ axios ื›ื“ื™ ืœืงื‘ืœ ื‘ Ajax ืจืฉื™ืžืช ืคืจื™ื˜ื™ื ืžื”ืฉืจืช ื•ืœืฉืชื•ืœ ืื•ืชื” ื‘ืชื•ืš ืงื•ื‘ืฅ html:
<!doctype html>
<html>
  <head>
    <title>axios - get example</title>
    <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"/>
  </head>
  <body class="container">
    <h1>axios.get</h1>
    <ul id="people" class="list-unstyled"></ul>

    <script src="/axios.min.js"></script>
    <script>
      axios.get('/get/server')
        .then(function (response) {
          document.getElementById('people').innerHTML = response.data.map(function (person) {
            return (
              '<li class="row">' +
                '<img src="https://avatars.githubusercontent.com/u/' + person.avatar + '?s=50" class="col-md-1"/>' +
                '<div class="col-md-3">' +
                  '<strong>' + person.name + '</strong>' +
                  '<div>Github: <a href="https://github.com/' + person.github + '" target="_blank">' + person.github + '</a></div>' +
                  '<div>Twitter: <a href="https://twitter.com/' + person.twitter + '" target="_blank">' + person.twitter + '</a></div>' +
                '</div>' +
              '</li><br/>'
            );
          }).join('');
        })
        .catch(function (err) {
          document.getElementById('people').innerHTML = '<li class="text-danger">' + err.message + '</li>';
        });
    </script>
  </body>
</html>
ื”ืฉื™ืžื•ืฉ ื”ืขื™ืงืจื™ ื‘ืชื™ืงื™ื™ืช ื”ื“ื•ื’ืžืื•ืช ืœื“ืขืชื™ ื”ื™ื” ืืžื•ืจ ืœื”ื™ื•ืช ืœืืคืฉืจ ืœืื ืฉื™ื ืœืคืชื•ื— ืืช ื”ืงื•ื“ ืžืชื•ืš ืืชืจ ืขืจื™ื›ืช ืงื•ื“ ืื•ื ืœื™ื™ืŸ ื›ืžื• gitpod (ื›ื›ื” ืœืคื—ื•ืช ื”ื ืžืกืคืจื™ื ื‘ืชื™ืขื•ื“) ื•ืื– ื‘ืœื—ื™ืฆื” ืื—ืช ืืคืฉืจ ืœืจืื•ืช ืืช axios ื‘ืคืขื•ืœื” ื‘ืชื•ืš ืงื•ื‘ืฅ HTML ืขื ืงื•ื“ ืฆื“ ืฉืจืช ืœื™ื“ื”. ื‘ืžืฆื™ืื•ืช ื‘ืฉื‘ื™ืœ ืœื’ืฉืช ืœืชื™ืงื™ื™ืช ื”ื“ื•ื’ืžืื•ืช ื‘ื’ื™ื˜ืคื•ื“ ืฆืจื™ืš ืœื”ื™ื›ื ืก ืœืงื™ืฉื•ืจ ื’ื™ื˜ืคื•ื“ ืฉืœื”ื ื›ืืŸ: https://gitpod.io/#https://github.com/axios/axios/blob/master/examples/server.js ืœื—ื›ื•ืช ืฉื”ืคืจื•ื™ืงื˜ ื™ื™ื‘ื ื” ื•ืื– ืœืœื—ื•ืฅ ืขืœ ื”ื›ืคืชื•ืจ ืฉืœ ื—ืฅ-ืงื˜ืŸ-ื‘ืชื•ืš-ืจื™ื‘ื•ืข ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ืชื•ืฆืื” ื‘ื—ืœื•ืŸ ื—ื“ืฉ, ืื—ืจืช ืงื•ื‘ืฅ ื” server.js ืฉืœื”ื ืžื—ื–ื™ืจ ืฉื’ื™ืืช 404. ื‘ืชื™ืงื™ื™ืช sandbox ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืžืฆื•ื ืงื•ื‘ืฅ HTML ื•ืฉืจืช ืฉืžื’ื™ืฉ ืื•ืชื• ืฉืžืืคืฉืจ ื”ืจืฆื” ืฉืœ axios ืžืชื•ืš ื˜ื•ืคืก. ืœื“ืขืชื™ ืฉืชื™ ื”ืชื™ืงื™ื•ืช examples ื• sandbox ืœื ืžื•ืขื™ืœื•ืช ื‘ืžื™ื•ื—ื“ ื•ื”ื™ื” ืืคืฉืจ ืœื•ื•ืชืจ ืขืœื™ื”ืŸ. ## ืจืขื™ื•ื ื•ืช ืœืชืจื•ืžื•ืช ืงื•ื“ ืื ื”ื’ืขืชื ืขื“ ื›ืืŸ ื‘ืงืจื™ืื” ืืชื ื›ื‘ืจ ืžื‘ื™ื ื™ื ื“ื‘ืจ ืื• ืฉื ื™ื™ื ืขืœ ืื™ืš ืขื•ื‘ื“ืช ื”ืกืคืจื™ื” axios. ืื ื™ ืจื•ืฆื” ืœืกื™ื™ื ืืช ื”ืกืงื™ืจื” ื‘ื›ืžื” ื”ืฆืขื•ืช ืฉืืชื ื™ื›ื•ืœื™ื ืœืžืžืฉ ื‘ืฉื‘ื™ืœ ืœืœืžื•ื“ ืขื•ื“ ืขืœ ื”ืกืคืจื™ื” ื•ื‘ืกื•ืฃ ื’ื ืœืฉืคืจ ืื•ืชื”: 1. ื›ืจื’ืข ื™ืฉ ืœืืงืกื™ื•ืก adapters ืขื‘ื•ืจ XMLHttpRequest ื•ืขื‘ื•ืจ Node.JS. ื“ืคื“ืคื ื™ื ื›ื‘ืจ ื›ื•ืœืœื™ื API ื—ื“ืฉ ืฉื ืงืจื Fetch API ืฉืžืืคืฉืจ ืขื•ื“ ื›ืžื” ื™ื›ื•ืœื•ืช ื‘ื ื•ืกืฃ ืœ xhr. ืืคืฉืจ ืœื”ื•ืกื™ืฃ Adapter ืขื‘ื•ืจ Fetch API. ืชื•ืกืคืช ื›ื–ืืช ื™ื›ื•ืœื” ืœืชืช ืขื•ื“ ื™ื›ื•ืœื•ืช ืœืกืคืจื™ื”, ืœืžืฉืœ ื”ื™ื•ื ื”ืงื•ื“ ืฉืœ xhr ืœื ืชื•ืžืš ื‘ื”ื’ื‘ืœืช ืžืกืคืจ ื” Redirects ื›ืžื• ืฉืžื•ืคื™ืข ื‘ Issue ื”ื–ื”:

ToCode
1 419
axios.Axios = Axios;
ื—ื•ืฅ ืžืžื ื” ืื™ืŸ ื”ืจื‘ื” ืœื•ื’ื™ืงื” ื‘ืงื•ื‘ืฅ, ื•ืœื›ืŸ ื”ืชื—ื ื” ื”ื‘ืื” ืฉืœื™ ื”ื™ื ื”ืงื•ื‘ืฅ code/Axios ืฉื ืžื•ื’ื“ืจืช ื”ืžื—ืœืงื” Axios. ื–ื” ื›ื‘ืจ ืงื•ื‘ืฅ ื”ืจื‘ื” ื™ื•ืชืจ ืžืขื ื™ื™ืŸ ืฉื›ืžืขื˜ ืžื’ื™ืข ืœ 150 ืฉื•ืจื•ืช. ื”ืคื•ื ืงืฆื™ื” ื”ืžืจื›ื–ื™ืช ื‘ื• ื ืงืจืืช request. ื”ื™ื ืงืฆืช ืืจื•ื›ื” ืื– ืื ื™ ืžื“ื‘ื™ืง ื›ืืŸ ืจืง ืืช ื”ื—ืœืง ืฉืœื” ืฉืงืฉื•ืจ ืœืฉืœื™ื—ืช ื‘ืงืฉื”:
var chain = [dispatchRequest, undefined];

Array.prototype.unshift.apply(chain, requestInterceptorChain);
chain = chain.concat(responseInterceptorChain);

promise = Promise.resolve(config);
while (chain.length) {
  promise = promise.then(chain.shift(), chain.shift());
}

return promise;
ืื– ื™ืฉ ืคื” ืฉืœื•ืฉ ืฉื•ืจื•ืช ืจืืฉื•ื ื•ืช ืงืฆืช ืžื‘ืœื‘ืœื•ืช ื›ืฉื”ื ืžื›ื™ื ื™ื ืžืขืจืš ื‘ืฉื chain, ืื‘ืœ ืžื” ืฉื—ืฉื•ื‘ ื”ื•ื ื”ืคื•ื ืงืฆื™ื” dispatchRequest ืฉืื—ืจืื™ืช ืขืœ ืฉืœื™ื—ืช ื”ื‘ืงืฉื” ื‘ืคื•ืขืœ. ื”ื‘ืขื™ื” ืฉื”ื”ื’ื“ืจื” ืฉืœื” ืขื“ื™ื™ืŸ ืœื ื›ืืŸ. ืื ื™ ืžืžืฉื™ืš ืœืงื•ื‘ืฅ dispatchRequest.js ื‘ืื•ืชื” ืชื™ืงื™ื” ื•ื’ื ืฉื ืžื•ืฆื ืคื•ื ืงืฆื™ื” ืจืืฉื™ืช ืงืฆืช ืืจื•ื›ื” ืขื ื”ืงื•ื“ ื”ืจืืฉื™ ื”ื‘ื:
var adapter = config.adapter || defaults.adapter;

return adapter(config).then(function onAdapterResolution(response) {
  throwIfCancellationRequested(config);

  // Transform response data
  response.data = transformData.call(
    config,
    response.data,
    response.headers,
    config.transformResponse
  );

  return response;
}, function onAdapterRejection(reason) {
ืื•ืงื™ื™ ืื– ื‘ืฉื‘ื™ืœ ืœืฉืœื•ื— ื‘ืงืฉื” ืื ื—ื ื• ืคื•ื ื™ื ืœืคื•ื ืงืฆื™ื” ื‘ืฉื adapter, ืžืขื‘ื™ืจื™ื ืืช ืคืจื˜ื™ ื”ื‘ืงืฉื” ื•ืžืงื‘ื™ืœ ื‘ื—ื–ืจื” ืื•ื‘ื™ืงื˜ response ืฉื™ืžืฉื™ืš ืœืขื‘ื•ืจ ื˜ืจื ืกืคื•ืจืžืฆื™ื•ืช ืœืคื ื™ ืฉื™ื•ื—ื–ืจ ืœืงื•ื“ ืฉืงืจื ืœืืงืกื™ื•ืก. ื”ื˜ืจื ืกืคื•ืจืžืฆื™ื•ืช ื”ืŸ ื›ื ืจืื” ืคื™ืขื ื•ื— ื” JSON ื•ื“ื‘ืจื™ื ื ื•ืกืคื™ื ื‘ืกื’ื ื•ืŸ, ืื‘ืœ ืžื™ ื–ื” ื” adapter? ื‘ื’ืœืœ ืฉื”ื•ื ืžื•ื’ื“ืจ ื‘ืชื•ืš config ื•ืœื ืžื™ื•ื‘ื ืžื‘ื—ื•ืฅ ืื ื™ ืงืฆืช ืชืงื•ืข. ืœื›ืŸ ืื ื™ ืžืคืขื™ืœ ื—ื™ืคื•ืฉ ืขืœ ื›ืœ ื”ืงื‘ืฆื™ื ื‘ืชื™ืงื™ื”:
 ~/tmp/axios/lib โ•ฑ master !5 ๎‚ฐ ack -l adapter
core/README.md
core/dispatchRequest.js
core/mergeConfig.js
adapters/README.md
defaults.js
ื•ืื—ืจื™ ื—ื™ื˜ื•ื˜ ืžื”ื™ืจ ื‘ื›ื•ืœื ืžื’ื™ืข ืœ defaults.js ื•ืฉื ืœืคื•ื ืงืฆื™ื”:
function getDefaultAdapter() {
  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = require('./adapters/xhr');
  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
    // For node use HTTP adapter
    adapter = require('./adapters/http');
  }
  return adapter;
}
ืื•ืงื™ื™ ืขื›ืฉื™ื• ืื ื™ ืžื‘ื™ืŸ! ืื– ื”ื ื‘ืขืฆื ืžืกืชื›ืœื™ื ืื ืื ื™ ื‘ื“ืคื“ืคืŸ (ื›ืœื•ืžืจ ืื ื™ืฉ ืœื™ XMLHttpRequest) ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ adapter ื‘ืฉื xhr, ืฉื›ื ืจืื” ืขื•ื˜ืฃ ืืช XMLHttpRequest, ืื• ืื ืื ื™ ื‘ node ื•ืื– ื™ืœื›ื• ืขืœ adapter ื‘ืฉื http, ืฉื›ื ืจืื” ื ื•ืชืŸ ืขื˜ื™ืคื” ื“ื•ืžื” ืœืžื ื’ื ื•ืŸ ื”ืชืงืฉื•ืจืช ื”ืžื•ื‘ื ื” ืฉืœ node. ## ืชื™ืงื™ื™ืช adapters ื›ื‘ืจ ืจืื™ื ื• ืฉื‘ืชื™ืงื™ื™ืช test/unit/adapters ื™ืฉ ืงื•ื‘ืฅ ื‘ืฉื http.js ืฉื‘ื•ื“ืง ืืช ืงื•ื“ ื”ืชืงืฉื•ืจืช, ื•ืขื›ืฉื™ื• ืื ื—ื ื• ืจื•ืื™ื ืฉื™ืฉ ืœื• ื’ื ืžืงื‘ื™ืœื” ื‘ืชื™ืงื™ื™ืช ื”ืžืงื•ืจ: ื”ืงื•ื‘ืฅ lib/adapters/http.js. ืงื•ื‘ืฅ ื–ื” ืขื•ื˜ืฃ ืืช ืžื ื’ื ื•ืŸ ื”ืชืงืฉื•ืจืช ื”ืคื ื™ืžื™ ืฉืœ node ืœืžื‘ื ื” ืฉืœ Axios Adapter. ื”ื—ื‘ืจ ื”ืฉื ื™ ื‘ืชื™ืงื™ื” ื”ื•ื ื”ืงื•ื‘ืฅ xhr.js. ืœืงื•ื‘ืฅ ื–ื” ืื™ืŸ ืงื•ื‘ืฅ ื‘ื“ื™ืงื•ืช, ื•ื–ื” ื”ื’ื™ื•ื ื™. ืื ืื ื™ ืขื•ืฉื” Mocking ืœื›ืœ ืงื•ื“ ื”ืชืงืฉื•ืจืช ื‘ื“ืคื“ืคืŸ, ืื– ืื ื™ ืœื ื‘ืืžืช ื™ื›ื•ืœ ืœื‘ื“ื•ืง ืืช ื”ืงื•ื“ ืฉืื—ืจืื™ ืขืœ ื”ืชืงืฉื•ืจืช. ื–ื” ื‘ืืžืช ื”ื™ื” ื ื›ื•ืŸ ื‘ืขื‘ืจ, ืื‘ืœ ื”ื™ื•ื ื›ื‘ืจ ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ืกืคืจื™ื” ื›ืžื• Mock Service Worker ื›ื“ื™ ืœื‘ื ื•ืช ืžื™ื ื™ ืฉืจืช ื•ื•ื‘ ื‘ืชื•ืš ื”ื“ืคื“ืคืŸ ื•ืœื‘ื“ื•ืง ื—ืœืง ื’ื“ื•ืœ ืžืงื•ื“ ื”ืชืงืฉื•ืจืช. ืžื‘ื—ื™ื ืช ื”ืงื•ื“ ื‘ืงื•ื‘ืฅ lib/adapters/xhr.js ืื™ืŸ ื”ืคืชืขื•ืช ื’ื“ื•ืœื•ืช. ืื ื—ื ื• ืžื•ืฆืื™ื ื‘ืชื—ื™ืœืช ื”ืคื•ื ืงืฆื™ื” ืืช:
var request = new XMLHttpRequest();
ื•ื‘ื”ืžืฉืš ื”ื’ื“ืจืช ื›ืœ ื”ืžืืคื™ื™ื ื™ื ืฉืœ ืื•ืชื” request ืขื“ ื”ืกื™ื•ื ืขื:
request.send(requestData);
ืžื” ืฉื›ืŸ ื›ื“ืื™ ืœืฉื™ื ืœื‘ ื‘ื‘ื—ื™ืจื” ืœื‘ื ื•ืช ืฉื ื™ ืงื‘ืฆื™ื ืฉื•ื ื™ื ืขื‘ื•ืจ ื”ืชืงืฉื•ืจืช ื”ื•ื ื›ืคืœ ื”ืงื•ื“ ืฉื™ืฉ ื‘ื™ืŸ ืฉื ื™ ื”ืงื‘ืฆื™ื. ื”ืงื˜ืข ื”ื‘ื ืžื˜ืคืœ ื‘ื‘ื™ื˜ื•ืœ ื‘ืงืฉื” ื‘ืงื•ื‘ืฅ xhr.js:
    if (config.cancelToken || config.signal) {
      // Handle cancellation
      // eslint-disable-next-line func-names
      onCanceled = function(cancel) {
        if (!request) {
          return;
        }
        reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);
        request.abort();
        request = null;
      };

      config.cancelToken && config.cancelToken.subscribe(onCanceled);
      if (config.signal) {

ToCode
1 419
ืื ื™ ืžืื•ื“ ืื”ื‘ืชื™ ืืช ืกื’ื ื•ืŸ ื”ื‘ื“ื™ืงื” ื”ืžื“ื•ื™ืง - ื™ื•ืฆืจื™ื ืื•ื‘ื™ืงื˜, ืคื•ืชื—ื™ื ืฉืจืช ืฉื™ื—ื–ื™ืจ ืื•ืชื• ืขื Content-Type ืฉืœ application/json, ื•ืื– ื‘ื•ื“ืงื™ื ืฉื›ืฉื ืคื ื” ืœืื•ืชื• ืฉืจืช ื‘ืืžืช ื ืงื‘ืœ ืืช ื”ืื•ื‘ื™ืงื˜ ืžืคื•ืขื ื—. ื‘ื’ืœืœ ืฉื”ื‘ื“ื™ืงื•ืช ื”ืืœื” ืจืฆื•ืช ื‘ืฆื“ ืฉืจืช ืžืื•ื“ ืงืœ ืœื”ืจื™ื ืฉืจืช ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื›ืœ ื”ืชืงืฉื•ืจืช. ื‘ืฆื“ ื”ื“ืคื“ืคืŸ ื”ื ื™ืฆื˜ืจื›ื• ืœืขื‘ื•ื“ ืงืฆืช ื™ื•ืชืจ ืงืฉื” ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืชื•ืฆืื” ื“ื•ืžื”. ## ื‘ื“ื™ืงื•ืช ืงืืจืžื” ืชื™ืงื™ื™ืช ื”ื‘ื“ื™ืงื•ืช ื”ืฉื ื™ื”, specs, ื”ื™ื ื’ื ื”ื’ื“ื•ืœื” ื™ื•ืชืจ ื•ื›ื ืจืื” ืฉื›ืืŸ ื”ื•ืฉืงืขื• ืขื™ืงืจ ื”ืžืืžืฆื™ื ื‘ื›ืชื™ื‘ืช ื”ื‘ื“ื™ืงื•ืช. ื™ืฉ ื‘ื“ื™ืงื•ืช ืžื›ืœ ื”ืกื•ื’ื™ื ืœื“ื•ื’ืžื” ื”ืงื•ื‘ืฅ test/specs/core/buildFullPath.spec.js ื‘ื•ื“ืง ืคื•ื ืงืฆื™ื” ื˜ื”ื•ืจื” ืื—ืช ื‘ืฉื buildFullPath:
var buildFullPath = require('../../../lib/core/buildFullPath');

describe('helpers::buildFullPath', function () {
  it('should combine URLs when the requestedURL is relative', function () {
    expect(buildFullPath('https://api.github.com', '/users')).toBe('https://api.github.com/users');
  });

  it('should return the requestedURL when it is absolute', function () {
    expect(buildFullPath('https://api.github.com', 'https://api.example.com/users')).toBe('https://api.example.com/users');
  });

  it('should not combine URLs when the baseURL is not configured', function () {
    expect(buildFullPath(undefined, '/users')).toBe('/users');
  });

  it('should combine URLs when the baseURL and requestedURL are relative', function () {
    expect(buildFullPath('/api', '/users')).toBe('/api/users');
  });
});
ื›ืฉืžื’ื™ืขื™ื ืœื‘ื“ื™ืงื•ืช ื”ืชืงืฉื•ืจืช ืขืฆืžื” ื”ื‘ื“ื™ืงื” ืžืฉืชืžืฉืช ื‘ Mocks ื›ื“ื™ ืœื“ืžื•ืช ืืช ื”ืชืงืฉื•ืจืช ื•ืœื•ื•ื“ื ืฉื”ืงื•ื“ ืฉื•ืœื— ื‘ืงืฉื•ืช ื•ืžืคืขื ื— ืชืฉื•ื‘ื•ืช ื›ืžื• ืฉืฆืจื™ืš. ืœื“ื•ื’ืžื” ื”ื‘ื“ื™ืงื” ื”ื‘ืื” ืžืชื•ืš ื”ืงื•ื‘ืฅ test/specs/instance.spec.js:
beforeEach(function () {
  jasmine.Ajax.install();
});

afterEach(function () {
  jasmine.Ajax.uninstall();
});

it('should make an http request with url instead of baseURL', function (done) {
  var instance = axios.create({
    url: 'https://api.example.com'
  });

  instance('/foo');

  getAjaxRequest().then(function (request) {
    expect(request.url).toBe('/foo');
    done();
  });
});
ื”ื‘ื“ื™ืงื” ืžืฉืชืžืฉืช ื‘ืžื ื’ื ื•ืŸ ื”ืจื™ื’ื•ืœ ืฉืœ jasmine ื›ื“ื™ ืœืชืคื•ืก ื‘ืงืฉื•ืช Ajax ื•ืœื”ื—ืœื™ืฃ ืื•ืชืŸ ื‘ Mocks ืฉืืคืฉืจ ื™ื”ื™ื” ืœืชืฉืืœ. ืขื›ืฉื™ื• ื’ื ื™ื”ื™ื” ื–ืžืŸ ื˜ื•ื‘ ืœื”ืฆื™ืฅ ืœืชื™ืงื™ื™ืช lib ื›ื“ื™ ืœืจืื•ืช ืืช ืžื‘ื ื” ืชื™ืงื™ื•ืช ืงื‘ืฆื™ ื”ืžืงื•ืจ, ื•ื ื•ื›ืœ ืœืฉื™ื ืœื‘ ืฉืžื‘ื ื” ืชื™ืงื™ื™ืช ื”ื‘ื“ื™ืงื” ื“ื•ืžื” ืžืื•ื“ ืœืžื‘ื ื” ืชื™ืงื™ื™ืช ื”ืžืงื•ืจ. ื”ืชื™ืงื™ื•ืช core, cancel ื• helpers ื ืžืฆืื•ืช ืฉืœื•ืฉืชืŸ ื’ื ื‘ืชื™ืงื™ื™ืช ื”ืžืงื•ืจ ื•ื’ื ื‘ืชื™ืงื™ื™ืช ื”ื‘ื“ื™ืงื•ืช. ื’ื ืžื‘ื—ื™ื ืช ื”ืงื‘ืฆื™ื ื™ืฉ ื“ืžื™ื•ืŸ, ืœื“ื•ื’ืžื” ื”ืงื•ื‘ืฅ test/specs/defaults.spec.js ื›ื ืจืื” ื‘ื•ื“ืง ืืช ื”ืงื•ื“ ืฉื ืžืฆื ื‘ืงื•ื‘ืฅ lib/defaults.js. ื”ื”ืชืืžื” ืื™ื ื” ืื—ื“ ืœืื—ื“ ื•ื™ืฉ ื”ืจื‘ื” ืงื‘ืฆื™ ื‘ื“ื™ืงื•ืช ืฉืื™ืŸ ืœื”ืŸ ืงื•ื‘ืฅ ืžืงื•ืจ ืžืชืื™ื, ื•ื’ื ืœื”ื™ืคืš ื”ืจื‘ื” ืงื‘ืฆื™ ืžืงื•ืจ ื‘ืœื™ ืงื•ื‘ืฅ ื‘ื“ื™ืงื•ืช ืžืชืื™ื. ื”ื™ื›ื•ืœืช ืœืฉื ื•ืช ืงืฆืช ืงื•ื“ ื•ืื– ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื›ื“ื™ ืœืจืื•ืช ืฉืœื ืฉื‘ืจื ื• ื›ืœื•ื ื”ื™ื ืงืจื™ื˜ื™ืช ื‘ืคืจื•ื™ืงื˜ ืงื•ื“ ืคืชื•ื— ืฉืจื•ืฆื” ืœืงื‘ืœ ืชืจื•ืžื•ืช ืžืžืชื›ื ืชื™ื ื‘ื›ืœ ื”ืขื•ืœื. ื›ืฉืื ื™ ืžืกืชื›ืœ ืขืœ ืคืจื•ื™ืงื˜ ื›ืžื• axios ื”ื‘ื“ื™ืงื•ืช ืขื•ื–ืจื•ืช ืœื™ ืœื”ืจื’ื™ืฉ ื‘ื˜ื•ื— ืœืคื ื™ ืฉืื ื™ ืžื•ืกื™ืฃ ืคื™ืฆ'ืจ ื•ืžื™ื™ืฆืจ Pull Request, ื›ื™ ื”ืŸ ืžื•ืจื™ื“ื•ืช ืืช ื”ืกื™ื›ื•ื™ ืฉืืฉื‘ื•ืจ ืžืฉื”ื• ื‘ืœื™ ืœืฉื™ื ืœื‘. ## ืื™ืš ืืงืกื™ื•ืก ืžื•ืฆื™ื ื‘ืงืฉื•ืช http ืื ื”ื‘ื“ื™ืงื•ืช ืžื—ื•ืœืงื•ืช ืœืงื•ื“ Node.JS ื•ืงื•ื“ ื“ืคื“ืคืŸ - ื›ื ืจืื” ืฉื’ื ื”ืงื•ื“ ืขืฆืžื• ืฉืœ ืืงืกื™ื•ืก ื‘ื ื•ื™ ื›ืš. ื•ืื—ืจื™ ืฉืื ื—ื ื• ื™ื•ื“ืขื™ื ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ืื ื—ื ื• ื‘ืžืงื•ื ื˜ื•ื‘ ืœื”ื™ื›ื ืก ืœืชื™ืงื™ื™ืช lib ืขืฆืžื” ื›ื“ื™ ืœืขื ื•ืช ืขืœ ื”ืฉืืœื” ื”ื›ื™ ืžืขื ื™ื™ื ืช ืœื’ื‘ื™ ืืงืกื™ื•ืก - ืื™ืš ื”ื•ื ืฉื•ืœื— ื‘ืงืฉื•ืช? ื›ืฉืืงืกื™ื•ืก ืจืง ื ื•ืœื“ ืขื“ื™ื™ืŸ ืœื ื”ื™ื” fetch API ื‘ื“ืคื“ืคื ื™ื, ื•ื›ืฉืจืฆื™ื ื• ืœื”ื•ืฆื™ื ื‘ืงืฉื•ืช ืจืฉืช ื”ื™ื” ืฆืจื™ืš ืœื”ื›ื™ืจ ืชื—ื‘ื™ืจ ืงืฆืช ืžืกื•ืจื‘ืœ ืฉืœ XMLHttpRequest - ื”ื™ื™ืช ืฆืจื™ืš ืœื™ืฆื•ืจ ืื—ื“, ืœื”ื’ื™ื“ ืœื• ืœืืŸ ืœืœื›ืช ื•ืื™ื–ื” ืคื•ื ืงืฆื™ื” ื”ื•ื ืฆืจื™ืš ืœื”ืคืขื™ืœ ื›ืฉื™ืกื™ื™ื ื•ืœืฉืœื•ื— ืื•ืชื• ืœื“ืจื›ื•. ืจื•ื‘ ื”ืžืชื›ื ืชื™ื ื”ืฉืชืžืฉื• ื‘ jQuery ื›ื“ื™ ืœืขื˜ื•ืฃ ืืช XMLHttpRequest ื‘ืชื—ื‘ื™ืจ ื™ื•ืชืจ ื™ื“ื™ื“ื•ืชื™, ื•ื‘ืขืฆื ื›ืฉืžืื˜ ื–ื‘ืจื™ื ืกืงื™ ื ื›ื ืก ืœืกืฆื™ื ื” ื”ื•ื ืžื‘ื™ืŸ ืฉืื ืืชื” ืžืฉืชืžืฉ ื‘ืจื™ืืงื˜ ืื– ืืชื” ืœื ืฆืจื™ืš jQuery, ื•ืื ืฉื™ื ื”ืฉืื™ืจื• ืืช jQuery ืจืง ื‘ืฉื‘ื™ืœ ืื•ืชื” ืขื˜ื™ืคื” ืงื˜ื ื” ืœ XMLHttpRequest. ื‘ืขืฆื ื‘ jQuery ื™ื›ื•ืœืช ืœื›ืชื•ื‘:
$.get('/some/url', function(data) {
    console.log(data);
});
ื•ื–ื” ืคืฉื•ื˜ ืขื‘ื“ ื•ืคื ื” ืœ /some/url, ื”ื‘ื™ื ืžืžื ื• ืžื™ื“ืข ื‘ื“ืจืš ื›ืœืœ ื‘ืฆื•ืจืช JSON ื•ืื– ื”ืžืฉื™ืš ืœื‘ืฆืข ืืช ื”ืคื•ื ืงืฆื™ื” ื‘ืคืจืžื˜ืจ ื”ืฉื ื™ ืขื ื”ืžื™ื“ืข ืฉืงื™ื‘ืœ. ื ืชื—ื™ืœ ืืช ื”ืžืกืœื•ืœ ืฉืœื ื• ื‘ืืงืกื™ื•ืก ื‘ืงื•ื‘ืฅ ื”ืจืืฉื™ ืฉืœ ื”ืกืคืจื™ื” lib/axios.js ื•ืฉื ืื ื™ ืžื•ืฆื ืืช ื”ืฉื•ืจื”:
// Expose Axios class to allow class inheritance

ToCode
1 419
ื›ืœื•ืžืจ ืžื•ืงื” ืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื‘ืชื™ืงื™ื™ืช test/unit ื•ืงืืจืžื” ืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื‘ืชื™ืงื™ื™ืช test/specs. ืงืืจืžื” ืžืฉืชืžืฉ ื‘ื“ืคื“ืคื ื™ื ื•ืœื›ืŸ ื‘ื•ื“ืง ืืช ื”ื—ืœืง ืฉืœ ื”ื“ืคื“ืคืŸ ื‘ืงื•ื“ ืฉืœ ืืงืกื™ื•ืก, ื•ืžื•ืงื” ืจืฅ ื‘ืชื•ืš node.js ื•ืœื›ืŸ ื‘ื•ื“ืง ืืช ื”ื”ืจืฆื•ืช ืžืชื•ืš ื™ื™ืฉื•ื node. ืœืคื ื™ ื”ื›ื ื™ืกื” ืœืชื™ืงื™ื•ืช ื”ื‘ื“ื™ืงื•ืช ื ื ืกื” ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ื›ื“ื™ ืœืจืื•ืช ืื ื”ื—ืฉืฉ ืฉืœื™ ืž dist ื”ื™ื” ืžื•ืฆื“ืง. ืื ื™ ืžืคืขื™ืœ:
$ npm run build


> axios@0.25.0 build
> NODE_ENV=production grunt build

Running "clean:dist" (clean) task
>> 5 paths cleaned.

Running "webpack" task
Hash: d004b5ae618258baef57
Version: webpack 4.46.0 / grunt-webpack 4.0.3
Time: 275ms
Built at: 01/28/2022 10:40:45 AM
    Asset      Size  Chunks                   Chunk Names
 axios.js  62.3 KiB    main  [emitted]        main
axios.map  67.6 KiB    main  [emitted] [dev]  main
Entrypoint main = axios.js axios.map
[./index.js] 40 bytes {main} [built]
[./lib/adapters/xhr.js] 6.79 KiB {main} [built]
[./lib/axios.js] 1.52 KiB {main} [built]
[./lib/cancel/Cancel.js] 385 bytes {main} [built]
[./lib/cancel/CancelToken.js] 2.41 KiB {main} [built]
[./lib/cancel/isCancel.js] 102 bytes {main} [built]
[./lib/core/Axios.js] 4.14 KiB {main} [built]
[./lib/core/InterceptorManager.js] 1.33 KiB {main} [built]
[./lib/core/mergeConfig.js] 3.12 KiB {main} [built]
[./lib/defaults.js] 3.5 KiB {main} [built]
[./lib/env/data.js] 43 bytes {main} [built]
[./lib/helpers/bind.js] 256 bytes {main} [built]
[./lib/helpers/isAxiosError.js] 373 bytes {main} [built]
[./lib/helpers/spread.js] 564 bytes {main} [built]
[./lib/utils.js] 8.65 KiB {main} [built]
    + 14 hidden modules
Hash: 298941b4c4e5b7c2fd49
Version: webpack 4.46.0 / grunt-webpack 4.0.3
Time: 196ms
Built at: 01/28/2022 10:40:45 AM
        Asset      Size  Chunks                   Chunk Names
 axios.min.js  17.3 KiB       0  [emitted]        main
axios.min.map  79.3 KiB       0  [emitted] [dev]  main
Entrypoint main = axios.min.js axios.min.map
 [0] ./lib/utils.js 8.65 KiB {0} [built]
 [1] ./lib/defaults.js 3.5 KiB {0} [built]
 [2] ./lib/cancel/Cancel.js 385 bytes {0} [built]
 [3] ./lib/helpers/bind.js 256 bytes {0} [built]
 [4] ./lib/helpers/buildURL.js 1.61 KiB {0} [built]
 [5] ./lib/core/enhanceError.js 1.11 KiB {0} [built]
 [8] ./lib/cancel/isCancel.js 102 bytes {0} [built]
 [9] ./lib/core/mergeConfig.js 3.12 KiB {0} [built]
[10] ./lib/env/data.js 43 bytes {0} [built]
[11] ./index.js 40 bytes {0} [built]
[12] ./lib/axios.js 1.52 KiB {0} [built]
[13] ./lib/core/Axios.js 4.14 KiB {0} [built]
[26] ./lib/cancel/CancelToken.js 2.41 KiB {0} [built]
[27] ./lib/helpers/spread.js 564 bytes {0} [built]
[28] ./lib/helpers/isAxiosError.js 373 bytes {0} [built]
    + 14 hidden modules

Done.
ืขื•ืฉื” ืจื•ืฉื ืฉื–ื” ื”ืฆืœื™ื—. ื•ืขื›ืฉื™ื• ื ืฉื•ื•ื” ืขื ืžื” ืฉืฉืžื•ืจ ื‘ื’ื™ื˜:
 ~/tmp/axios โ•ฑ master !5 ๎‚ฐ PAGER=cat git diff --name-only -- dist
dist/axios.js
dist/axios.map
dist/axios.min.js
dist/axios.min.map
ื•ืื ื—ื ื• ืžื’ื™ืขื™ื ืœื‘ืขื™ื” ื”ืจืืฉื•ื ื” ืขื ืžื‘ื ื” ื”ืชื™ืงื™ื•ืช: ืื ืฉืžื™ื ื‘ืจื™ืคื• ืชื™ืงื™ื™ืช dist ื”ื™ื ื—ื™ื™ื‘ืช ืœื”ืชืื™ื ืœืžื” ืฉืื ื™ ืืงื‘ืœ ืžื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜. ## ื‘ื“ื™ืงื•ืช ืžื•ืงื” ื ืžืฉื™ืš ืœืชื™ืงื™ื•ืช ื”ื‘ื“ื™ืงื•ืช ื•ืชื™ืงื™ื™ืช ื”ื‘ื“ื™ืงื•ืช ื”ืจืืฉื•ื ื” ืฉืื ื™ ืจื•ืฆื” ืœืงืจื•ื ื”ื™ื ื”ืชื™ืงื™ื” test/unit. ืื ื™ ื›ื‘ืจ ื™ื•ื“ืข ืฉืืœื” ื‘ื“ื™ืงื•ืช ืฉืจืฆื•ืช ื‘ืชื•ืš node.js ื‘ืœื‘ื“ ื‘ืืžืฆืขื•ืช ืžื•ืงื”. ื”ืงื•ื‘ืฅ ื”ืžืจื›ื–ื™ ื›ืืŸ ื”ื•ื unit/adapters/http.js, ืงื•ื‘ืฅ ืฉื›ื•ืœืœ ืžืขืœ ืืœืฃ ืฉื•ืจื•ืช ืฉืœ ื‘ื“ื™ืงื•ืช. ื”ื ื” ื‘ื“ื™ืงื” ืื—ืช ืœื“ื•ื’ืžื” ืžืžื ื•:
  it('should allow passing JSON', function (done) {
    var data = {
      firstName: 'Fred',
      lastName: 'Flintstone',
      emailAddr: 'fred@example.com'
    };

    server = http.createServer(function (req, res) {
      res.setHeader('Content-Type', 'application/json');
      res.end(JSON.stringify(data));
    }).listen(4444, function () {
      axios.get('http://localhost:4444/').then(function (res) {
        assert.deepEqual(res.data, data);
        done();
      });
    });
  });

ToCode
1 419
# ืงืจื™ืื” ืžื•ื“ืจื›ืช ื‘ืงื•ื“ ืฉืœ Axios ืืงืกื™ื•ืก ื”ื—ืœื” ื›ืคืจื•ื™ืงื˜ ืฆื“ ืฉืœ ืžืชื›ื ืช ื‘ืฉื ืžืื˜ ื–ื‘ืจื™ืกืงื™. ื”ื•ื ื‘ื“ื™ื•ืง ื’ื™ืœื” ืืช ืจื™ืืงื˜ ื•ืžืื•ื“ ื”ืชืœื”ื‘ ื•ืื– ื‘ืื™ื–ื” ืขืจื‘ ืื—ืจื™ ื›ื ืก JavaScript ื”ื•ื ื ืฉืืจ ื‘ืžืœื•ืŸ ื•ื”ืชื—ื™ืœ ืœื›ืชื•ื‘ ืกืคืจื™ื™ืช http ืœืจื™ืืงื˜. ืžื”ืจ ืžืื•ื“ ื”ื•ื ื”ื‘ื™ืŸ ืฉื”ืกืคืจื™ื” ืฉืœื• ืœื ื‘ืืžืช ืงืฉื•ืจื” ืจืง ืœืจื™ืืงื˜ ื• axios ื”ืคื›ื” ืœืกืคืจื™ื™ืช ืชืงืฉื•ืจืช ื’ื ืจื™ืช ืœื“ืคื“ืคื ื™ื ื•ืœ Node.JS. ื”ื™ื•ื ืžืื˜ ื›ื‘ืจ ื›ืžื” ืฉื ื™ื ืขื•ื‘ื“ ื‘ืืคืœ ื•ืžื™ ืฉืžืชื—ื–ืง ืืช Axios ื”ื•ื ืžืชื›ื ืช ืื—ืจ ื‘ืฉื ื’'ื™ื™ืกื•ืŸ ืกื™ื™ืžืŸ. ืืงืกื™ื•ืก ืžืงื‘ืœ ืชืจื•ืžื•ืช ืงื•ื“ ืžืžืื•ืช ืžืชื›ื ืชื™ื ื‘ืขื•ืœื ื•ืขื•ืžื“ ืขืœ ืžืขืœ 24 ืžื™ืœื™ื•ืŸ ื”ื•ืจื“ื•ืช ื‘ืฉื‘ื•ืข ื‘ npm. ื‘ืคื•ืกื˜ ื”ื™ื•ื ืืกืชื›ืœ ืขืœ ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื•ืžื‘ื ื” ื”ืคืจื•ื™ืงื˜ ื•ื’ื ืื—ืฉื•ื‘ ืขืœ ืจืขื™ื•ื ื•ืช ืœืชืจื•ืžื•ืช ืงื•ื“ ืืคืฉืจื™ื•ืช. ## ืžื‘ื ื” ื”ืชื™ืงื™ื•ืช ื›ืœ ื”ืงื•ื“ ืฉืœ ื”ืคืจื•ื™ืงื˜ ื™ื•ืฉื‘ ื‘ืชื™ืงื™ื” ื‘ืฉื lib, ืื‘ืœ ืœืคื ื™ ืฉื ื™ื›ื ืก ืืœื™ื” ืžืขื ื™ื™ืŸ ืœืจืื•ืช ืžื” ื™ืฉ ื‘ื›ืœ ื”ืชื™ืงื™ื•ืช ื”ืื—ืจื•ืช ื‘ืจื™ืคื•: 1. ื”ืกืคืจื™ื” ื”ืจืืฉื•ื ื” ืฉืงื•ืคืฆืช ืžื•ืœ ื”ืขื™ื ื™ื™ื ื”ื™ื test. ืื ื™ ืื•ื”ื‘ ืคืจื•ื™ืงื˜ื™ื ืขื ื‘ื“ื™ืงื•ืช ื›ื™ ื”ื‘ื“ื™ืงื•ืช ื”ืŸ ืฆืขื“ ื‘ื™ื ื™ื™ื ื‘ื™ืŸ ื”ืชื™ืขื•ื“ ืœืงื•ื“ ืขืฆืžื•. ื”ืŸ ื’ื ืžืกืคืจื•ืช ืœื ืžืขื˜ ืขืœ ื”ืงื•ื“, ื•ื’ื ืžืืคืฉืจื•ืช ืœื”ืจื™ืฅ ืืช ื”ืงื•ื“ ื‘ืกื‘ื™ื‘ื” ืžื‘ื•ืงืจืช. 2. ืœืืงืกื™ื•ืก, ื—ื•ืฅ ืžืชื™ืงื™ื™ืช ื”ื‘ื“ื™ืงื•ืช ื”ืจื’ื™ืœื” test ื™ืฉ ืขื•ื“ ืฉืชื™ ืชื™ืงื™ื•ืช ื‘ืฉื sandbox ื• examples. ืžื™ืฉื”ื• ืžืื•ื“ ื”ืชืืžืฅ ืœืขืฉื•ืช ื—ื™ื™ื ืงืœื™ื ืœืžืชื›ื ืชื™ื ืื—ืจื™ื ืฉืจื•ืฆื™ื ืœื”ืฆื˜ืจืฃ ื•ืœืฉื—ืง ืขื ื”ืงื•ื“ - ื•ื–ื” ืขื•ื“ ืกื™ืžืŸ ื˜ื•ื‘. 3. ื”ืกืคืจื™ื” dist ืงืฆืช ืžื˜ืจื™ื“ื”. ืื ื—ื ื• ืžืกืชื›ืœื™ื ืขืœ ืจื™ืคื• ืฉืœ ืงื•ื“ ืžืงื•ืจ, ื• dist ืžื›ื™ืœื” ืชื•ืฆืื” ืฉืœ ื‘ื ื™ื”. ืœืžื” ืฆืจื™ืš ื’ื ืืช dist ืฉื? ืœืžื” ืœื ืœืชืช ืœืื ืฉื™ื ืœื‘ื ื•ืช ืœื‘ื“? ื•ืžื” ืื ืื ื™ ืื‘ื ื” ื•ื”ืชื•ืฆืื” ืœื ืชื”ื™ื” ื–ื”ื” ืœืžื” ืฉืฉืžื•ืจ ื‘ dist? ืœืžื” ืœื ืœื‘ื ื•ืช ืขื Github Action ื•ืœื”ืขืœื•ืช ืืช ื”ืชื•ืฆืื” ืœ Release ื‘ื’ื™ื˜ื”ืื‘? 4. ื”ืชื™ืงื™ื” ื”ื ืกืชืจืช .github ื›ื•ืœืœืช ืงื‘ืฆื™ื ืœืื™ื ื˜ืจืงืฆื™ื” ืขื ื’ื™ื˜ื”ืื‘. ื™ืฉ ืฉื ืชื‘ื ื™ืช ืœืคืชื™ื—ืช Issue ื•ื™ื•ืชืจ ืžืขื ื™ื™ืŸ ื”ืงื•ื‘ืฅ .github/workflows/ci.yml ืฉืžื›ื™ืœ ืืช ื”ื”ื•ืจืื•ืช ืœ Github Action ืฉืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช. ืื—ืจื™ ืกืงื™ืจืช ืขืฅ ื”ืชื™ืงื™ื•ืช ื”ืฆืขื“ ื”ืžืชื‘ืงืฉ ื”ื‘ื ื”ื•ื ืœื ืกื•ืช ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ืœื ืกื•ืช ืœื‘ื ื•ืช ืืช ื”ืคืจื•ื™ืงื˜ ื›ื“ื™ ืœืจืื•ืช ืงื•ื“ื ื›ืœ ืฉื›ืœ ื”ื‘ื“ื™ืงื•ืช ืขื•ื‘ืจื•ืช ื•ืฉื”ื‘ื ื™ื” ืฉืœ ื’ื™ืจืกื” ื ืงื™ื” ืžื’ื™ื˜ื”ืื‘ ืชื™ื™ืฆืจ ื‘ื“ื™ื•ืง ืืช ืžื” ืฉื›ื‘ืจ ืงื™ื™ื ื‘ืชื™ืงื™ื™ืช dist. ืื ื™ ืžืคืขื™ืœ:
$ npm install
ื›ื“ื™ ืœื”ืชืงื™ืŸ ืืช ื›ืœ ื”ืชืœื•ื™ื•ืช, ื•ืคื•ืชื— ืืช package.json ื›ื“ื™ ืœืจืื•ืช ืื™ื–ื” ืกืงืจื™ืคื˜ื™ื ืžื—ื›ื™ื ืฉื:
"scripts": {
  "test": "grunt test && dtslint",
  "start": "node ./sandbox/server.js",
  "build": "NODE_ENV=production grunt build",
  "preversion": "grunt version && npm test",
  "version": "npm run build && git add -A dist && git add CHANGELOG.md bower.json package.json",
  "postversion": "git push && git push --tags",
  "examples": "node ./examples/server.js",
  "coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
  "fix": "eslint --fix lib/**/*.js"
},
ื•ืฉื•ื‘ ืื ื™ ืจื•ืื” ืฉื”ืคืจื•ื™ืงื˜ ืžืื•ื“ ื™ื“ื™ื“ื•ืชื™ ืœืžืชื›ื ืชื™ื ื—ื“ืฉื™ื. ื ื›ื•ืŸ ื”ื ืžืฉืชืžืฉื™ื ื‘ grunt ืื‘ืœ ืื•ืœื™ ื ืฆืœื™ื— ืœื”ืชื—ืžืง ืžืงืจื™ืืช ื” Gruntfile. ื”ืจืฆืช ื”ื‘ื“ื™ืงื•ืช ืขื:
$ npm run test
ืขื•ื‘ื“ืช ื•ืื ื™ ืฉื ืœื‘ ืฉืžืจื™ืฆื” ืฉื ื™ ืกื•ื’ื™ื ืฉืœ ื‘ื“ื™ืงื•ืช - ื”ื‘ืœื•ืง ื”ืจืืฉื•ืŸ ื”ื•ื ื‘ืœื•ืง ืฉืœ ื‘ื“ื™ืงื•ืช mocha ืฉืจืฆื•ืช ื‘ืชื•ืš node.js, ื•ื”ื‘ืœื•ืง ื”ืฉื ื™ ื”ื•ื ื‘ืœื•ืง ืฉืœ ื‘ื“ื™ืงื•ืช karma ืฉืจืฆื•ืช ื‘ืชื•ืš ื“ืคื“ืคื ื™ื. ื”ื•ื ืืคื™ืœื• ื›ื•ืชื‘ ืœื™ ืื™ื–ื” ื“ืคื“ืคื ื™ื ื”ื•ื ื”ืจื™ืฅ:
28 01 2022 10:34:29.443:INFO [karma-server]: Karma v6.3.11 server started at http://localhost:9876/
28 01 2022 10:34:29.444:INFO [launcher]: Launching browsers FirefoxHeadless, ChromeHeadless with concurrency unlimited
ื•ื”ื ื” ื”ืจื’ืข ืฉื—ืฉืฉืชื™ ืžืžื ื• - ื‘ื’ืœืœ ืฉื™ืฉ ืฉื ื™ ืกื•ื’ื™ ื‘ื“ื™ืงื•ืช ื•ืฉื ื™ ื›ืœื™ื ืฉื•ื ื™ื ืฉืžืจื™ืฆื™ื ืื•ืชืŸ, ื•ืื ื™ ืจื•ืฆื” ืœื“ืขืช ืื™ื–ื” ื‘ื“ื™ืงื•ืช ืงืฉื•ืจื•ืช ืœืื™ื–ื” ื›ืœื™, ืื ื™ ื ืืœืฅ ืœืคืชื•ื— ืืช ื” Gruntfile. ื”ื‘ืœื•ืง ืฉืžืขื ื™ื™ืŸ ืื•ืชื ื• ืžืžื ื• ื”ื•ื:

    karma: {
      options: {
        configFile: 'karma.conf.js'
      },
      single: {
        singleRun: true
      },
      continuous: {
        singleRun: false
      }
    },

    mochaTest: {
      test: {
        src: ['test/unit/**/*.js']
      },
      options: {
        timeout: 30000
      }
    },
ืื•ืงื™ื™ ืื– ืžื•ืงื” ืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื‘ืชื™ืงื™ื™ืช test/unit ื•ืงืืจืžื” ืžืจื™ืฅ ... ืื” ื™ืฉ ืœื• ื’ื ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืžืฉืœื•. ื ืžืฉื™ืš ืœืคืชื•ื— ืืช karma.conf.js ื•ืฉื ื ืžืฆื ืืช ื”ื‘ืœื•ืง:
    preprocessors: {
      'test/specs/__helpers.js': ['webpack', 'sourcemap'],
      'test/specs/**/*.spec.js': ['webpack', 'sourcemap']
    },

ToCode
1 419
# ื›ืœ ื”ื‘ื“ื™ืงื•ืช ืฉื‘ืขื•ืœื ืื ื›ืชื‘ืช ืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜ ื•ืงื•ื‘ืฅ ื‘ื“ื™ืงื•ืช ืขื‘ื•ืจื”, ื•ืขื“ื™ื™ืŸ ื™ืฉ ื‘ืื’ื™ื, ื–ื” ืื•ืžืจ ืฉ- 1. ืœื ื›ืชื‘ืช ื‘ื“ื™ืงื•ืช ืžืกืคื™ืง ื˜ื•ื‘ื•ืช? 2. ืœื ื›ืชื‘ืช ืžืกืคื™ืง ื‘ื“ื™ืงื•ืช? 3. ื™ืฉ ื‘ืื’ื™ื ืฉื‘ื“ื™ืงื•ืช ืœื ื™ื›ื•ืœื•ืช ืœืืชืจ? 4. ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ืœื ืฉื•ื•ื” ืืช ื”ื–ืžืŸ ืฉืœืš? ืืฃ ืชืฉื•ื‘ื” ื›ืืŸ ื”ื™ื ืœื ืืžืช ืžื•ื—ืœื˜ืช. ืืœื” ื‘ืกืš ื”ื›ืœ 4 ื’ื™ืฉื•ืช. ืžื™ ืฉื‘ื•ื—ืจ ื‘ื’ื™ืฉื” ื”ืจืืฉื•ื ื” ื™ืžืฉื™ืš ืœืฉืคืจ ืืช ื”ื‘ื“ื™ืงื•ืช ืขื ื›ืœ ื‘ืื’ ืขื“ ืฉื™ืœืžื“ ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช ื˜ื•ื‘ื•ืช ื™ื•ืชืจ; ืžื™ ืฉื‘ื•ื—ืจ ื‘ื’ื™ืฉื” ื”ืฉื ื™ื” ื›ื•ืชื‘ ืขื•ื“ ื•ืขื•ื“ ื‘ื“ื™ืงื•ืช ืขื“ ืฉื™ืฆืœื™ื— ืœืชืคื•ืก ืืช ื›ืœ ื”ืžืงืจื™ื; ืžื™ ืฉืœื•ืงื— ืืช ื”ื’ื™ืฉื” ื”ืฉืœื™ืฉื™ืช ื™ืขื‘ื•ืจ ืžื”ืจ ืžื‘ื“ื™ืงื” ื‘ jest ืœื‘ื“ื™ืงื” ื‘ื“ืคื“ืคืŸ ืืžื™ืชื™ ืื• ืืคื™ืœื• ื‘ืคืจื•ื“ืงืฉืŸ; ื•ืžื™ ืฉื‘ื•ื—ืจ ืืช ื”ื’ื™ืฉื” ื”ืจื‘ื™ืขื™ืช ื›ืžืขื˜ ื•ืœื ื™ืฉืงื™ืข ืžืจืืฉ ื–ืžืŸ ื‘ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ืื• ื‘ื‘ื ื™ื™ืช ื”ืชืฉืชื™ืช. ื•ื›ืŸ, ืื ื”ืชืฉื•ื‘ื” ืฉืœื›ื ืœื ืžื•ื‘ื™ืœื” ืœื›ืชื™ื‘ืช ื”ืงื•ื“ ืฉืืชื ืจื•ืฆื™ื ืžื•ืชืจ ืœื ืกื•ืช ื’ื ื’ื™ืฉื” ืื—ืจืช.

ToCode
1 419
# ื”ื™ื•ื ืœืžื“ืชื™: ืžืฉืชื ื™ื ื’ืœื•ื‘ืืœื™ื™ื ื‘ node.js ืคื™ืฆ'ืจ ืฉืืฃ ืคืขื ืœื ื—ืฉื‘ืชื™ ืฉืืฆื˜ืจืš ื‘ Node.JS ื”ื•ื ื”ืžืฉืชื ื” ื”ืžื™ื•ื—ื“ global. ื›ืžื• window ื‘ื“ืคื“ืคืŸ, global ื”ื•ื ื”ืื•ื‘ื™ืงื˜ ืฉ node ื”ื•ืœืš ืืœื™ื• ื›ืฉืคื ื™ืชื ืœืžืฉืชื ื” ืื‘ืœ node ืœื ืžืฆืœื™ื— ืœืžืฆื•ื ืืช ื”ืžืฉืชื ื” ื”ื–ื” ื‘ืฉื•ื ืžืงื•ื. ืขืœ global ืื ื—ื ื• ื ื•ื›ืœ ืœืžืฆื•ื ืืช ื”ื“ื‘ืจื™ื ื”ื’ืœื•ื‘ืืœื™ื™ื ืฉืœ ื ื•ื“ ื›ืžื• setTimeout, clearTimeout ื•ื›ืžื•ื‘ืŸ ื’ื ืืช global ืขืฆืžื•. ื‘ืขื–ืจืช global ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืฉืชื•ืœ ืžืฉืชื ื” ื’ืœื•ื‘ืืœื™ ื‘ืงื•ื‘ืฅ ืื—ืจ. ืœื“ื•ื’ืžื” ื ื ื™ื— ืฉื™ืฉ ืœื™ ืงื•ื‘ืฅ ื‘ืฉื b.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
console.log(foo);
ืื– ื‘ืจื•ืจ ืฉืื ื ื ืกื” ืœื”ืจื™ืฅ ื™ืฉื™ืจื•ืช ืืช b.js ื ืงื‘ืœ ืฉื’ื™ืื” ื›ื™ foo ืื™ื ื• ืžืฉืชื ื” ืžื•ื’ื“ืจ. ืื‘ืœ ื‘ืžืงื•ื ืœื”ืจื™ืฅ ืืช b.js ืื ื™ ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื a.js ืœื“ื•ื’ืžื” ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
global.foo = 10;
const b = require('./b.js');
ื•ืขื›ืฉื™ื• ื›ืฉืื ื™ ืžืจื™ืฅ ืืช a.js ื”ื•ื ื™ื˜ืขืŸ ืืช b.js ื• b ื›ื‘ืจ ื™ืžืฆื ืืช ื”ืžืฉืชื ื” foo ื›ื™ ื”ื•ื ื”ื•ื’ื“ืจ ืขืœ global ื‘ืงื•ื‘ืฅ a. ื .ื‘. ืžืชื™ ื ืจืฆื” ืœื”ืฉืชืžืฉ ื‘ global ืืชื ืฉื•ืืœื™ื? ื‘ื’ื“ื•ืœ ืืฃ ืคืขื. ื‘ืงื˜ืŸ ื“ืžื™ื™ื ื• ืฉืืชื ืฆืจื™ื›ื™ื ืœื”ืจื™ืฅ ื‘ื“ื™ืงื•ืช ืขื react-testing-library ื‘ืชื•ืš ืกื‘ื™ื‘ืช node.js, ืœืžืฉืœ ื‘ jest ืื• mocha. ื“ืžื™ื™ื ื• ื’ื ืฉื”ื™ื™ืฉื•ื ืฉืœื›ื ื˜ื•ืขืŸ ืื™ื–ื” ืงื•ื‘ืฅ ืฉืžื•ืชืื ืœืจื™ืฆื” ื‘ื“ืคื“ืคืŸ ื›ื™ ื”ื•ื ืžืฉืชืžืฉ ื‘ืื™ื–ืฉื”ื• ืื•ื‘ื™ืงื˜ ื’ืœื•ื‘ืืœื™ ื›ืžื• window, fetch ืื• IntersectionObserver (ื›ืŸ ื™ืฉ ื“ื‘ืจ ื›ื–ื”). ืขื›ืฉื™ื• ื‘ืฉื‘ื™ืœ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื” ืขืœ ื”ื™ื™ืฉื•ื ืฉืœื›ื ืืชื ืฆืจื™ื›ื™ื ืฉืื•ืชื• ืงื•ื‘ืฅ ื™ืฆืœื™ื— ืœืžืฆื•ื ืืช ื” window ืื• ื” fetch ื”ื’ืœื•ื‘ืืœื™ื™ื. ื”ืกืคืจื™ื” node-window-polyfill ืžืกืคืงืช ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ ื›ื–ื” ื‘ global ื›ื“ื™ ืœื™ื™ืฆืจ ืžืฉืชื ื” window ืฉื›ื•ืœื ื™ื›ื™ืจื•. ื”ื ื” ืกื ื™ืคื˜ ืžืžื ื” ืฉืžืžื—ื™ืฉ ืืช ื”ื ืงื•ื“ื”:
var globalObject = global;

var registerWindow = function () {
    globalObject.window = globalObject.window || {};
    exports.registerWindowProperties();
};
ืื—ืจื™ import ืœืกืคืจื™ื” ื–ื• ืืคืฉืจ ืœื”ืชื—ื™ืœ ืœื˜ืขื•ืŸ ืงื‘ืฆื™ ืงื•ื“ ืฉื ื›ืชื‘ื• ืœื“ืคื“ืคืŸ ื•ืžื—ืคืฉื™ื ืื•ื‘ื™ืงื˜ window, ื›ื™ ื”ื ื™ืžืฆืื• ืืช ื”ืื•ื‘ื™ืงื˜ ืขื ื›ืœ ื”ืžืืคื™ื™ื ื™ื ืฉื”ื ืฆื™ืคื• ืœื”ื.

ToCode
1 419
# ืฉื ื™ ืฉื™ืžื•ืฉื™ื ื”ื’ื™ื•ื ื™ื™ื ืœ git stash ื”ืจื‘ื” ื–ืžืŸ ืœื ื”ื‘ื ืชื™ ืืช git stash. ื”ืจื™ ืœืžื” ืœื–ืจื•ืง ืืช ื›ืœ ื”ืฉื™ื ื•ื™ื™ื ืฉืœื™ ืœ stash ื›ืฉืื ื™ ื™ื›ื•ืœ ืœืขืฉื•ืช ืœื”ื ืงื•ืžื™ื˜ ืœ branch ื–ืžื ื™ ื—ื“ืฉ? ืžื” ืื ื™ ืžืจื•ื•ื™ื— ืžืœืฉื™ื ืื•ืชื ื‘ืžืงื•ื ืฉื‘ื• ืจืง ื™ื”ื™ื” ืœื™ ื™ื•ืชืจ ืงืฉื” ืœืžืฆื•ื ืื•ืชื? ืื– ืื ื’ื ืืชื ืœื ืžื”ืžืฉืชืžืฉื™ื ื”ื›ื‘ื“ื™ื ืฉืœ ื’ื™ื˜ ืกื˜ืืฉ ื”ื ื” ืฉื ื™ ืžืฆื‘ื™ื ืฉื‘ื”ื ื›ืŸ ื›ื“ืื™ ืœื”ื›ื™ืจ ืื•ืชื• ื•ืœื”ืฉืชืžืฉ ื‘ื•- ## ืื ื‘ืคืจื•ื™ืงื˜ ืžื•ื’ื“ืจ commit hook ืื ื™ ื™ื•ื“ืข, ืงื•ืžื™ื˜ ื”ื•ืงืก ื”ื ื—ืฉื•ื‘ื™ื ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืงื•ื“ ืขื•ื‘ื“ ื›ืžื• ืฉืฆืจื™ืš ืื• ื›ืœ ืžื™ื ื™ ื“ื‘ืจื™ื ื›ืืœื”, ืื‘ืœ ืœืคืขืžื™ื ื”ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžืื•ื“ ืžืฆื™ืงื™ื - ืœืžืฉืœ ืื ื™ืฉ ืœื™ ืงื•ืžื™ื˜ ื”ื•ืง ืฉืžื•ื•ื“ื ืฉื”ืงื•ื“ ืขื•ื‘ืจ eslint, ื•ืืฆืœื™ ื”ืงื•ื“ ืขื“ื™ื™ืŸ ืœื ืขื•ื‘ืจ eslint ืื‘ืœ ื‘ื›ืœ ื–ืืช ืฆืจื™ืš ืœืฉื™ื ืื•ืชื• ื‘ืฆื“, ืื– ืื ื™ ื›ื‘ืจ ืœื ื™ื›ื•ืœ ืœืขืฉื•ืช ืงื•ืžื™ื˜ ืœ branch ื–ืžื ื™ ื•ืœืœื›ืช ืœืขืฉื•ืช ื“ื‘ืจื™ื ืื—ืจื™ื ื›ื™ ื” commit hook ื™ื—ืกื•ื ืื•ืชื™. ื‘ืžืฆื‘ื™ื ื›ืืœื” stash ื”ื•ื ืคื™ืชืจื•ืŸ ืžืขื•ืœื” ื›ื™ ื”ื•ื ืžื“ืœื’ ืขืœ pre-commit hook. ืื ื—ื ื• ื–ื•ืจืงื™ื ืืช ื”ืฉื™ื ื•ื™ื™ื ืœ stash ืขื:
$ git stash -u
ืžืงื‘ืœื™ื ืชื™ืงื™ื™ืช ืขื‘ื•ื“ื” ื ืงื™ื”, ื™ื›ื•ืœื™ื ืœืชืงืŸ ื‘ืื’ ืื• ืœืขื‘ื•ื“ ืขืœ ืคื™ืฆ'ืจ ืื—ืจ, ื•ื›ืฉืจื•ืฆื™ื ืœื—ื–ื•ืจ ืœืื™ืคื” ืฉื”ื™ื™ื ื• ืžืคืขื™ืœื™ื:
$ git stash pop --index
ื”ืžืชื’ -u ื’ื•ืจื ืœืฉืœื™ื—ืช ื›ืœ ื”ืงื‘ืฆื™ื ืœ stash ื›ื•ืœืœ ืืœื” ืฉืขื“ื™ื™ืŸ ืœื ื”ืชื•ื•ืกืคื• ืœื’ื™ื˜, ื•ื”ืžืชื’ --index ืื—ืจื™ pop ื’ื•ืจื ืœืฉื™ื—ื–ื•ืจ ื’ื ืฉืœ ื” Staging Area ื›ืš ืฉืื ืขืฉื™ืชื add ืœื›ืžื” ืงื‘ืฆื™ื ืื– ืื—ืจื™ ื”ื—ื–ืจื” ืžื” stash ืœื ืชืฆื˜ืจื›ื• ืœืขืฉื•ืช ืœื”ื add ืฉื•ื‘. ## ืื ื™ืฉ ืœื™ ืงื•ื‘ืฅ ื’ื“ื•ืœ ื‘ืชื™ืงื™ื” ืื—ืช ื”ื‘ืขื™ื•ืช ืขื ืงื•ืžื™ื˜ื™ื ื”ื™ื ืฉื”ื ื ืฉืžืจื™ื ืœื ืฆื—. ืื– ืื ืœืงื—ืชื™ ื›ืžื” ืฉื™ื ื•ื™ื™ื ื•ื™ืฆืจืชื™ ืžื”ื ืงื•ืžื™ื˜ ื—ื“ืฉ ื‘ืขื ืฃ ื—ื“ืฉ (ื–ืžื ื™ ืชื›ืฃ ืืžื—ืง ืื•ืชื•), ื•ืื ื™ ืžืžื–ื’ ืืช ื”ืขื ืฃ ื”ื—ื“ืฉ ืœ main ื›ื“ื™ ืœื”ืžืฉื™ืš ืœืขื‘ื•ื“, ืื– ื›ืœ ื”ืงื‘ืฆื™ื ืฉื”ื™ื• ื‘ืื™ื—ืกื•ืŸ ื”"ื–ืžื ื™" ื™ื™ืฉืืจื• ื‘ืžืื’ืจ ื”ื’ื™ื˜ ืœื ืฆื—. ื‘ืžื™ืœื™ื ืื—ืจื•ืช ื ื ื™ื— ืฉืกื˜ื˜ื•ืก ื ื•ืชืŸ ืœื™ ืืช ื”ืกื™ื˜ื•ืืฆื™ื” ื”ื‘ืื”:
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   src/App.js

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        buggy-data.db

ื”ืงื•ื‘ืฅ buggy-data.db ืžื™ื™ืฆื’ dump ืฉืœ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืขื ืžื™ื“ืข ืฉื’ื•ืจื ืœื‘ืื’ ื‘ืžืขืจื›ืช ืฉืœื™ ื•ืื ื™ ืžื ืกื” ืœืชืงืŸ ืื•ืชื•. ื–ื” ืงื•ื‘ืฅ ื‘ื™ื ืืจื™ ื’ื“ื•ืœ ื•ืื ื™ ืฆืจื™ืš ืื•ืชื• ืจืง ื‘ืฉื‘ื™ืœ ื”ื‘ื“ื™ืงื•ืช ื•ื”ืชื™ืงื•ื ื™ื. ื‘ืืžืฆืข ื”ืขื‘ื•ื“ื” ืื ื™ ืฆืจื™ืš ืœืขื‘ื•ืจ ืœืขื‘ื•ื“ ืขืœ ืคื™ืฆ'ืจ ืื• ื‘ืื’ ืื—ืจ. ืื ืื ื™ ืขื›ืฉื™ื• ื™ื•ืฆืจ ืงื•ืžื™ื˜ ื—ื“ืฉ ื‘ืขื ืฃ ื—ื“ืฉ ืœืฆื•ืจืš ื”ืชื™ืงื•ืŸ ื•ืžื›ื ื™ืก ืืœื™ื• ื’ื ืืช buggy-data.db, ืงื•ื‘ืฅ ื–ื” ื™ื™ื“ื—ืฃ ืœืฉืจืช ื”ืžืจื›ื–ื™ ื‘ืคืขื ื”ื‘ืื” ืฉืืขืฉื” push ื•ื™ื™ืฉืžืจ ื‘ืžืื’ืจ ื”ื’ื™ื˜ ืœื ืฆื—. ืื ืื ื™ ืžื•ื•ืชืจ ืขืœ buggy-data.db ื‘ืงื•ืžื™ื˜ ื”ื–ืžื ื™ ื•ืžืฉืื™ืจ ืื•ืชื• ืคืฉื•ื˜ ื‘ืชื™ืงื™ื™ืช ื”ืขื‘ื•ื“ื” ื”ื•ื ืขืœื•ืœ ืœื”ืคืจื™ืข ืœื™ ื‘ืชื™ืงื•ืŸ ื”ื‘ืื’ ื‘ืขื ืฃ ื”ื—ื“ืฉ. ืื ื™ ื™ื›ื•ืœ ืœื”ื›ื ื™ืก ืื•ืชื• ืœ .gitignore ืื‘ืœ ืœื ื‘ื˜ื•ื— ืฉืื ื™ ืจื•ืฆื” ืœืฉื ื•ืช ืืช gitignore ื‘ืฉื‘ื™ืœ ืžืฉื”ื• ื›ืœ ื›ืš ื–ืžื ื™. ืกื˜ืืฉ ืฉื•ื‘ ืžืกืชืžืŸ ื‘ืชื•ืจ ื”ืคื™ืชืจื•ืŸ ื”ืงืœ ื‘ืžืฆื‘ ื”ื–ื”. ืžืคืขื™ืœื™ื:
$ git stash -u
ื•ื”ืงื•ื‘ืฅ ื”ื’ื“ื•ืœ ื ืขืœื ืœืกื˜ืืฉ ื™ื—ื“ ืขื ื”ืฉื™ื ื•ื™ ืฉื”ืชื—ืœืชื™ ืœืขืฉื•ืช. ื”ืคืขืœื” ืขืชื™ื“ื™ืช ืฉืœ git push ืœื ืชืฉืœื— ืืช ื”ืงื•ื‘ืฅ ื”ื’ื“ื•ืœ ืœืžืื’ืจ ื”ืžืจื›ื–ื™ ื•ื‘ื”ืคืขืœื” ืขืชื™ื“ื™ืช ืฉืœ gc ื”ื•ื ื™ื™ืžื—ืง ืžืชื™ืงื™ื™ืช .git, ืื• ืื ืจื•ืฆื™ื ืžื™ื“ ืื—ืจื™ ื” git stash pop ืœืžื—ื•ืง ืื•ืชื• ืืคืฉืจ ืœื”ืจื™ืฅ:
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc
ืžื›ื™ืจื™ื ืขื•ื“ ืžืงืจื™ื ืฉื‘ื”ื git stash ื”ื•ื ื”ืคื™ืชืจื•ืŸ ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ? ืžื•ื–ืžื ื™ื ืœืฉืชืฃ ื‘ืชื’ื•ื‘ื•ืช.

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

ToCode
1 419
# ืืจื‘ืขื” ืกื•ื’ื™ื ืฉืœ ื‘ื“ื™ืงื•ืช ืฉื›ื“ืื™ ืœื›ืชื•ื‘ ื‘ืฉื‘ื•ืข ืฉืขื‘ืจ ื”ืฆืขืชื™ ื›ืืŸ ื›ืžื” ืจืขื™ื•ื ื•ืช ืœืกื•ื’ื™ ื‘ื“ื™ืงื•ืช ืฉืืชื ื™ื›ื•ืœื™ื ืœื›ืชื•ื‘, ื•ื‘ืชื’ื•ื‘ื” ืœืื•ืชื• ืคื•ืกื˜ ื›ืžื” ืงื•ืจืื™ื ืจืฆื• ืœื“ืขืช ืœื ืจืง ืื™ื–ื” ื‘ื“ื™ืงื•ืช ืืคืฉืจ ืœื›ืชื•ื‘, ืืœื ืื™ื–ื” ื‘ื“ื™ืงื•ืช ื›ื“ืื™ ืœื›ืชื•ื‘. ืื– ื”ื ื” ื”ืจืฉื™ืžื” ืฉืœื™ ืฉืœ ืืจื‘ืขื” ืกื•ื’ื™ ื‘ื“ื™ืงื•ืช ืœื™ื™ืฉื•ืžื™ ืจื™ืืงื˜ ืฉื ื•ืชื ื•ืช ื”ื›ื™ ื”ืจื‘ื” ืขืจืš ืœืžืคืชื—ื™ื ืฉื›ื•ืชื‘ื™ื ืื•ืชืŸ: ## ื‘ื“ื™ืงืช Utility Functions ื’ื ืจื™ื•ืช ื›ืœ ืคื•ื ืงืฆื™ื” ื˜ื”ื•ืจื” ืฉืื ื—ื ื• ืขื•ืฉื™ื ืœื” export ืžืื™ื–ืฉื”ื• ืงื•ื‘ืฅ ืชืจื•ื•ื™ื— ืžื›ืชื™ื‘ืช ืกื˜ ื‘ื“ื™ืงื•ืช ืžืงื™ืฃ ื‘ื ื•ืกืฃ ืœืชื™ืขื•ื“ (ื•ืœืคืขืžื™ื ืืคื™ืœื• ื‘ืžืงื•ืžื•). ืžื‘ื—ื™ื ืช ื”ืขืœื•ืช ื›ืชื™ื‘ืช ื‘ื“ื™ืงื•ืช ืœืคื•ื ืงืฆื™ื” ื˜ื”ื•ืจื” ื–ื” ืžืžืฉ ืคืฉื•ื˜ ื›ื™ ื”ื™ื ืžื•ืฉืคืขืช ืจืง ืžื”ืงืœื˜ื™ื ืฉื”ื™ื ืžืงื‘ืœืช; ืžื‘ื—ื™ื ืช ื”ืชื•ืขืœืช ืคื•ื ืงืฆื™ื” ืฉืขื•ืฉื™ื ืœื” export ื–ื• ืคื•ื ืงืฆื™ื” ืฉืžืฉืชืžืฉื™ื ื‘ื” ืžื›ืžื” ืžืงื•ืžื•ืช ื‘ืžืขืจื›ืช ื•ื›ื›ืœ ืฉื™ืขื‘ื•ืจ ื”ื–ืžืŸ ื™ืฉืชืžืฉื• ื‘ื” ืžื™ื•ืชืจ ืžืงื•ืžื•ืช. ืืœื” ื‘ื“ื™ื•ืง ื”ืคื•ื ืงืฆื™ื•ืช ืฉืฉื•ืจื“ื•ืช ื”ื›ื™ ื”ืจื‘ื” ื–ืžืŸ ื‘ืงื•ื“, ื•ืฉื”ื›ื™ ืžืคื—ื™ื“ ืœืฉื ื•ืช ืื•ืชืŸ ื›ื™ ืื ื—ื ื• ืœื ื™ื•ื“ืขื™ื ืื™ื–ื” Use Case ืžื•ื–ืจ ืื ื—ื ื• ืฉื•ื‘ืจื™ื. ืกื˜ ื‘ื“ื™ืงื•ืช ืžืฉืžืขื•ืชื™ ืขืœ ืคื•ื ืงืฆื™ื•ืช ื›ืืœื” ื™ื‘ื˜ื™ื— ืœื ื• ืฉื›ืœ ืฉื™ื ื•ื™ ืœื•ืงื— ื‘ื—ืฉื‘ื•ืŸ ืืช ื›ืœ ื”ืžืงืจื™ื ื”ื—ืฉื•ื‘ื™ื ืฉื”ื™ื• ื‘ืขื‘ืจ. ืžื’ื“ื™ืœื™ ืจืืฉ ื’ื ื™ืงืคื™ื“ื• ืœื”ื•ืกื™ืฃ ื‘ื“ื™ืงื•ืช ื›ืœ ืคืขื ืฉืขื•ืฉื™ื ืฉื™ื ื•ื™ ื‘ื›ื–ืืช ืคื•ื ืงืฆื™ื”, ื›ื“ื™ ืœื•ื•ื“ื ืฉืฉื•ื ืฉื™ื ื•ื™ ืขืชื™ื“ื™ ืœื ื™ื“ืจื•ืก ืืช ื”ืฉื™ื ื•ื™ ืื• ื”ืชื™ืงื•ืŸ ืฉืื ื—ื ื• ืžื›ื ื™ืกื™ื. ื“ื•ื’ืžื” ื˜ื•ื‘ื” ื”ื™ื ื”ืกืคืจื™ื” lodash ืฉื›ื•ืœืœืช ื‘ื ื•ืกืฃ ืœื›ืœ ืงื‘ืฆื™ ื”ืžืงื•ืจ ื’ื ืชื™ืงื™ื™ืช test ืฉืžื›ื™ืœื” ืงื•ื‘ืฅ ื‘ื“ื™ืงื” ืฉืžืชืื™ื ืœื›ืœ ืงื•ื‘ืฅ ืžืงื•ืจ. ืจืฆื•ื™ ืœืจืื•ืช ืืช ื”ื‘ื“ื™ืงื•ืช ืฉืœื”ื ื›ืืŸ: https://github.com/lodash/lodash/tree/master/test. ## ื‘ื“ื™ืงืช ืงื•ืžืคื•ื ื ื˜ื•ืช ื’ื ืจื™ื•ืช ื›ืฉื”ืžืขืจื›ืช ืžืกืคื™ืง ื’ื“ื•ืœื” ืœืื˜ ืœืื˜ ื™ื”ื™ื• ืœื ื• ืจื›ื™ื‘ื™ UI ืฉื’ื ื”ื ืกื•ื’ ืฉืœ Utility Functions - ืœื“ื•ื’ืžื” ืจื›ื™ื‘ ืฉืœ Dropdown, ืจื›ื™ื‘ ืฉืœ ืฉื•ืจื” ื‘ื˜ื•ืคืก ืื• ืื•ืœื™ ืื™ื–ื” Spinner ืžื™ื•ื—ื“ ืฉืžืชืื™ื ื‘ื“ื™ื•ืง ืœืขื™ืฆื•ื‘ ืฉืœื ื•. ื‘ื“ื™ืงื” ืœืงื•ืžืคื•ื ื ื˜ื•ืช ื™ื•ืชืจ ืงืฉื” ืœื›ืชื•ื‘ ืžืืฉืจ ื‘ื“ื™ืงื” ืœืคื•ื ืงืฆื™ื” ื˜ื”ื•ืจื”, ืื‘ืœ ืžืื—ืจ ื•ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื”ืŸ ื’ื ืจื™ื•ืช ื•ืžืฉืชืžืฉื™ื ื‘ื”ืŸ ื‘ื”ืจื‘ื” ืžืงื•ืžื•ืช ื‘ืžืขืจื›ืช ื”ื‘ื“ื™ืงื” ืฉืœื”ืŸ ืขื“ื™ื™ืŸ ืฉื•ื•ื” ืืช ื”ื”ืฉืงืขื”. ื›ื“ืื™ ืœื‘ื“ื•ืง ื›ืžื” ืฉื™ื•ืชืจ ืงืœื˜ื™ื ื•ืขืจื›ื™ื ืฉื•ื ื™ื ืœ props ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื”, ื•ืื ื”ื™ื ืžืกืชื›ืœืช ื’ื ืขืœ context ืื– ืœื”ืขื‘ื™ืจ ื›ืžื” ืฉื™ื•ืชืจ ืืคืฉืจื•ื™ื•ืช ืœืขืจื›ื™ื ืฉื. ื”ืžื˜ืจื” ืฉืœื›ื ื”ื™ื ืœื‘ื ื•ืช ื—ื•ืžื” ืกื‘ื™ื‘ ื”ืžืžืฉืง ื•ื”ืคื™ืฆ'ืจื™ื ื”ื ื•ื›ื—ื™ื™ื ื›ืš ืฉื›ืฉืžืฉื”ื• ื™ื™ืฉื‘ืจ ืืชื ืชื“ืขื• ืœืคื ื™ ื” QA. ## ื‘ื“ื™ืงืช Custom Hooks ืื ื—ื ื• ืขื“ื™ื™ืŸ ื‘ืื–ื•ืจ ื”ื’ื ืจื™ ืฉืžืฉืชืžืฉื™ื ื‘ื• ื‘ื”ืจื‘ื” ืžืงื•ืžื•ืช ื‘ืžืขืจื›ืช ืื‘ืœ ืขื›ืฉื™ื• ื”ืžื—ื™ืจ ืขื•ืœื” ื‘ืขื•ื“ ืžื“ืจื’ื”. ื ื›ื•ืŸ, ื™ืฉ Custom Hooks ืžืื•ื“ ืคืฉื•ื˜ื™ื ืฉื›ื•ืœืœื™ื ืจืง ืœื•ื’ื™ืงื” ื•ื–ื” ืžื”ืžื ืื ื™ืฉ ืœื›ื ื›ืืœื”, ืื‘ืœ ื”ืจื‘ื” Custom Hooks ื›ื•ืœืœื™ื ืื™ื ื˜ืจืงืฆื™ื” ืขื ืจื›ื™ื‘ื™ื ื—ื™ืฆื•ื ื™ื™ื ื•ืฉื™ืžื•ืฉ ื‘ืืคืงื˜ื™ื. ืงื—ื• ืœื“ื•ื’ืžื” ืืช useCookies ื”ื•ืง ืฉืžืืคืฉืจ ืœืงื•ืžืคื•ื ื ื˜ื” ืœืงืจื•ื ืžื™ื“ืข ืž Cookies. ื™ืฉ ืœื”ื ืงื•ื‘ืฅ ื‘ื“ื™ืงื” ื“ื™ ืžืงื™ืฃ ื›ืืŸ: https://github.com/reactivestack/cookies/blob/master/packages/react-cookie/src/__tests__/useCookies-test.js. ื”ื ื” ื“ื•ื’ืžื” ืœื‘ื“ื™ืงื” ืžืžื ื•:
    it('update when a cookie change', () => {
      const cookies = new Cookies();
      const node = document.createElement('div');

      const toRender = (
        <CookiesProvider cookies={cookies}>
          <TestComponent />
        </CookiesProvider>
      );

      act(() => {
        cookies.set('test', 'big fat cat Pacman');
        ReactDOM.render(toRender, node);
      });

      expect(node.innerHTML).toContain('big fat cat Pacman');

      act(() => {
        cookies.set('test', 'mean lean cat Suki');
        ReactDOM.render(toRender, node);
      });

      expect(node.innerHTML).toContain('mean lean cat Suki');
    });
ื–ืืช ื›ื‘ืจ ื‘ื“ื™ืงื” ืฉื™ื•ืชืจ ืงืฉื” ืœื›ืชื•ื‘ ืžืืฉืจ ื‘ื“ื™ืงืช ืงื•ืžืคื•ื ื ื˜ื” ืจื’ื™ืœื”, ื•ื›ืžื•ื‘ืŸ ื™ื•ืชืจ ืงืฉื” ืœื›ืชื•ื‘ ืžืืฉืจ ื‘ื“ื™ืงื” ืฉืœ Pure Function. ืœืžืจื•ืช ื”ืงื•ืฉื™ ื‘ื“ื™ืงืช Custom Hooks ื ื•ืชื ืช ืขืจืš ื›ื™ ื–ื” ืžืฉื”ื• ืฉืžืฉืชืžืฉื™ื ื‘ื• ื‘ื”ืจื‘ื” ืžืงื•ืžื•ืช ื‘ืžืขืจื›ืช ื•ื›ืฉื™ืฉ ืขืœื™ื• ืกื˜ ืžืงื™ืฃ ืฉืœ ื‘ื“ื™ืงื•ืช ื™ื—ื™ื“ื” ืื ื—ื ื• ืžืจื’ื™ืฉื™ื ื™ื•ืชืจ ื‘ื ื•ื— ืœืฉื ื•ืช ืื•ืชื•. ## ืžืกืœื•ืœื™ ืงื•ื“ ืฉืงืฉื” ืœื”ื’ื™ืข ืืœื™ื”ื ืื—ืจืช

ToCode
1 419
> make the third argument work ืžืกืชื‘ืจ ืฉื‘ื’ื™ืจืกื” ืงื•ื“ืžืช ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื–ื” ื”ื•ืคื™ืข ื›ืš:
ch || (ch = ' ');
ืจื•ืื™ื ืืช ื”ื‘ืขื™ื”? ืื ืขื“ื™ื™ืŸ ืœื ืชืฉืžื—ื• ืœื“ืขืช ืฉ Steve Mao ื”ื•ืกื™ืฃ ื’ื ื‘ื“ื™ืงื” ื›ื“ื™ ืœื”ืจืื•ืช ืื™ืคื” ื‘ื“ื™ื•ืง ื”ืงื•ื“ ื”ืงื•ื“ื ื ื›ืฉืœ:
assert.strictEqual(leftpad(1, 2, 0), '01');
ืขื›ืฉื™ื• ื–ื” ื‘ืจื•ืจ! ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื”ื™ื” ื‘ืฉื™ืžื•ืฉ ื‘ื›ืœ ืžืฆื‘ ื‘ื• ch ื”ื™ื” false, ื•ื–ื” ื›ื•ืœืœ ืืช ื”ืžืฆื‘ ื‘ื• ื”ื•ื ืงื™ื‘ืœ ืืช ื”ืขืจืš 0. ื”ืฉื™ื ื•ื™ ืฉืœ ืกื˜ื™ื‘ ืžืื• ื”ื•ื ืฉืื™ืคืฉืจ ืœืคื•ื ืงืฆื™ื” ืœื˜ืคืœ ื’ื ื‘ืจื™ืคื•ื“ ืžืกืคืจื™ ื•ืœืงื‘ืœ ืืช ื”ืขืจืš 0 ื‘ืชื•ืจ ืชื• ื”ืจื™ืคื•ื“ ืžืฉืžืืœ. ืกืš ื”ื›ืœ ื”ื’ื™ืจืกื” ื”ืขื“ื›ื ื™ืช ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื”ื™ื ืžืื•ื“ ืžืขื ื™ื™ื ืช ื•ื›ื•ืœืœืช ื’ื ื˜ื™ืคื•ืœ ื‘ืžืงืจื™ ืงืฆื” ืžื‘ื—ื™ื ืช ืคืจืžื˜ืจื™ื, ื’ื ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืœืžืงืจื™ื ื ืคื•ืฆื™ื ื‘ืืžืฆืขื•ืช cache ื•ื’ื ืืœื’ื•ืจื™ืชื ื—ื›ื ืฉืžืฆืœื™ื— ืœืขืฉื•ืช ืืช ืื•ืชื” ืขื‘ื•ื“ื” ื‘ืคื—ื•ืช ื–ืžืŸ ืžืขื‘ื“. ื—ื‘ืœ ืจืง ืฉื–ืžืŸ ืงืฆืจ ืื—ืจื™ ืฉืคื•ืจืกืžื” ืื•ืชื” ืคื•ื ืงืฆื™ื” ื ื›ื ืกื” ื‘ืชื•ืจ ืชื•ืกืคืช ืžื•ื‘ื ื™ืช ืœื“ืคื“ืคื ื™ื ื•ื›ืขืช ืื™ืŸ ืฆื•ืจืš ืœื”ืฉืชืžืฉ ื‘ื” ื›ืกืคืจื™ื” ื—ื™ืฆื•ื ื™ืช.