äžçäžã®JavaScriptéçºè åãã«ãå¹ççãªããã±ãŒãžç®¡çãäŸåé¢ä¿ã®ã»ãã¥ãªãã£ãæé©åæŠç¥ãç¶²çŸ ããNPMãã¹ããã©ã¯ãã£ã¹ã®å æ¬çã¬ã€ãã
JavaScriptããã±ãŒãžç®¡çïŒNPMã®ãã¹ããã©ã¯ãã£ã¹ãšäŸåé¢ä¿ã®ã»ãã¥ãªãã£
åžžã«é²åãç¶ããJavaScriptéçºã®äžçã§ã¯ãå¹ççã§å®å šãªããã±ãŒãžç®¡çãæãéèŠã§ããNPMïŒNode Package ManagerïŒã¯ãNode.jsã®ããã©ã«ãã®ããã±ãŒãžãããŒãžã£ãŒã§ãããäžçæå€§ã®ãœãããŠã§ã¢ã¬ãžã¹ããªã§ãããã®ã¬ã€ãã§ã¯ãäžçäžã®ããããã¹ãã«ã¬ãã«ã®JavaScriptéçºè ã«ãšã£ãŠéèŠãªãNPMã®ãã¹ããã©ã¯ãã£ã¹ãšäŸåé¢ä¿ã®ã»ãã¥ãªãã£å¯Ÿçã«ã€ããŠå æ¬çã«è§£èª¬ããŸãã
NPMãšããã±ãŒãžç®¡çã®çè§£
NPMã¯ããããžã§ã¯ãã®äŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ã管çãæŽæ°ã®ããã»ã¹ãç°¡çŽ åããŸããããã«ãããéçºè ã¯ä»ã®äººãæžããã³ãŒããåå©çšã§ããæéãšåŽåãç¯çŽã§ããŸããããããäžé©åãªäœ¿çšã¯äŸåé¢ä¿ã®ç«¶åãã»ãã¥ãªãã£ã®è匱æ§ãããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
NPMãšã¯äœãïŒ
NPMã¯ã3ã€ã®ç°ãªãã³ã³ããŒãã³ãã§æ§æãããŠããŸãïŒ
- ãŠã§ããµã€ãïŒ ããã±ãŒãžãããã¥ã¡ã³ãããŠãŒã¶ãŒãããã¡ã€ã«ãæ€çŽ¢ã§ããã«ã¿ãã°ã
- ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ïŒCLIïŒïŒ ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã管çãå ¬éãè¡ãããã®ããŒã«ã
- ã¬ãžã¹ããªïŒ JavaScriptããã±ãŒãžã®å€§èŠæš¡ãªå ¬éããŒã¿ããŒã¹ã
ãªãããã±ãŒãžç®¡çãéèŠãªã®ãïŒ
广çãªããã±ãŒãžç®¡çã¯ãããã€ãã®å©ç¹ããããããŸãïŒ
- ã³ãŒãã®åå©çšæ§ïŒ æ¢åã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã掻çšããéçºæéãççž®ããŸãã
- äŸåé¢ä¿ã®ç®¡çïŒ è€éãªäŸåé¢ä¿ãšãã®ããŒãžã§ã³ãåŠçããŸãã
- äžè²«æ§ïŒ ããŒã ã¡ã³ããŒå šå¡ãåãããŒãžã§ã³ã®äŸåé¢ä¿ã䜿çšããããšãä¿èšŒããŸãã
- ã»ãã¥ãªãã£ïŒ è匱æ§ã«ããããåœãŠãã»ãã¥ãªãã£ä¿®æ£ãææ°ã®ç¶æ ã«ä¿ã¡ãŸãã
å¹ççãªéçºã®ããã®NPMãã¹ããã©ã¯ãã£ã¹
ãããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºã¯ãŒã¯ãããŒãšJavaScriptãããžã§ã¯ãã®å質ãå€§å¹ ã«åäžãããããšãã§ããŸãã
1. `package.json`ã®å¹æçãªäœ¿çš
`package.json`ãã¡ã€ã«ã¯ãããžã§ã¯ãã®äžå¿ã§ããããããžã§ã¯ããšãã®äŸåé¢ä¿ã«é¢ããã¡ã¿ããŒã¿ãå«ãŸããŠããŸããæ£ããèšå®ãããŠããããšã確èªããŠãã ããã
`package.json`ã®æ§é äŸïŒ
{
"name": "my-awesome-project",
"version": "1.0.0",
"description": "A brief description of the project.",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "jest",
"build": "webpack"
},
"keywords": [
"javascript",
"npm",
"package management"
],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"express": "^4.17.1",
"lodash": "~4.17.21"
},
"devDependencies": {
"jest": "^27.0.0",
"webpack": "^5.0.0"
}
}
- `name`ãš`version`ïŒ ãããžã§ã¯ããèå¥ããããŒãžã§ã³ç®¡çããããã«äžå¯æ¬ ã§ãã`version`ã«ã¯ã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ïŒSemVerïŒã«åŸããŸãã
- `description`ïŒ æç¢ºã§ç°¡æœãªèª¬æã¯ãä»ã®äººããããžã§ã¯ãã®ç®çãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
- `main`ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãŒãã€ã³ããæå®ããŸãã
- `scripts`ïŒ ãµãŒããŒã®èµ·åããã¹ãã®å®è¡ããããžã§ã¯ãã®ãã«ããªã©ã®äžè¬çãªã¿ã¹ã¯ãå®çŸ©ããŸããããã«ãããç°ãªãç°å¢éã§æšæºåãããå®è¡ãå¯èœã«ãªããŸããè€éãªã¹ã¯ãªããå®è¡ã·ããªãªã«ã¯`npm-run-all`ã®ãããªããŒã«ã®äœ¿çšãæ€èšããŠãã ããã
- `keywords`ïŒ ãŠãŒã¶ãŒãNPMã§ããªãã®ããã±ãŒãžãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
- `author`ãš`license`ïŒ èè æ å ±ãæäŸãããããžã§ã¯ããé åžãããã©ã€ã»ã³ã¹ãæå®ããŸããé©åãªã©ã€ã»ã³ã¹ïŒäŸïŒMIT, Apache 2.0, GPLïŒãéžæããããšã¯ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ãšã£ãŠéåžžã«éèŠã§ãã
- `dependencies`ïŒ ã¢ããªã±ãŒã·ã§ã³ãæ¬çªç°å¢ã§å®è¡ãããããã«å¿ èŠãªããã±ãŒãžããªã¹ãããŸãã
- `devDependencies`ïŒ ã¢ããªã±ãŒã·ã§ã³ã®éçºããã¹ãããã«ãã«å¿ èŠãªããã±ãŒãžïŒäŸïŒãªã³ã¿ãŒããã¹ããã¬ãŒã ã¯ãŒã¯ããã«ãããŒã«ïŒããªã¹ãããŸãã
2. ã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ïŒSemVerïŒã®çè§£
ã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ã¯ããœãããŠã§ã¢ã®ããŒãžã§ã³ç®¡çã«åºãæ¡çšãããŠããæšæºã§ããããã¯`ã¡ãžã£ãŒ.ãã€ããŒ.ããã`ãšãã3éšæ§æã®ããŒãžã§ã³çªå·ã䜿çšããŸãã
- ã¡ãžã£ãŒïŒ äºææ§ã®ãªãAPIã®å€æŽã
- ãã€ããŒïŒ åŸæ¹äºææ§ãä¿ã¡ã€ã€æ©èœã远å ã
- ãããïŒ åŸæ¹äºææ§ã®ãããã°ä¿®æ£ã
`package.json`ã§äŸåé¢ä¿ã®ããŒãžã§ã³ãæå®ããéã«ã¯ãäºææ§ã確ä¿ãã€ã€æè»æ§ãæãããããã«ããŒãžã§ã³ç¯å²ã䜿çšããŸãïŒ
- `^`ïŒãã£ã¬ããïŒïŒ 巊端ã®ãŒãã§ãªãæ°åã倿ŽããªãæŽæ°ãèš±å¯ããŸãïŒäŸïŒ`^1.2.3`ã¯`1.3.0`ã`1.9.9`ãžã®æŽæ°ãèš±å¯ããŸããã`2.0.0`ã¯èš±å¯ããŸããïŒãããã¯æãäžè¬çã§ãéåžžæšå¥šãããã¢ãããŒãã§ãã
- `~`ïŒãã«ãïŒïŒ å³ç«¯ã®æ°åãžã®æŽæ°ãèš±å¯ããŸãïŒäŸïŒ`~1.2.3`ã¯`1.2.4`ã`1.2.9`ãžã®æŽæ°ãèš±å¯ããŸããã`1.3.0`ã¯èš±å¯ããŸããïŒã
- `>` `>=` `<` `<=` `=`ïŒ æå°ãŸãã¯æå€§ã®ããŒãžã§ã³ãæå®ã§ããŸãã
- `*`ïŒ ä»»æã®ããŒãžã§ã³ãèš±å¯ããŸããç Žå£ç倿Žã®å¯èœæ§ããããããæ¬çªç°å¢ã§ã®äœ¿çšã¯äžè¬çã«æšå¥šãããŸããã
- ãã¬ãã£ãã¯ã¹ãªãïŒ æ£ç¢ºãªããŒãžã§ã³ãæå®ããŸãïŒäŸïŒ`1.2.3`ïŒãäŸåé¢ä¿ã®ç«¶åãåŒãèµ·ããå¯èœæ§ããããäžè¬çã«æšå¥šãããŸããã
äŸïŒ `"express": "^4.17.1"`ã¯ãNPMãExpressã®4.17.xã®ä»»æã®ããŒãžã§ã³ïŒ4.17.2ã4.17.9ãªã©ïŒãã€ã³ã¹ããŒã«ããããšãèš±å¯ããŸããã4.18.0ã5.0.0ã¯èš±å¯ããŸããã
3. `npm install`ã®å¹æçãªäœ¿çš
`npm install`ã³ãã³ãã¯ã`package.json`ã§å®çŸ©ãããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããã«äœ¿çšãããŸãã
- `npm install`ïŒ `package.json`ã«ãªã¹ããããŠãããã¹ãŠã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã
- `npm install
`ïŒ ç¹å®ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ãã`package.json`ã®`dependencies`ã«è¿œå ããŸãã - `npm install
--save-dev`ïŒ ç¹å®ã®ããã±ãŒãžãéçºäŸåé¢ä¿ãšããŠã€ã³ã¹ããŒã«ãã`package.json`ã®`devDependencies`ã«è¿œå ããŸãã`npm install -D`ãšåçã§ãã - `npm install -g
`ïŒ ããã±ãŒãžãã°ããŒãã«ã«ã€ã³ã¹ããŒã«ããã·ã¹ãã ã®ã³ãã³ãã©ã€ã³ã§å©çšå¯èœã«ããŸããæ³šæããŠäœ¿çšããã°ããŒãã«ã§ã®äœ¿çšãæå³ãããŠããããŒã«ïŒäŸïŒ`npm install -g eslint`ïŒã«ã®ã¿äœ¿çšããŠãã ããã
4. ã¯ãªãŒã³ã€ã³ã¹ããŒã«ã®ããã®`npm ci`ã®æŽ»çš
`npm ci`ã³ãã³ãïŒClean InstallïŒã¯ãCI/CDãã€ãã©ã€ã³ãªã©ã®èªååãããç°å¢ã§ãããéããããä¿¡é Œæ§ãé«ããå®å šã«äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããæ¹æ³ãæäŸããŸããããã¯`package-lock.json`ãŸãã¯`npm-shrinkwrap.json`ãã¡ã€ã«ãããå Žåã«äœ¿çšããããã«èšèšãããŠããŸãã
`npm ci`ã®äž»ãªå©ç¹ïŒ
- ããéãïŒ `npm install`ã«ãã£ãŠå®è¡ãããç¹å®ã®ãã§ãã¯ãã¹ãããããŸãã
- ããä¿¡é Œæ§ãé«ãïŒ `package-lock.json`ãŸãã¯`npm-shrinkwrap.json`ã§æå®ãããäŸåé¢ä¿ã®æ£ç¢ºãªããŒãžã§ã³ãã€ã³ã¹ããŒã«ããäžè²«æ§ãä¿èšŒããŸãã
- å®å šïŒ ç Žå£ç倿Žãè匱æ§ãå°å ¥ããå¯èœæ§ã®ããäŸåé¢ä¿ã®å¶çºçãªæŽæ°ãé²ããŸããããã¯ãã¡ã€ã«ã«ä¿åãããæå·ããã·ã¥ã䜿çšããŠãã€ã³ã¹ããŒã«ãããããã±ãŒãžã®æŽåæ§ãæ€èšŒããŸãã
`npm ci`ã䜿çšããå Žé¢ïŒ CI/CDç°å¢ãæ¬çªç°å¢ãžã®ãããã€ã¡ã³ãããã®ä»åçŸå¯èœã§ä¿¡é Œæ§ã®é«ããã«ããå¿ èŠãªããããç¶æ³ã§äœ¿çšããŸããããŒã«ã«ã®éçºç°å¢ã§äŸåé¢ä¿ãé »ç¹ã«è¿œå ãŸãã¯æŽæ°ããå Žåã«ã¯äœ¿çšããªãã§ãã ãããããŒã«ã«éçºã«ã¯`npm install`ã䜿çšããŸãã
5. `package-lock.json`ã®çè§£ãšäœ¿çš
`package-lock.json`ãã¡ã€ã«ïŒãŸãã¯å€ãããŒãžã§ã³ã®NPMã§ã¯`npm-shrinkwrap.json`ïŒã¯ããããžã§ã¯ãã«ã€ã³ã¹ããŒã«ããããã¹ãŠã®äŸåé¢ä¿ïŒæšç§»çãªäŸåé¢ä¿ãã€ãŸãäŸåé¢ä¿ã®äŸåé¢ä¿ãå«ãïŒã®æ£ç¢ºãªããŒãžã§ã³ãèšé²ããŸããããã«ããããããžã§ã¯ãã«åãçµãå šå¡ãåãããŒãžã§ã³ã®äŸåé¢ä¿ã䜿çšããããšãä¿èšŒãããäžæŽåãæœåšçãªåé¡ã鲿¢ããŸãã
- `package-lock.json`ãããŒãžã§ã³ç®¡çã·ã¹ãã ã«ã³ãããããïŒ ããã¯ãç°ãªãç°å¢éã§äžè²«ãããã«ããä¿èšŒããããã«éåžžã«éèŠã§ãã
- `package-lock.json`ãæåã§ç·šéããªãïŒ äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãŸãã¯æŽæ°ããéã«ãNPMãèªåçã«ãã¡ã€ã«ã管çããããã«ããŸããæåã§ã®ç·šéã¯äžæŽåãåŒãèµ·ããå¯èœæ§ããããŸãã
- èªååãããç°å¢ã§`npm ci`ã䜿çšããïŒ äžè¿°ã®éãããã®ã³ãã³ãã¯`package-lock.json`ãã¡ã€ã«ã䜿çšããŠã¯ãªãŒã³ã§ä¿¡é Œæ§ã®é«ãã€ã³ã¹ããŒã«ãå®è¡ããŸãã
6. äŸåé¢ä¿ãææ°ã«ä¿ã€
äŸåé¢ä¿ã宿çã«æŽæ°ããããšã¯ãã»ãã¥ãªãã£ãšããã©ãŒãã³ã¹ã«ãšã£ãŠäžå¯æ¬ ã§ããå€ãäŸåé¢ä¿ã«ã¯ãæ¢ç¥ã®è匱æ§ãããã©ãŒãã³ã¹ã®åé¡ãå«ãŸããŠããå¯èœæ§ããããŸããããããç¡èšç»ã«æŽæ°ãããšç Žå£ç倿Žãå°å ¥ããå¯èœæ§ããããŸãããã©ã³ã¹ã®åããã¢ãããŒããéµãšãªããŸãã
- `npm update`ïŒ `package.json`ã§æå®ãããããŒãžã§ã³ç¯å²ã§èš±å¯ãããææ°ããŒãžã§ã³ã«ããã±ãŒãžãæŽæ°ããããšããŸããåºãããŒãžã§ã³ç¯å²ïŒäŸïŒ`^`ïŒã䜿çšããŠããå Žåãç Žå£ç倿Žãå°å ¥ããå¯èœæ§ãããããã`npm update`å®è¡åŸã¯å€æŽãæ éã«ã¬ãã¥ãŒããŠãã ããã
- `npm outdated`ïŒ å€ãããã±ãŒãžãšããããã®çŸåšãèŠæ±ãææ°ã®ããŒãžã§ã³ããªã¹ãããŸããããã«ãããã©ã®ããã±ãŒãžãæŽæ°ããå¿ èŠãããããç¹å®ã§ããŸãã
- äŸåé¢ä¿æŽæ°ããŒã«ã䜿çšããïŒ Renovate BotãDependabotïŒGitHubã«çµ±åïŒã®ãããªããŒã«ã䜿çšããŠãäŸåé¢ä¿ã®æŽæ°ãèªååãããã«ãªã¯ãšã¹ããäœæããããšãæ€èšããŠãã ããããããã®ããŒã«ã¯ãã»ãã¥ãªãã£è匱æ§ã®ç¹å®ãšä¿®æ£ã«ã圹ç«ã¡ãŸãã
- æŽæ°åŸã«åŸ¹åºçã«ãã¹ãããïŒ ãã¹ãã¹ã€ãŒããå®è¡ããŠãæŽæ°ããªã°ã¬ãã·ã§ã³ãç Žå£ç倿Žãå°å ¥ããŠããªãããšã確èªããŠãã ããã
7. `node_modules`ã®ã¯ãªãŒã³ã¢ãã
`node_modules`ãã£ã¬ã¯ããªã¯éåžžã«å€§ãããªããæªäœ¿çšãŸãã¯åé·ãªããã±ãŒãžãå«ãããšããããŸãã宿çã«ã¯ãªãŒã³ã¢ããããããšã§ãããã©ãŒãã³ã¹ãåäžããããã£ã¹ã¯ã¹ããŒã¹ã®äœ¿çšéãåæžã§ããŸãã
- `npm prune`ïŒ äœåãªããã±ãŒãžãåé€ããŸããäœåãªããã±ãŒãžãšã¯ã`package.json`ã«äŸåé¢ä¿ãšããŠãªã¹ããããŠããªããã®ã§ãã
- `rimraf`ã`del-cli`ã®äœ¿çšãæ€èšããïŒ ãããã®ããŒã«ã¯ã`node_modules`ãã£ã¬ã¯ããªã匷å¶çã«åé€ããããã«äœ¿çšã§ããŸããããã¯å®å šã«ã¯ãªãŒã³ãªã€ã³ã¹ããŒã«ã«åœ¹ç«ã¡ãŸããããã£ã¬ã¯ããªå ã®ãã¹ãŠãåé€ããããæ³šæãå¿ èŠã§ããäŸïŒ`npx rimraf node_modules`ã
8. å¹ççãªNPMã¹ã¯ãªããã®äœæ
NPMã¹ã¯ãªããã䜿çšãããšãäžè¬çãªéçºã¿ã¹ã¯ãèªååã§ããŸãã`package.json`ãã¡ã€ã«ã«ãæç¢ºã§ç°¡æœããã€åå©çšå¯èœãªã¹ã¯ãªãããèšè¿°ããŠãã ããã
äŸïŒ
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest",
"build": "webpack --mode production",
"lint": "eslint .",
"format": "prettier --write ."
}
- èšè¿°çãªã¹ã¯ãªããåã䜿çšããïŒ ã¹ã¯ãªããã®ç®çãæç¢ºã«ç€ºãååïŒäŸïŒ`build`, `test`, `lint`ïŒãéžæããŸãã
- ã¹ã¯ãªãããç°¡æœã«ä¿ã€ïŒ ã¹ã¯ãªãããè€éã«ãªããããå Žåã¯ãããžãã¯ãå¥ã®ãã¡ã€ã«ã«ç§»åãããã®ãã¡ã€ã«ãã¹ã¯ãªããããåŒã³åºãããšãæ€èšããŠãã ããã
- ç°å¢å€æ°ã䜿çšããïŒ ã¹ã¯ãªãããèšå®ããããã«ç°å¢å€æ°ã䜿çšãã`package.json`ãã¡ã€ã«ã«å€ãããŒãã³ãŒãã£ã³ã°ããã®ãé¿ããŸããããšãã°ã`NODE_ENV`ç°å¢å€æ°ã`production`ãŸãã¯`development`ã«èšå®ããããããã«ãã¹ã¯ãªããã§äœ¿çšã§ããŸãã
- ã©ã€ããµã€ã¯ã«ã¹ã¯ãªãããæŽ»çšããïŒ NPMã¯ãããã±ãŒãžã®ã©ã€ããµã€ã¯ã«ã®ç¹å®ã®æç¹ã§èªåçã«å®è¡ãããã©ã€ããµã€ã¯ã«ã¹ã¯ãªããïŒäŸïŒ`preinstall`, `postinstall`, `prepublishOnly`ïŒãæäŸããŸãããããã®ã¹ã¯ãªããã䜿çšããŠãç°å¢å€æ°ã®èšå®ãå ¬éåã®ãã¹ãå®è¡ãªã©ã®ã¿ã¹ã¯ãå®è¡ããŸãã
9. 責任ããããã±ãŒãžã®å ¬é
NPMã«ç¬èªã®ããã±ãŒãžãå ¬éããå Žåã¯ã以äžã®ã¬ã€ãã©ã€ã³ã«åŸã£ãŠãã ããïŒ
- ãŠããŒã¯ã§èšè¿°çãªååãéžã¶ïŒ ãã§ã«äœ¿çšãããŠããååããäžè¬çãããååã¯é¿ããŠãã ããã
- æç¢ºã§å æ¬çãªããã¥ã¡ã³ããäœæããïŒ ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã䜿çšãè²¢ç®æ¹æ³ã«é¢ããæç¢ºãªæç€ºãæäŸããŸãã
- ã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ã䜿çšããïŒ SemVerã«åŸã£ãŠããã±ãŒãžãæ£ããããŒãžã§ã³ç®¡çãã倿ŽããŠãŒã¶ãŒã«äŒããŸãã
- ããã±ãŒãžã培åºçã«ãã¹ãããïŒ ããã±ãŒãžãæåŸ ã©ããã«åäœãããã°ãå«ãŸããŠããªãããšã確èªããŸãã
- NPMã¢ã«ãŠã³ããä¿è·ããïŒ åŒ·åãªãã¹ã¯ãŒãã䜿çšããäºèŠçŽ èªèšŒãæå¹ã«ããŸãã
- ã¹ã³ãŒãã®äœ¿çšãæ€èšããïŒ çµç¹åãã«ããã±ãŒãžãå ¬éããå Žåã¯ãã¹ã³ãŒãä»ãã®ããã±ãŒãžåïŒäŸïŒ`@my-org/my-package`ïŒã䜿çšããŸããããã«ãããåœåã®ç«¶åãé²ããããè¯ãæŽçãå¯èœã«ãªããŸãã
äŸåé¢ä¿ã®ã»ãã¥ãªãã£ïŒãããžã§ã¯ãã®ä¿è·
äŸåé¢ä¿ã®ã»ãã¥ãªãã£ã¯ãçŸä»£ã®JavaScriptéçºã«ãããŠéåžžã«éèŠãªåŽé¢ã§ãããããžã§ã¯ãã®ã»ãã¥ãªãã£ã¯ããã®æã匱ãäŸåé¢ä¿ã®åŒ·åºŠã«ãããããŸãããäŸåé¢ä¿ã®è匱æ§ã¯ãã¢ããªã±ãŒã·ã§ã³ãšãã®ãŠãŒã¶ãŒãå±éºã«ãããããã«æªçšãããå¯èœæ§ããããŸãã
1. äŸåé¢ä¿ã®è匱æ§ãçè§£ãã
äŸåé¢ä¿ã®è匱æ§ãšã¯ããããžã§ã¯ããäŸåããŠãããµãŒãããŒãã£ã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã«ååšããã»ãã¥ãªãã£äžã®æ¬ é¥ã§ãããããã®è匱æ§ã¯ã軜埮ãªåé¡ãããæ»æè ã«ãã£ãŠæªçšãããå¯èœæ§ã®ããé倧ãªã»ãã¥ãªãã£ãªã¹ã¯ãŸã§å€å²ã«ããããŸãããããã®è匱æ§ã¯ãå ¬ã«å ±åãããã€ã³ã·ãã³ããå éšã§çºèŠãããåé¡ããŸãã¯èªåè匱æ§ã¹ãã£ã³ããŒã«ã«ãã£ãŠèŠã€ããããšããããŸãã
2. `npm audit`ã䜿çšããŠè匱æ§ãç¹å®ãã
`npm audit`ã³ãã³ãã¯ããããžã§ã¯ãã®äŸåé¢ä¿ãã¹ãã£ã³ããŠæ¢ç¥ã®è匱æ§ãæ€åºãããã®ä¿®æ£æ¹æ³ã«é¢ããæšå¥šäºé ãæäŸããŸãã
- `npm audit`ã宿çã«å®è¡ããïŒ äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãŸãã¯æŽæ°ãããã³ã«ããŸãCI/CDãã€ãã©ã€ã³ã®äžéšãšããŠ`npm audit`ãå®è¡ããç¿æ £ãã€ããŸãããã
- æ·±å»åºŠã¬ãã«ãçè§£ããïŒ NPMã¯è匱æ§ãäœãäžãé«ãã¯ãªãã£ã«ã«ã«åé¡ããŸããæãæ·±å»ãªè匱æ§ã®ä¿®æ£ãåªå ããŠãã ããã
- æšå¥šäºé ã«åŸãïŒ NPMã¯ã圱é¿ãåããããã±ãŒãžã®æ°ããããŒãžã§ã³ãžã®æŽæ°ããããã®é©çšãªã©ãè匱æ§ã®ä¿®æ£æ¹æ³ã«é¢ããæšå¥šäºé ãæäŸããŸããå Žåã«ãã£ãŠã¯ä¿®æ£ãå©çšã§ãããè匱ãªããã±ãŒãžã眮ãæããããšãæ€èšããå¿ èŠããããããããŸããã
- `npm audit fix`ïŒ ããã±ãŒãžãå®å šãªããŒãžã§ã³ã«æŽæ°ããããšã§ãè匱æ§ãèªåçã«ä¿®æ£ããããšããŸããç Žå£ç倿Žãå°å ¥ããå¯èœæ§ããããããæ³šæããŠäœ¿çšããŠãã ããã`npm audit fix`ãå®è¡ããåŸã¯ãå¿ ãã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããŠãã ããã
3. èªåè匱æ§ã¹ãã£ã³ããŒã«ã®äœ¿çš
`npm audit`ã«å ããŠãããå æ¬çã§ç¶ç¶çãªäŸåé¢ä¿ã®ç£èŠãæäŸããããã«ãå°çšã®è匱æ§ã¹ãã£ã³ããŒã«ã®äœ¿çšãæ€èšããŠãã ããã
- SnykïŒ CI/CDãã€ãã©ã€ã³ãšçµ±åããè匱æ§ã«é¢ãã詳现ãªã¬ããŒããæäŸãã人æ°ã®è匱æ§ã¹ãã£ã³ããŒã«ã
- OWASP Dependency-CheckïŒ ãããžã§ã¯ãã®äŸåé¢ä¿ã«ããæ¢ç¥ã®è匱æ§ãç¹å®ãããªãŒãã³ãœãŒã¹ããŒã«ã
- WhiteSource BoltïŒ GitHubãªããžããªåãã®ç¡æã®è匱æ§ã¹ãã£ã³ããŒã«ã
4. äŸåé¢ä¿æ··åæ»æ
äŸåé¢ä¿æ··åïŒDependency ConfusionïŒã¯ãæ»æè ãçµç¹ã§äœ¿çšãããŠãããã©ã€ããŒãããã±ãŒãžãšåãååã§ãããé«ãããŒãžã§ã³çªå·ãæã€ããã±ãŒãžãå ¬éããæ»æã®äžçš®ã§ããçµç¹ã®ãã«ãã·ã¹ãã ãäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããšãããšããã©ã€ããŒãããã±ãŒãžã®ä»£ããã«æ»æè ã®æªæã®ããããã±ãŒãžã誀ã£ãŠã€ã³ã¹ããŒã«ããŠããŸãå¯èœæ§ããããŸãã
ç·©åæŠç¥ïŒ
- ã¹ã³ãŒãä»ãããã±ãŒãžã䜿çšããïŒ äžè¿°ã®éãããã©ã€ããŒãããã±ãŒãžã«ã¯ã¹ã³ãŒãä»ãããã±ãŒãžïŒäŸïŒ`@my-org/my-package`ïŒã䜿çšããŸããããã«ãããå ¬éããã±ãŒãžãšã®åœåã®ç«¶åãé²ããŸãã
- NPMã¯ã©ã€ã¢ã³ããèšå®ããïŒ ä¿¡é Œã§ããã¬ãžã¹ããªããã®ã¿ããã±ãŒãžãã€ã³ã¹ããŒã«ããããã«NPMã¯ã©ã€ã¢ã³ããèšå®ããŸãã
- ã¢ã¯ã»ã¹å¶åŸ¡ãå®è£ ããïŒ ãã©ã€ããŒãããã±ãŒãžãšãªããžããªãžã®ã¢ã¯ã»ã¹ãå¶éããŸãã
- äŸåé¢ä¿ãç£èŠããïŒ äºæããªã倿Žãè匱æ§ããªãããäŸåé¢ä¿ã宿çã«ç£èŠããŸãã
5. ãµãã©ã€ãã§ãŒã³ã»ãã¥ãªãã£
ãµãã©ã€ãã§ãŒã³ã»ãã¥ãªãã£ãšã¯ãã³ãŒããäœæããéçºè ãããããæ¶è²»ãããŠãŒã¶ãŒãŸã§ããœãããŠã§ã¢ãµãã©ã€ãã§ãŒã³å šäœã®ã»ãã¥ãªãã£ãæããŸããäŸåé¢ä¿ã®è匱æ§ã¯ããµãã©ã€ãã§ãŒã³ã»ãã¥ãªãã£ã«ãããäž»èŠãªæžå¿µäºé ã§ãã
ãµãã©ã€ãã§ãŒã³ã»ãã¥ãªãã£ãåäžãããããã®ãã¹ããã©ã¯ãã£ã¹ïŒ
- ããã±ãŒãžã®æŽåæ§ãæ€èšŒããïŒ `npm install --integrity`ã®ãããªããŒã«ã䜿çšããŠãæå·ããã·ã¥ãçšããŠããŠã³ããŒããããããã±ãŒãžã®æŽåæ§ãæ€èšŒããŸãã
- 眲åä»ãããã±ãŒãžã䜿çšããïŒ ããã±ãŒãžã¡ã³ãããŒã«ãæå·çœ²åã䜿çšããŠããã±ãŒãžã«çœ²åãããã奚å±ããŸãã
- äŸåé¢ä¿ãç£èŠããïŒ è匱æ§ãäžå¯©ãªæŽ»åããªãããäŸåé¢ä¿ãç¶ç¶çã«ç£èŠããŸãã
- ã»ãã¥ãªãã£ããªã·ãŒãå®è£ ããïŒ çµç¹ã®æç¢ºãªã»ãã¥ãªãã£ããªã·ãŒãå®çŸ©ãããã¹ãŠã®éçºè ããããèªèããŠããããšã確èªããŸãã
6. ã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠåžžã«æ å ±ãåŸã
ã»ãã¥ãªãã£ã®ç¶æ³ã¯åžžã«å€åããŠãããããææ°ã®ã»ãã¥ãªãã£ãã¹ããã©ã¯ãã£ã¹ãè匱æ§ã«ã€ããŠåžžã«æ å ±ãåŸãããšãéèŠã§ãã
- ã»ãã¥ãªãã£ããã°ããã¥ãŒã¹ã¬ã¿ãŒããã©ããŒããïŒ ã»ãã¥ãªãã£ããã°ããã¥ãŒã¹ã¬ã¿ãŒã賌èªããŠãææ°ã®è åšãè匱æ§ã«é¢ããæ å ±ãå ¥æããŸãã
- ã»ãã¥ãªãã£ã«ã³ãã¡ã¬ã³ã¹ãã¯ãŒã¯ã·ã§ããã«åå ããïŒ ã»ãã¥ãªãã£ã«ã³ãã¡ã¬ã³ã¹ãã¯ãŒã¯ã·ã§ããã«åå ããŠãå°éå®¶ããåŠã³ãä»ã®ã»ãã¥ãªãã£å°éå®¶ãšãããã¯ãŒã¯ãç¯ããŸãã
- ã»ãã¥ãªãã£ã³ãã¥ããã£ã«åå ããïŒ ãªã³ã©ã€ã³ãã©ãŒã©ã ãã³ãã¥ããã£ã«åå ããŠãç¥èãå ±æããä»ã®äººããåŠã³ãŸãã
NPMã®æé©åæŠç¥
NPMã¯ãŒã¯ãããŒãæé©åããããšã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããããã«ãæéãççž®ã§ããŸãã
1. ããŒã«ã«NPMãã£ãã·ã¥ã®äœ¿çš
NPMã¯ããŠã³ããŒãããããã±ãŒãžãããŒã«ã«ã«ãã£ãã·ã¥ããããããã®åŸã®ã€ã³ã¹ããŒã«ã¯é«éã«ãªããŸããããŒã«ã«NPMãã£ãã·ã¥ãæ£ããèšå®ãããŠããããšã確èªããŠãã ããã
- `npm cache clean --force`ïŒ NPMãã£ãã·ã¥ãã¯ãªã¢ããŸãããã£ãã·ã¥ããŒã¿ãç ŽæããŠããåé¡ãçºçããå Žåã«ãã®ã³ãã³ãã䜿çšããŸãã
- ãã£ãã·ã¥ã®å Žæã確èªããïŒ `npm config get cache`ã䜿çšããŠãnpmãã£ãã·ã¥ã®å Žæã確èªããŸãã
2. ããã±ãŒãžãããŒãžã£ãŒã®ãã©ãŒãŸãã¯ãããã·ã®äœ¿çš
ã€ã³ã¿ãŒãããæ¥ç¶ãéãããŠããç°å¢ã§äœæ¥ããŠããå ŽåããããŠã³ããŒãé床ãåäžãããå¿ èŠãããå Žåã¯ãããã±ãŒãžãããŒãžã£ãŒã®ãã©ãŒãŸãã¯ãããã·ã®äœ¿çšãæ€èšããŠãã ããã
- VerdaccioïŒ è»œéãªãã©ã€ããŒãNPMãããã·ã¬ãžã¹ããªã
- Nexus Repository ManagerïŒ NPMãä»ã®ããã±ãŒãžåœ¢åŒããµããŒããããããå æ¬çãªãªããžããªãããŒãžã£ãŒã
- JFrog ArtifactoryïŒ äŸåé¢ä¿ã®ç®¡çãšä¿è·ã®ããã®é«åºŠãªæ©èœãæäŸãããããäžã€ã®äººæ°ã®ãããªããžããªãããŒãžã£ãŒã
3. äŸåé¢ä¿ã®æå°å
ãããžã§ã¯ãã®äŸåé¢ä¿ãå°ãªããã°å°ãªãã»ã©ããã«ãã¯éããªããã»ãã¥ãªãã£è åšã«å¯Ÿããè匱æ§ãäœããªããŸããåäŸåé¢ä¿ãæ éã«è©äŸ¡ããæ¬åœã«å¿ èŠãªãã®ã ããå«ããããã«ããŠãã ããã
- ããªãŒã·ã§ã€ãã³ã°ïŒ ããªãŒã·ã§ã€ãã³ã°ã䜿çšããŠãäŸåé¢ä¿ããæªäœ¿çšã®ã³ãŒããåé€ããŸããWebpackãRollupã®ãããªããŒã«ãããªãŒã·ã§ã€ãã³ã°ããµããŒãããŠããŸãã
- ã³ãŒãåå²ïŒ ã³ãŒãåå²ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ãããå°ããªãã£ã³ã¯ã«åå²ãããªã³ããã³ãã§ããŒãã§ããããã«ããŸããããã«ãããåæããŒãæéãæ¹åã§ããŸãã
- ãã€ãã£ããªä»£æ¿æ¡ãæ€èšããïŒ äŸåé¢ä¿ã远å ããåã«ããã€ãã£ãã®JavaScript APIã䜿çšããŠåãæ©èœãå®çŸã§ãããã©ãããæ€èšããŠãã ããã
4. `node_modules`ã®ãµã€ãºæé©å
`node_modules`ãã£ã¬ã¯ããªã®ãµã€ãºãåæžããããšã§ãããã©ãŒãã³ã¹ãåäžããããããã€æéãççž®ã§ããŸãã
- `npm dedupe`ïŒ å ±éã®äŸåé¢ä¿ãããªãŒã®äžäœã«ç§»åãããããšã§ãäŸåé¢ä¿ããªãŒãåçŽåããããšããŸãã
- `pnpm`ãŸãã¯`yarn`ã䜿çšããïŒ ãããã®ããã±ãŒãžãããŒãžã£ãŒã¯ãããŒããªã³ã¯ãã·ã³ããªãã¯ãªã³ã¯ã䜿çšããŠè€æ°ã®ãããžã§ã¯ãéã§ããã±ãŒãžãå ±æããããšã«ããã`node_modules`ãã£ã¬ã¯ããªã®ãµã€ãºãå€§å¹ ã«åæžã§ããç°ãªãã¢ãããŒãã§äŸåé¢ä¿ã管çããŸãã
çµè«
NPMã«ããJavaScriptããã±ãŒãžç®¡çãç¿åŸããããšã¯ãã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœããã€å®å šãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ãããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸããäŸåé¢ä¿ã®ã»ãã¥ãªãã£ãåªå ããããšã§ãéçºè ã¯ã¯ãŒã¯ãããŒãå€§å¹ ã«æ¹åãããªã¹ã¯ã軜æžããäžçäžã®ãŠãŒã¶ãŒã«é«å質ã®ãœãããŠã§ã¢ãæäŸã§ããŸããææ°ã®ã»ãã¥ãªãã£è åšããã¹ããã©ã¯ãã£ã¹ã«ã€ããŠåžžã«ææ°æ å ±ãå ¥æããJavaScriptãšã³ã·ã¹ãã ãé²åãç¶ããã«ã€ããŠã¢ãããŒããé©å¿ãããããšãå¿ããªãã§ãã ããã