ãã¡ã³ããã³ã¹ã¢ãŒããã«å ¥ããªã¯ãšã¹ãã®ã¢ããŠã³ã¹ïŒè©³çŽ°ã¯ïŒ3142ïŒä»¥éã䜿çšãã代æ¿ã©ã€ãã©ãªã®ãªã¹ããåéããããšæããŸãã 以äžã«ã³ã¡ã³ãããŠãã ããããã®è¡šãæŽæ°ããŸãã è¯ãéžæè¢ã®ãªã¹ããã§ãããããããreadmeã«è¿œå ããå¿ èŠããããŸãã
é äžåã§ãã²ã©ãäžå®å šã§ãã
ããã±ãŒãžå| ãã³ãã«ãµã€ãº| APIã¹ã¿ã€ã«| æŠèŠ
------------ | ------------- | ------------- | -------------
ããŒããã§ãã| 0.4kb | çŽæ/ã¹ããªãŒã | window.fetchãNode.jsã«ãããã軜éã¢ãžã¥ãŒã«
æ²ãã£ãŠãã| 1kb | fp/ãããã¹/ã¹ããªãŒã | éåæ/åŸ
æ©ä»ãã®æ©èœçãªHTTPã¯ã©ã€ã¢ã³ã
ååŸ| 48.4kb | çŽæ/ã¹ããªãŒã | ç°¡ç¥åãããHTTPãªã¯ãšã¹ã
make-fetch-happen | 442kb | çŽæ/ã¹ããªãŒã | make-fetch-happenã¯ãnode-fetch-npmããHTTPãã£ãã·ã¥ã®ãµããŒãããªã¯ãšã¹ãããŒãªã³ã°ããããã·ãåè©Šè¡ãªã©ãnode-fetchã«å«ããããšãæå³ããŠããªãè¿œå æ©èœã§ã©ããããNode.jsã©ã€ãã©ãªã§ãã
ã¢ã¯ã·ãªã¹| 11.9kb | çŽæ/ã¹ããªãŒã | ãã©ãŠã¶ãšnode.jsçšã®PromiseããŒã¹ã®HTTPã¯ã©ã€ã¢ã³ã
ã¢ã³ãã§ãã| 1kb | çŽæ/ã¹ããªãŒã | å°ããª500bãã§ããããã¢ãªãŒããªãã£ã«ã
ã¹ãŒããŒãšãŒãžã§ã³ã| 18kb | é£é/çŽæ| å°ããªããã°ã¬ãã·ãã¯ã©ã€ã¢ã³ãåŽHTTPãªã¯ãšã¹ãã©ã€ãã©ãªãšåãAPIãåããNode.jsã¢ãžã¥ãŒã«ã§ãå€ãã®é«ã¬ãã«HTTPã¯ã©ã€ã¢ã³ãæ©èœãåããŠããŸã
tiny-json-http | 22kb | çŽæ| JSONãã€ããŒãã®GETããã³POSTçšã®ããããªã¹ãHTTPã¯ã©ã€ã¢ã³ã
é| 164kb | é£é/çŽæ| ããŒãã©ã³ãã§æãã¹ãªã ã§æããã³ãµã ãªHTTPã¯ã©ã€ã¢ã³ã
urllib | 816kb | ã³ãŒã«ããã¯/çŽæ| åºæ¬èªèšŒãšãã€ãžã§ã¹ãèªèšŒããªãã€ã¬ã¯ããCookieãªã©ã®è€éãªäžçã§URLïŒäž»ã«HTTPïŒãéãã®ã«åœ¹ç«ã¡ãŸãã
æã
node.jsãè¡ãããã³ããšã³ãã«çŠç¹ãåœãŠã人ãšããŠãaxiosã¯ç§ã®è¡ãå
ã§ãã
Facebookã®EasyAPIã¯ããã©ãŠã¶ãŒãšããŒãã§æ©èœããŸããïŒ çµãã
@mikealãšã®æè¿ã®è°è«ã«ãããšãç§ã¯Bentãè©ŠããŠã¿ãŸããã ãã°ããã®éãªã¯ãšã¹ãã䜿çšããŠããNode.jséçºè ãšããŠãbentã¯ééããªãç°¡åãªç§»è¡ã§ãã-匷ããå§ãããŸãð
ããŠãããã§ç§èªèº«ã®å°ããªã©ã€ãã©ãªã宣äŒããã®ã¯ã¡ãã£ãšééã£ãŠããããã«æããŸããããããåé¡ã®ç®æšãªã®ã§ãããã«ãããŸãïŒ request-composeã¯æ©èœçã§ãpromiseãstreamsãããã³ä»ã®äŸ¿å©ãªãªãã·ã§ã³ããã®ã»ãšãã©ã¯ããªã¯ãšã¹ãã§èŠã€ãã£ããã®ã«éåžžã«è¿ããã®ã§ãã
ããã«ã€ããŠã®èšäºãæžããŸããã äžè¬çãªèãæ¹ã¯ã誰ããèªåã®ããŒãºã«åãããŠç¹å¥ã«èª¿æŽãããèªåã®HTTPã¯ã©ã€ã¢ã³ããäœæããããšã奚å±ãããŠãããšããããšã§ãã
ãã³ãã«ãµã€ãºã«ã€ããŠã¯ããããŸãããããã®ã¯ã©ã€ã¢ã³ãã¯ãã©ãŠã¶ã§äœ¿çšããããã«èšèšãããŠããŸããããããªãå°ããã¯ãã§ãã
次ã®åãããŒãã«ã«è¿œå ãããšããå ŽåããããŸãã
ãããã®æ°å€ã䞊ã¹ããšãäžéšã®ã©ã€ãã©ãªã«ã¯æ¯é±æ°åã®æãšæ°çŸäžã®ããŠã³ããŒãããããŸãããä»ã®ã©ã€ãã©ãªã«ã¯æ°çŸããããŸãã
ç§ã®2ã»ã³ããç¡èŠããŠå ã«é²ãã§ã倧äžå€«ã§ããã³ã¡ã³ããä¿®æ£ãããç°è°ãå±ãããããå¿ èŠã¯ãããŸããã
@csantanapråæããŸããæ©èœã»ãããæ¯èŒãã䟡å€ããããããããŸããã ãããã·ãµããŒãããã£ãã·ã¥ãµããŒããèªèšŒæ©èœãªã©ããªã¯ãšã¹ãã®ç¹å®ã®æ©èœã䜿çšããŠããŠããããä»ã®å Žæã§èŠã€ããå¿ èŠãããå Žåã¯ãããã«ã€ããŠè©±ãè¯ãæ©äŒã§ãã
axios
ã¯ãç¹ã«ããã³ããšã³ããŒãšããŠç§ã®æ祚ãåŸãŸãã
äžèŠã®äŸ¡å€ïŒ ky
ïŒããã³ããšã³ãïŒãšky-universal
ïŒå圢ïŒ
AxiosãŠãŒã¶ãŒã¯ãã¡ãã ããããã°ããã©ãŠã¶ãnodejsïŒãµãŒããŒãŸãã¯ãµãŒããŒã¬ã¹ã§å®è¡ïŒãªã©ã®ç°å¢ã«é¢ä¿ãªãããã¹ãŠã®ããŒã ãåãã©ã€ãã©ãªã䜿çšã§ããŸãã éåžžã«ããç¶æãããŠããããã¹ãŠã®äººã ããããæããŠããŸãã
got
readmeã®got
ã request
ã node-fetch
ã axios
ãããã³superagent
ã®éã®è¯ãæ¯èŒããããŸãïŒ https ïŒ//github.com/sindresorhus/got#comparison
ïŒäžæ£ç¢ºãªç¹ãããã°ãPRãæè¿ããŸããå¯èœãªéãäžç«ã«ä¿ã€ããã«åªããŸããïŒ
request
ãã移è¡ããããã®ç§»è¡ã¬ã€ãããããŸãïŒ https ïŒ//github.com/sindresorhus/got/blob/master/migration-guides.md
ç§ã«ãšã£ãŠãç§ã¯ãã§ããAPIã®ã©ãããŒãå®è¡ããåŸåãããã®ã§ãããŒããã§ãããç§ã®gotoã§ãã ãã¬ãã£ããªåŽé¢ã«ãããããããç§ã¯éåžžãããããŒãã®global.fetch
ã«ããŒãããã®ã§ããã©ãŠã¶ãŒã®å Žåãšåãããã«ïŒå€ããã©ãŠã¶ãŒã®ããªãã£ã«ãä»ããŠïŒåžžã«å©çšå¯èœã§ãããšä¿¡é Œã§ããŸãã isomorphic-fetch
ã䜿çšããããšãã§ããŸããããã¯ãããŒãã®ããŒããã§ããã®ã©ãããŒã§ããããã©ãŠã¶ãŒã§ã®ãã§ããããªãã£ã«ïŒãŸãã¯æ¢ã«äœ¿çšå¯èœãªãã§ããïŒã§ãã åŸæ¥ã®ãã©ãŠã¶ãŒããµããŒãããå¿
èŠããªããããã°ããŒãã«ã䜿çšããããŒãã§äœ¿çšããã°ããŒãã«ã確ç«ããŸãã
ãããã¬ãã¯ïŒhttps://www.npmjs.com/package/wreckïŒã¯ç§ã䜿ã£ãŠãããã®ã§ã
ã¯ã©ã€ã¢ã³ãã®ãã§ããAPIãæš¡å£ãããã®ã奜ãã§ãã axiosãsuperagentãªã©ã®ã©ã€ãã©ãªã¯ãæšæºã®ãªã¯ãšã¹ãã©ã€ãã©ãªã«å ããŠäžäœã¬ãã«ã®æœè±¡åã§ãã äœã¬ãã«ã®ãªã¯ãšã¹ãã©ã€ãã©ãªã®ä»£ãããšããŠããŠãããŒãµã«jséçºã®ç®çã§ãã¯ã©ã€ã¢ã³ãã®äœã¬ãã«ã®åçã®ãã®ãåæ ãããã®ã欲ããã§ãã axiosãsuperagentã®ãããªã©ã€ãã©ãªã¯ããã®äžã«èªåèªèº«ãåå®è£ ããããšãã§ãããã®ãŠãŒã¶ãŒã¯ããããåŒãç¶ã䜿çšã§ããŸããããããã¯ãã®ç®çã®åºç€ãšèŠãªãããã¹ãã§ã¯ãããŸããã
@Velveeta axiosã³ãŒãããŒã¹ã調ã¹ããšããããäœã¬ãã«ã®æšæºãªã¯ãšã¹ãã©ã€ãã©ãªãã«åºã¥ããŠãããšãã蚌æ ã¯èŠã€ãããŸããã§ããã ãã®çµè«ã«è³ã£ãçµç·¯ãæããŠãã ããã
@sindresorhusã®æ¯èŒã¯ãäžèšã®ç§ã®ãªã¹ããããã¯ããã«åªããã¢ãããŒãã§ãã https://github.com/sindresorhus/got#comparison
node-fetch/isomorphic-fetch
ã¯ãã»ãšãã©ã®ã¯ã©ã€ã¢ã³ãã«é©ããäœã¬ãã«ã®ãã«ãã£ã³ã°ãããã¯ã§ãã ãã§ããããŒã¹ã®ãªã¯ãšã¹ãã·ã ãèŠããã§ãã
ç§ã¯ãã€ã§ãããè¯ãAPIã§ãã§ãããã©ããããŸãã ãŸããããã¯å¥œã¿ã®åé¡ã ãšæããŸããããã©ãŠã¶ã®ããã¡ã¯ãã¹ã¿ã³ããŒãã§ãããšããçç±ã ãã§ãã§ããAPIãåªããŠããããšãæå³ããã®ã¯ééã£ãŠããŸãã äž¡åŽã§å圢ã«ããæ¹ããã€ãºãå°ãªãããšã¯ããã£ãŠããŸãããããã§ãæ¹åã«ã¯ãªããŸããã
@mikealèªèº«ã«ããr2ããããŸãã request
ã®ç²Ÿç¥çãªåŸç¶è
ãšãªãããšãç®çãšããŠããŸãã Promise APIãããã16kbå§çž®ãããŠããŸãã
Axiosã¯ãã©ãŠã¶ã§åé¡ãªãåäœããå¯èœæ§ããããŸãããNode.jsã§ã®çµéšã§ã¯ãããŸããã ãŸãããããããç©æ¥µçã«ç¶æãããŠãããã©ããã¯ããããŸããã
@ kreig303 axiosã®å éšã調ã¹ãŠããªãã®ã§ãæ°ã¥ããŠããŸããã§ããã çŸåšãéåžžã®XHRã«åºã¥ããŠããããã§ããããã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã®èŠæ±ã«å¯Ÿãããœãªã¥ãŒã·ã§ã³ã§ãããããçã«ããªã£ãŠããŸãã ç§ã¯åã«ãaxiosãããªãæ©èœãè±å¯ã§ããããšãæå³ãããªã¯ãšã¹ãã®ä»£ããã®ãããªåºæ¬ã¢ãžã¥ãŒã«ãšããŠããå°ã骚ã®æãããã®ãæ€èšããå¿ èŠã«å¿ããŠä»ã®ããæ©èœãè±å¯ãªã©ã€ãã©ãªããã®äžã«æ§ç¯ããå¿ èŠããããŸãã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§äžè²«æ§ã®ããAPIã䜿çšããããã«ïŒåºæ¬çã«axiosã§ããXHRã®ããã«ïŒããã§ããAPIããã©ãŒãªã³ã°ãããã®ãéžæããŸãããããã¯ãXHRã®è«ççãªåŸç¶ã§ããããã§ãã ããåªããAPIã©ãããŒãå¿ èŠãªå Žåã¯ããããã©ããããŠããã®æé©ãªAPIã䜿çšããŠå¥ã®ã©ã€ãã©ãªããªãªãŒã¹ããæ©äŒããããããããŸãããå¯èœãªéããã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®æ©èœãšAPIã®åçæ§ãå¿ èŠã§ãã
ããŠãç§ãã¡ãèŠæ±ããŠããåé¡ã®1ã€ã¯ãæ©èœãå€ãããããšãšãå éšãšèŠãªãããŠãããã®ã§ãããå ¬éãããŠããç¶æ ãå€ãããããšã§ãã éåžžã«å€ãã®æ©èœãåããŠããããšã¯ãåªããšç¥çŠã®äž¡æ¹ã§ãã ããããšãŠã人æ°ãããçç±ã§ããããããæåã ã£ãã®ã§ãããã¯ç¥çŠã§ãã ã³ãŒãããŒã¹ãã¯ãªãŒã³ã§ãããããããäžè¬çã«ãšããµã€ãã£ã³ã°ãªãã®ã«ä¿ã€ããã®å€å€§ãªåªåããªããã°ããããžã§ã¯ãã¯æçµçã«ã¯æ¶æ» ããã®ã§ãããã¯åªãã§ãã ãããŠãããã¯ãªã¯ãšã¹ãã®åé¡ã§ããããŸãããããã¯ãåžžã«èªåã®ã¬ã€ã€ãŒããäœããåºããããšãããŠãŒã¶ãŒèªèº«ã®èŠç¹ã§ããã代ããã«å¥ã®å Žæã®ãã©ã³ã±ããã®äžã«çœ®ããŸãã
ãŸããç§ã¯ã¢ã¯ã·ãªã¹ãåãä¿¡ä»°ãæã£ãŠãããšæããŸã..
ãããã£ãŠã代ããã«ç§ãã¡å šå¡ãã§ããããšã¯ããã€ãŒã«ãã©ã®ããã«æ©èœããããç解ããããã«å°ãªããšãããçšåºŠã®åªåãæãã次ã«ãæå ã«ããåã ã®ã¿ã¹ã¯ãæ€èšããã©ã®ãã€ãŒã«ãæé©ãã確èªããããšã§ãã
@ofrobotsã¯ããã®ãããªäžè¬çã«äœ¿çšãããŠããã©ã€ãã©ãªã®ã¹ã¯ãªãŒã³ã·ã§ãããå°ãéžæãããã®ã§ãã ãããç§ã®ãã®ã§ãïŒ
FWIWãããããã¯ãšã³ãã©ã€ãã©ãªãšããŠäœ¿çšãããã©ããã¯æãåºããªãã®ã§ãç§ã¯ããªãã®äž»åŒµãæ€èšŒããç«å Žã«ãããŸããïŒããªãããããã«ããŒããªãã£ãç¬ç¹ã®ãŠãŒã¹ã±ãŒã¹ãæã£ãŠããªãéãïŒã
@Velveetaç§ã¯ããªããããã§ã©ãã«è¡ãã®ãããããŸããç§ã¯ã¡ã¿ã©ã€ãã©ãªãè¡ãæ¹æ³ã§ãããã©ããã ãããããŸããã
ããã³ããšã³ãããã®ç§ã®æ祚ã¯axios
ã§ãã å°ãããå®å®ããŠããŠãäºæž¬å¯èœã§ãã
ç§ã¯å人çã«FEãããžã§ã¯ããšBEãããžã§ã¯ãã®äž¡æ¹ã«wretchã䜿çšããŠããŸããããã¯äž»ã«APIãéåžžã«çŽæçã ããã§ãã
ãã§ããã®ã©ãããŒ-ããŒããã§ããã§ãããŸãæ©èœããŸãã
fetch
APIã«å ããŠaxios
ã®ãããªäœéšãæ±ããŠãã人ã®ããã«ã$ gaxios
ããããŸãã ããã¯Googleã®éçºè
ã«ãã£ãŠæ§ç¯ãããçŸåšGoogle APIã®Node.jsã¯ã©ã€ã¢ã³ãã®ãã¹ãŠã®HTTPã€ã³ã¿ã©ã¯ã·ã§ã³ã匷åããŠãããããããã«ãã¹ããããŠç©æ¥µçã«äœ¿çšãããŠãããšèããã®ã¯å®å
šã ãšæãããŸãã
ïŒð@ JustinBeckwithã§ïŒ
ãããã¬ãã¯ïŒhttps://www.npmjs.com/package/wreckïŒã¯ç§ã䜿ã£ãŠãããã®ã§ã
ãŸããhapijsãã¬ãŒã ã¯ãŒã¯ã®åºç€ãšãªãhttpã¯ã©ã€ã¢ã³ãã§ããããŸãã å®è£ ã¯éåžžã«ã¯ãªãŒã³ã«èµ·åã§ããŸãã
@mikealèªèº«ã«ããr2ããããŸãã
request
ã®ç²Ÿç¥çãªåŸç¶è ãšãªãããšãç®çãšããŠããŸãã Promise APIãããã16kbå§çž®ãããŠããŸãã
ãã®ã©ã€ãã©ãªã¯ç¶æãããŸããã åæ§ã®APIãå¿
èŠãªå Žåã¯ã ky
ããå§ãããŸããããã¯ãæå°åããã³gzipå§çž®ããã got
ãšåããŠãŒã¶ãŒã«ãã£ãŠç¶æãããŸãã
Axiosã¯ãã©ãŠã¶ã§åé¡ãªãåäœããå¯èœæ§ããããŸãããNode.jsã§ã®çµéšã§ã¯ãããŸããã ãŸãããããããç©æ¥µçã«ç¶æãããŠãããã©ããã¯ããããŸããã
ç§ã¯Nodeã§axiosãéåžžã«æºè¶³ããŠäœ¿çšããŠããŸãã äž»ã«ã©ã ãã§ãäž»ã«æ©èœãè±å¯ã§ãããªãããã¯ã¬ã€ãžãŒãªäŸåé¢ä¿ãã§ãŒã³ãä»å±ããŠããªãããã§ãã @ofrobots Nodeã§ã®çµéšã¯äœã§ããïŒ
æã ããŒãjsãè¡ãããã³ããšã³ãã«çŠç¹ãåœãŠã人ãšããŠãå ¬çã¯ç§ã®è¡ãå ã§ãã Facebookã®EasyAPIã¯ããã©ãŠã¶ãŒãšããŒãã§æ©èœããŸããïŒ çµãã
Facebookã ãšã¯ç¥ããªãã£ãïŒ ããããã¯ããããã¯ãã¹ãŠã®APIã¢ã¯ã»ã¹çšã®ç§ã®gotoã©ã€ãã©ãªã§ãã
ãã®ã©ã€ãã©ãªtinkoff-requesthttps://github.com/TinkoffCreditSystems/tinkoff-requestã䜿çšããŸãã å°ããããã©ãŠã¶ãšãµãŒããŒã§åäœãããã©ã°ã€ã³ã®æŠå¿µã«åºã¥ããŠæ§ç¯ãããŠããŸãã ã©ã€ãã©ãªã¯ãè€æ°ã®ã¿ã€ãã®è€éãªãã£ãã·ã¥ãåæã«äœ¿çšã§ããããã«ããããã«äœæãããŸããã
Microsoftã®typed-rest-clientã䜿çšãã人ã¯ããŸããïŒ TypeScriptã§æžãããæå ¥ãã®è¡ãå±ããããã±ãŒãžã®ããã§ãïŒç§ã«ãšã£ãŠã¯å€§ããªãã©ã¹ã§ãïŒã
ããã«ã¯ã wreck
ïŒ hapi
ãšã³ã·ã¹ãã ããïŒãå«ããå¿
èŠããããŸã
ç§ã¯æè¿https://github.com/grantila/fetch-h2ã䜿çšããŠå€§æåãåããŠããŸã
çŸåšãäºææ§ã®ããæ¢ç¥ã®ããããã€ã³ä»£æ¿åã¯ãããŸããïŒ ããã¯KOAã«çµ±åãããŠãããç§ã«ã¹ããªãŒã ãã©ãã«ãäžããŠããŸã
åé¡ã®åé ã§è¿°ã¹ãããã«ãç§ã¯çŸåšäœ¿çšããããšã奜ãbent
ãšããå¥ã®ã©ã€ãã©ãªã«åãçµãã§ããŸãã
ãã°ããã®éã bent
ã¯ãã©ãŠã¶ã§åäœããããã«èšèšãããŠããŸããã APIã¯ããªãå®å®ããŠããã®ã§ã fetch
ã®äžã«ãã©ãŠã¶ããŒãžã§ã³ãæžãã®ã«å°ãæéãè²»ãããŸããã Node.jsããŒãžã§ã³ããã©ãŠã¶ãŒåããããšãã代ããã«ããã©ãŠã¶ãŒããŒãžã§ã³ã¯package.jsonå
ã®ç¬èªã®ãšã³ããªãã€ã³ãã§ãã
ã€ãŸãã bent
ã¯çŸåšãã©ãŠã¶ããµããŒãããŠãããéåžžã«åªããŠããŸãã
ããã¯çŽ æŽããã@mikeal
@csantanaprããããšãïŒ :)
axiosã¯ããŒããµãŒãã¹ãã¯ã©ãã·ã¥ãããå¯èœæ§ããããŸãïŒ https ïŒ//github.com/axios/axios/issues/1804
ç§ã«ãšã£ãŠãæ倧ã®æžå¿µäºé ã¯æ¬¡ã®ãšããã§ãã
ãã®åŸãæãäžè¬çãªæäœã䟿å©ã§ããéããã€ã³ã¿ãŒãã§ã€ã¹ãã©ã®ããã«èŠãããã¯æ°ã«ããŸããã ãµãŒããŒåŽã®ãµã€ãºã«ã€ããŠãããŸãæ°ã«ããŸãããã䞡端ã§åãã©ã€ãã©ãªãåå©çšããå Žåã¯éèŠã§ãã
ç·šéïŒYeeeaaaahã¯ç§ãããã§ããªãã責ããŠãããšæ£ç¢ºã«èšãããšã¯ã§ããŸããã
ç·šé2ïŒ node-libcurl
ãèŠãŠã¿ãããšæããŸãã
@joedski yaããããã·ã¯ãªã¯ãšã¹ã以å€ã§ã¯åºããµããŒããããŠããŸããã ãããŠTBHããããæ©èœãããŠããããµããŒãããã®ã«ããã£ãä»äºã®éãèãããšãç§ãå«ããŠèª°ãããããããããªãã®ã¯é©ãã§ã¯ãããŸãã;ïŒç§ã¯äžåºŠãããããŸããããããŠç§ã¯æ£ç¢ºã«æžãããã«ãžã£ã³ãããŠããŸããæ²ãã£ãå Žåã¯ããäžåºŠð€·ðœââïž
æåŸã«ãnodejsãããªã¯ãšã¹ããè¡ãããã«node-libcurl
ã©ã€ãã©ãªã䜿ãå§ããŸããã ãã€ãã£ãã®curlã©ã€ãã©ãªã䜿çšããŠãããããéåžžã«æçããŠãããäœå¹Žã«ãããã£ãŠæ¬çªç°å¢ã§ãã¹ããããŠããŸãã ããããçš®é¡ã®ãããã·ããªãã€ã¬ã¯ãã§åé¡ãªãåäœããpromiseïŒstreamã€ã³ã¿ãŒãã§ãŒã¹ãåããŠããŸãã
teeny-request ïŒ> 1mioã®æ¯é±ã®ããŠã³ããŒãïŒ
ãªã¯ãšã¹ãã®ããããã€ã³äº€æã§ãããã¯ããã«å°ããããªãã·ã§ã³ãå°ãªããªã£ãŠããŸãã å
éšnode-fetch
ã䜿çšããŸãã request
ã䜿çšããå Žæã«ãããããŸãã
node-fetch
ã誀ã£ãŠå ±åãããããã©ãŠã¶ãããŒãžã§ã³ã®ã¿ãå ±åãããŸãïŒ_Node.js_ãªã¹ãã®ãã€ã³ããç¡å¹ã«ããŸãïŒã ããã¯ééã£ãŠæž¬å®ãããããã«èŠãããã®ã§ãïŒ
代ããã«ããããã®ããããã枬å®ããå¿ èŠããããŸãã
ãããã¯ãã¹ãŠçŽ40kbã§ã
unfetch
ã誀ã£ãŠå ±åãããŸãïŒ
isomorphic-unfetch
ã¯Node.jsã«node-fetchïŒ code ã docs ïŒã䜿çšãããããå ±åããããµã€ãºã¯å°ãªããšãnode-fetchã®ãµã€ãºã§ããå¿
èŠããããŸãïŒç§ã®åã®ã³ã¡ã³ããåç
§ïŒãããããåãäžããããŠããã®ã§ã node-fetch
ã§ã®ç§ã®çµéšã«ã€ããŠå°ãã話ãããããšæããŸãã
ãŸã第äžã«ãããã¯ããªãã®ææã§ãã ããã«è²»ããããã³ãŒããšãšã³ãžãã¢ãªã³ã°ã®åªåã®éã¯ãç§ãã¡ããããŸã§ã«èŠæ±ãããã®ãããã¯ããã«å€§ããã§ãã fetch
ã¯å°ããªAPIã®ããã«èŠããNode.jsã§äºææ§ã®ããAPIãæäŸããããã®åªåã¯åç®äžã®ãã®ã ãšæãããŠãããšæããŸãããå®éã«ã¯ããã§ã¯ãããŸããã
ãã®çµæãã³ãŒãããŒã¹ã¯å€§èŠæš¡ã«ãªããŸãã ããã¯Node.jsã®ããªãã®äŸåé¢ä¿ã§ããããã©ãŠã¶ãŒãã³ãã«ã§ã¯ãŸã£ããèŠãããªãå¯èœæ§ããããŸãããç¹ã«ãµãŒããŒã¬ã¹ç°å¢ã§ã¯ãäŸåé¢ä¿ã®ãµã€ãºãNode.jsã§åé¡ã«ãªããªãããã§ã¯ãããŸããã
node-fetch
ã¯ããã©ãŠã¶ãŒã®APIãå®å
šã«ãšãã¥ã¬ãŒããããã¹ãŠã®äœæ¥ãå®è¡ããããããã¹ãã«ã¯äžå¯æ¬ ã§ãããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããŠããå Žåã¯ãNode.jsããã©ãŠã¶ãŒã§å®è¡ãããŠããå Žåã§ãããã¯ã³ãŒããå€ãããŠãéæ¥åç
§ãå€ãããŠäŸ¡å€ããããŸããã
IMOãNode.jsãšãã©ãŠã¶ã®äž¡æ¹ã§httpã¯ã©ã€ã¢ã³ãã«ãªãããã©ã€ãã©ãªã®çŸæç¹ã§ã®æ£ããã¢ãããŒãã¯ããã©ãŠã¶ã§fetch
ãšrequire(âhttpâ)
ã䜿çšããŠåå²å®è£
ã§çµ±äžãããAPIãå®è£
ããããšã§ãã Node.jsã®fetch
ãŸãã¯require(âhttpâ)
ãçŽæ¥ã¿ãŒã²ããã«ããªãã§ãã ããããŸããã©ã¡ãã®åŽã§ããããã®APIããšãã¥ã¬ãŒãããããšã«äŸåããªãã§ãã ããã ä¿¡ããããªãã»ã©å°ããhttps://github.com/mikeal/bent/tree/master/srcã§ããbent
ã®å®è£
ã§ãããããã«ãããã¯å®éã«ã¯ããªããæã£ãŠãããããã¯ããã«ç°¡åã§ãã
@mikealäºä¹ããã®ã«èŠåŽããŠããŸã
ãã®çµæãã³ãŒãããŒã¹ã¯å€§èŠæš¡ã«ãªããŸãã ããã¯Node.jsã®ããªãã®äŸåé¢ä¿ã§ããããã©ãŠã¶ãŒãã³ãã«ã§ã¯ãŸã£ããèŠãããªãå¯èœæ§ããããŸãããç¹ã«ãµãŒããŒã¬ã¹ç°å¢ã§ã¯ãäŸåé¢ä¿ã®ãµã€ãºãNode.jsã§åé¡ã«ãªããªãããã§ã¯ãããŸããã
OPã«ãªã¹ããããŠãã0.4kBã®ãã³ãã«ãµã€ãºã§ãããã¯äžãããããã¹ãŠã®éžæè¢ã®äžã§æå°ã§ããïŒ
@domenicãã©ãŠã¶APIã®ãšãã¥ã¬ãŒãã®è€éããäž»ãªåé¡ã§ããããããã°ããããšãããšãã«å€ãã®äžèŠãªã³ãŒããšéæ¥åç
§ãçºçããŸãã ããªãã¯Blob API
ãæã£ãŠããŸããããªãã¯body
ã®ããã«ããããã®ããŒã·ã£ãªã³ã°ãæã£ãŠããŸããããªãã¯header marshalling
ã®ã»ãŒ400è¡ãæã£ãŠããŸãããããŠããã¯èŠãŠããŸããå
¬éãããå®éã®APIã
ç§ãèšã£ãããã«ãããã¯å°è±¡çã§ããã fetch
APIããšãã¥ã¬ãŒããã以å€ã®ããšããããã®ã§ããã°ãããã¯éåžžã«ç°¡æœã§å·§åŠã§ãæçµçã«ã¯äžèŠãªã³ãŒãã§ããããŸãã
@mikealããŒããã§ããããã§ããAPIãš100ïŒ äºææ§ãæã€ããã«å¿ èŠãªã³ãŒãã1ãã³å€ãããšã«ã€ããŠãèšåããŠããŸããïŒwhat-wgïŒç°å¢ããšãã¥ã¬ãŒããããšãã«å¿ èŠãªãã®ïŒããã®èªã¿åãããã³æžã蟌ã¿å¯èœãªã¹ããªãŒã ããµããŒãããŠããŸããCloudflareã¯ãŒã«ãŒã®ããã«ã
ããŒãããæçµçã«äžèŠãªãã³ãŒãã®ããã³ããã0.4 kBãããŒãã«äžã®ä»ã®ãã¹ãŠã®ãšã³ããªãããå°ãããæ²ãã£ããµã€ãºã®0.25åãïŒãããããå³ãïŒã§äºä¹ããæ¹æ³ããŸã ããããããŸãããã¢ãããŒãããšãä¿¡ããããªãã»ã©å°ãããïŒã
@domenicã¯ããã©ãŠã¶ã®ãã³ãã«ãµã€ãºãæ¯èŒããŠããŸããïŒ Node.jsã§ãããããããã°ããããšã®è€éãã«ã€ããŠè©±ããŠããŸãã ãã©ãŠã¶ã§ã¯ã node-fetch
ã³ãŒãã®ã»ãšãã©ãååšããªããšäºæ³ããããããäœãæ¯èŒããŠããã®ãããããããŸããã
OPã®å€ãæ¯èŒããŠããŸãã ãããã©ã®ããã«æž¬å®ãããã®ãããããŸããã ããããããã¯æ£ãã枬å®ãããŠããªãã®ã§ãOPãæŽæ°ããããã®è¯ãæ å ±ã«ãªãã§ãããïŒ
@domenicãããããã§ãããããã¯ãã¹ãŠãã©ãŠã¶ãã³ãã«ã®ãµã€ãºã§ããæçš¿ã¯ããªãå€ãããã bent
ã®æ°å€ã¯ãŸã ååã«è¿ããã®ã®ããããã®å€ãã¯å€ããªã£ãŠããå¯èœæ§ããããŸãã
@ root / request -500 LoCã§èšè¿°ããã80/20ã®ããããã€ã³çœ®æãããã³ãŒãã®äŸåé¢ä¿ïŒ
æå³çã«äœæãããrequest.jsã®åäœã«å¯ŸããŠãã¹ããããŠããŸãã
çããããã«ã¡ã¯ïŒ ç§ã®ãããžã§ã¯ãã«ä»£ãããªã¯ãšã¹ãã«å€ãããã®ãèŠã€ããããã«ãå°ã調ã¹ãŠã¿ãŸããã ä»ã®ãšãããããã¯ç§ããŸãšãããã®ã§ãïŒ https ://github.com/emanuelcasco/http-packages-benchmark
ãã¡ããããããããæèŠã倧æè¿ã§ãïŒ
ã®request
ã¯æ£åŒã«å»æ¢ãããŸããã request
ãå Žåã«ãã£ãŠ@root/request
ã®æ©èœãåããå®å
šãªããããã€ã³ä»£æ¿åãšããŠã postman-request
ãæ£åŒã«ææ¡ããããšã®éèŠæ§ã匷調ããããšã¯ã§ããŸããã @root/request
request
ã®éããããµãã»ãããå¿
èŠã§ãããšãã°æ°ã«ããªã人ã®ããã®$ïŒ$ã ã¹ããªãŒã ã
ããã«ãããããã±ãŒãžã¡ã³ããã¯ããã®åé¡ã«æ°å以äžã®éçºæéãè²»ããããšãªãããŸãã©ã€ãã©ãªãã¢ããªå
šäœããªãã¡ã¯ã¿ãªã³ã°ããããšãªãã request
ãåé€ããè¿·æãªéæšå¥šã¡ãã»ãŒãžãåãé€ãããšãã§ããŸãã ãã®ãããªããããã€ã³ã®ä»£æ¿åãååšããããšããç解ããã®ã«ããªãã®æéãšãã©ã¹ãã¬ãŒã·ã§ã³ãããããŸããã
ãããŠãã¯ããç§ã¯ãéæšå¥šãã ãã§ã¯äœãå£ããªãããšãç¥ã£ãŠããŸãã ã¯ããæè¡çã«ã¯èª°ãããŸã request
ã䜿çšã§ããããããä»åŸæ°å幎ã䜿çšãç¶ããããšãã§ããŸãã ãã ããããã¯éæšå¥šã䜿çšãããããšã«ãªã£ãŠãããã®ã§ã¯ãããŸããã éæšå¥šã¯ã誰ãããã©ã°ãæãããšã決å®ãããŸã§ã人ã
ãã³ãŒããã¢ããã°ã¬ãŒãããããã®ãç¶äºæéããšããŠãè¡åã®åŒã³ãããšããŠæ©èœããããšã«ãªã£ãŠããŸãã
ããã§ã®ããã«ãããµããŒãçµäºããŸãã¯ãä¿å®çµäºããããŒã¯ããããã«ãéæšå¥šãã䜿çšãããŠããå Žåãç§ã¯æ¬åœã«ãããå«ããŸãã ããããå
¬åŒã«ãµããŒããããç©æ¥µçã«ä¿å®ãããŠããã postman-request
ã®ãããªå®å
šãªããããã€ã³äº€æãããã°ãããã賌å
¥ããã®ã¯ãã£ãšé¢åã§ãã
å®éããã®ããã±ãŒãžã®ã¡ã³ããã³ã¹ãPostmanããŒã ã«åŒãæž¡ãããšãæ€èšãã人ã¯ããŸããïŒ request
ãå»æ¢ãã代ããã«ã postman-request
ãrequest
ã«ç§»æ€ããŠãæ°ããå
¬åŒã¡ã³ãããŒã«ããããšãææ¡ããŠã¿ãŸãããïŒ
ããã§èªåã®å°ããªã©ã€ãã©ãªã宣äŒããŠç³ãèš³ãããŸãã
nodejsã§ã®ã¿äœ¿çšããããã«èšèšãããŠããŸã
const http = require('@zhangfuxing/http');
const assert = require('assert');
(async () => {
// http
const httpRes = await http.get('http://baidu.com');
assert(httpRes.includes('<html>'));
// https
const httpsRes = await http.get('https://cnodejs.org/api/v1/topics?limit=1&mdrender=false');
assert(httpsRes.success === true);
// download file: use pipe
const fs = require('fs');
const res = await http.get('http://localhost:3000', {
responseType: "stream"
})
res.pipe(require('fs').createWriteStream('zfx.txt'))
// or use pipeline
const stream = require('stream');
const util = require('util');
const pipeline = util.promisify(stream.pipeline);
const res = await http.get(`${url}/stream`, {
responseType: "stream"
});
await pipeline(res, fs.createWriteStream('zfx.txt'));
// post Buffer
const res = await http.post('http://localhost/upload', Buffer.from('abc'));
assert(res.success === true);
// post Stream
const fs = require('fs');
const readStream = fs.createReadStream('./index.js');
const res = await http.post('http://localhost/upload', readStream);
assert(res.success === true);
// post json
const data = {
username: 'zfx',
password: 'password'
};
const res = await http.post('http://localhost/upload', data);
assert(res.success === true);
// post application/x-www-form-urlencoded
const data = {
username: 'zfx',
password: 'password'
};
const options = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
const res = await http.post('http://localhost/upload', data, options);
assert(res.success === true);
// post FormData
const FormData = require('form-data');
const form = new FormData();
const fs = require('fs');
const readStream = fs.createReadStream('./index.js');
form.append('my_field', 'my value');
form.append('my_buffer', Buffer.from('abc'));
form.append('my_file', readStream);
// Set filename by providing a string for options
form.append('my_file', readStream, '1.js' );
// provide an object.
form.append('my_file', readStream, {
filename: 'bar.jpg',
contentType: 'image/jpeg',
knownLength: 19806
});
const formHeaders = form.getHeaders();
const res = await http.post('http://localhost/upload', form, {
headers: {
...formHeaders,
},
});
assert(res.success === true);
// head
const res = await http.head(url);
assert(res.statusCode === 200);
assert(res.statusMessage === 'OK');
assert(res.headers && typeof res.headers === 'object');
assert(res.statusCode === 200);
assert(res.data === '');
// options
const res = await http.options(url);
assert(res === 'GET,HEAD,POST,PUT,PATCH,DELETE');
})().catch(console.error);
ããããTSã§æžãããŠããããšãèãããšãææ°ã®ã¿ã€ãã¹ã¯ãªããSPAãæ§ç¯ããŠããå Žåã¯ã Wretchãæé©ãªãªãã·ã§ã³ã§ããããšãããããŸããã äºå®äžAxiosãšåçã®æ©èœã§ãããè¿œå ã®ããã«ãŠã§ã¢ããµããŒãããŸãã APIã¯ãKyãšæ¯èŒããŠãããã€ãã®å Žæã§å°ãåªããŠãããšæããŸãã
ãããã®ãããããhttp2ããµããŒãããŠããŸããïŒ
@sakalys got
ã¯å®éšçãªHTTP2ãµããŒããåããŠãããããã¯çµã¿èŸŒã¿ã§ã次ã®ã¡ãžã£ãŒãªãªãŒã¹ïŒéããªããªãªãŒã¹ïŒã§å®å®ããŸãã
亀æã®ããããã«è¿ãïŒ
ãã®ã©ã€ãã©ãªãéæšå¥šã«ãªãã®ãèŠãã®ã¯æ¬åœã«æ²ããããšã§ãã ç§ã¯ã¢ã¯ã·ãªã¹ã奜ãã§ãããããã€ãã®ç®çã®ããã«ãèŠæ±ã¯ç§ã®æåã®éžæã§ããã
ãããã®ãµããŒããªã¯ãšã¹ãã®ã¿ã€ãã³ã°ã¯ã©ãã§ããïŒ æåã®ãã€ããŸã§ã®æéããããã¯ãŒã¯ã®é
ããªã©ïŒ
ãããžã§ã¯ãã«ãªã¯ãšã¹ãã©ã€ãã©ãªã䜿çšããŠããŸãããã¿ã€ãã³ã°ãéèŠã§ãã
Googleã¯gaxiosãæäŸããŠããŸãhttps://github.com/googleapis/gaxios-ããŒããã§ãããä»ããaxiosapi
got
readmeã®got
ãrequest
ãnode-fetch
ãaxios
ãããã³superagent
ã®éã®è¯ãæ¯èŒããããŸãïŒ https ïŒ//github.com/sindresorhus/got#comparison
_ïŒäžæ£ç¢ºãªç¹ãããã°ãPRãæè¿ããŸããå¯èœãªéãäžç«ã«ä¿ã€ããã«åªããŸããïŒ_
request
ãã移è¡ããããã®ç§»è¡ã¬ã€ãããããŸãïŒ https ïŒ//github.com/sindresorhus/got/blob/master/migration-guides.md
request
ãã移åããããã®Gotã®ç§»è¡ã¬ã€ãã«ã¯ã次ã®ããã«_移å_ãããŠããŸãã
https://github.com/sindresorhus/got/blob/master/documentation/migration-guides.md
postman-requestãè¿œå ããããšããå§ãããŸããïŒ æ¬¡ã®ãããžã§ã¯ãã§ãããè©ŠããŠã¿ãŸãã ãšã«ãããããã¯ããã¥ã¡ã³ãã§ããã«ã€ããŠèšãããŠããããšã§ã...
ããã¯ãPostmanRuntimeå ã§äœ¿çšãããåªãããªã¯ãšã¹ãã¢ãžã¥ãŒã«ã®ãã©ãŒã¯ã§ãã ãªã¯ãšã¹ãã§ä¿®æ£ãããŠããªãããã€ãã®ãã°ä¿®æ£ãå«ãŸããŠããŸãã
Redaxiosã¯ããã€ãã£ããã§ããã䜿çšãã800ãã€ãã®ãããªãã®ã§ãhttps://github.com/developit/redaxios
ããããïŒ ç§ã¯ããã3æéããç解ããŠããŠãã³ãŒããäœåºŠããã§ãã¯ããŠããŸããã ãããŠããã¯ç§ã«ãšã©ãŒ404ãäžããŸãããç§ã¯ã€ã©ã€ã©ããŸããã ã©ããããããšãã ç§ã¯ãã§ããã§è¡ããšæããŸãã
https://www.npmjs.com/package/teeny-requestã¯ãGoogleAPIã§äœ¿çšããããã1ã€ã®ãªãã·ã§ã³ã§ãã
ãªã¯ãšã¹ããšåæ§ã§ãããã¯ããã«å°ããããªãã·ã§ã³ãå°ãªããªããŸãã å éšã§ããŒããã§ããã䜿çšããŸãã ãªã¯ãšã¹ãã䜿çšããå Žæã«ãããããŸãã ã¢ãžã¥ãŒã«ã®ããŒããšè§£ææéãæ¹åããŸãã
node-fetch
ãŸãã¯çŸåšPostManã«ãã£ãŠç¶æãããŠããrequests
ã®ãã©ãŒã¯ããŒãžã§ã³ã®æ¹ãè¯ãã§ãããã Nodeãžã£ãŒããŒãå§ããã°ãããªã®ã§ãç°¡åãªãã®ãå¿
èŠã§ãã
axiosã®ã¿ã€ã ã¢ãŠãã¯ä¿®æ£ãããŠããªãããã§ãðð¿
ããã«ãã³ãèŠããªãã®ã¯ãšãŠãé©ããŸããã
url-request
ã©ãã§ããïŒ
url-request
ã©ãã§ããïŒ
ãŸã å°ãè¥ãïŒ1æ¥ïŒïŒãããŠïŒãããã£ãŠïŒããã€ãã®æ©èœãæ¬ ããŠããŸãããææã«èŠããŸã-泚ææ·±ãèŠå®ã£ãŠããŸãã
@cjkãã£ãŒãããã¯ãããããšããã©ã®æ©èœã奜ãã§ããïŒ ãã£ãšå ·äœçã«ã§ããã°ã
ã¯ã€ãã¯qã ãã€ãã£ãnodejshttpã®ä»£ããã«ãããã®ã©ã€ãã©ãªã䜿çšããå©ç¹ã¯äœã§ããïŒ
@cgarrovilloã¹ã¢ãŒã«ã³ãŒã=>ãã倧ããªåœ±é¿
url-requestãè©ŠããŠãæ©èœã»ãããšå¯èœæ§ãèŠãŠãã ããð€
@cjkãã£ãŒãããã¯ãããããšããã©ã®æ©èœã奜ãã§ããïŒ ãã£ãšå ·äœçã«ã§ããã°ã
@Debdutç§ã¯æ¬¡ã®ãããªæ©èœãèããŠããŸãïŒ
url-request
ã®ããã¥ã¡ã³ããããã©ããã©ã®ããã«ãµããŒããããŠãããã¯æããã§ã¯ãããŸããã
ããããç§ã¯ããªããæäŸããå€ãã®äŸã奜ãã§ããïŒ
ãªã¯ãšã¹ããæ©èœããªããªããŸã§ããªã¯ãšã¹ãã䜿ãç¶ããŠãã ããã
è§åºŠã®ããrxjsãšobservableã¯åªããŠããŸã
ãªã¯ãšã¹ãã®ãããªã¯ãããŒãžã£ãŒãæã£ãŠããã©ã€ãã©ãªã¯ãããŸããïŒ
ããŒãredã§HTTPã©ã€ãã©ãªãååŸããŸããã â
çµæ
HTTPãªã¯ãšã¹ããå®è¡ãããšãã«æ£åžžã«æ©èœããŸãã ïŒåäžã®ãã¹ããè¡ããŸããïŒã
HTTPSèŠæ±ãè¡ããšãã«å€±æâ ã ç§ãåŸãïŒ
RequestError: connect ECONNREFUSED 127.0.0.1:443
æåã¯ãããã¯node-redenvã«é¢é£ãããã®ã ãšæããŸããã åŸã§ãããã¯got repoã®æªè§£æ±ºã®åé¡ã§ããããšãããããŸããïŒ httpsïŒ//github.com/sindresorhus/got/issues/1414ã ð
ãããŠç§ã®æèŠã§ã¯ã代ããã«_axios_ãéžæããã®ã«ååãªçç±ã§ãã â
ãã ããªãã«ç¥ã£ãŠã»ããã£ãã
@damdauvaotranãªã¯ãšã¹ãã®ãããªã¯ãããŒãžã£ãŒãæã£ãŠããã©ã€ãã©ãªã¯ãããŸããïŒ
移è¡ã¬ã€ãã®got.jsãåç §ããŠãã ããã
ãªãgaxiosãèšåãããŠããªãã®ã§ããïŒ
FWIWãããã¯äžéšã«èšèŒãããŠãããã¹ãŠã®ãããžã§ã¯ããæ¯èŒããNPMãã¬ã³ããªã³ã¯ã§ãã 決å®ã«é¢äžããèŠå ã¯ããã ãã§ã¯ãããŸãããã人æ°ã¯ç§ãã¡ãšã»ãšãã©ã®ãããžã§ã¯ãã«ãšã£ãŠéåžžã«éèŠã§ãã
ãã®èšäºã®å·çæç¹ã§ã¯ã node-fetch
ãæã人æ°ã®ãã代æ¿æ段ã§ãã
èå³æ·±ã@ericsnap ...node-fetchãšaxiosã®äººæ°ã¯ããããã1çªç®ãš3çªç®ïŒã»ãŒ2çªç®ïŒã§ãã
ãããŠãç§ã¯gaxiosããã¥ã¡ã³ããã次ã®ã¹ãã©ããã©ã€ã³ã«æ³šæããŸãïŒ
ããŒããã§ããã®äžã«ã€ã³ã¿ãŒãã§ãŒã¹ã®ãããªaxiosãæäŸããHTTPãªã¯ãšã¹ãã¯ã©ã€ã¢ã³ã
ãããã£ãŠãgaxiosã¯æã人æ°ã®ãã2ã€ã®ã©ã€ãã©ãªãçµã¿åããããã®ã§ãã ç§ã¯gaxiosã«å€æããŠããŸãããã䜿çšããã®ã¯ãšãŠã楜ããã§ãã
https://www.npmtrends.com/node-fetch-vs-got-vs-axios-vs-superagent
çŸåšã®ãªã¯ãšã¹ãã®éžæè¢ã®æã確èªããåŸãç§ã¯æãåã£ãŠ@sindresorhusãååŸããŸããã APIã«æ
£ããã®ã«çŽ1æ¥ããããŸããïŒããã¥ã¡ã³ãã¯ããªãè¯ãã£ãã§ãïŒã extend
ãš1ã€ã®å Žæã§ã®èšå®ã«ãããLoCã倧å¹
ã«æžå°ããŸãããéåžžãã³ãŒã«ãµã€ããšãšã©ãŒåŠçã¯ã»ãã®äžæ¡ãã®LoCã§ãã ããã¯ããªã¯ãšã¹ãããªã¯ãšã¹ã-ãããã¹ããªã¯ãšã¹ã-ãããã¹-ãã€ãã£ããã³ã¹ãããã¯ããã«æ»ããã«æããŸãã çŽ æŽãããæ©èœã»ããããããŸãã çŽ æŽãããä»äºãš@sindresorhusã«æè¬ããŸãïŒ
移è¡ã楜ãã¿ã«ããŠããŸããã§ããããä»ã¯ãšãŠããããã«æããŠããŸãã
æãåèã«ãªãã³ã¡ã³ã
次ã®åãããŒãã«ã«è¿œå ãããšããå ŽåããããŸãã
ãããã®æ°å€ã䞊ã¹ããšãäžéšã®ã©ã€ãã©ãªã«ã¯æ¯é±æ°åã®æãšæ°çŸäžã®ããŠã³ããŒãããããŸãããä»ã®ã©ã€ãã©ãªã«ã¯æ°çŸããããŸãã
ç§ã®2ã»ã³ããç¡èŠããŠå ã«é²ãã§ã倧äžå€«ã§ããã³ã¡ã³ããä¿®æ£ãããç°è°ãå±ãããããå¿ èŠã¯ãããŸããã