[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"\u002Fblog\u002Fchange-default-npm-global-package-location":3,"$fiDsY_zxVX6IYag3SMYqEy0iIdfaL8W8Vl9vAaLAE5OI":435,"i-local-icon:calendar-days":439,"i-local-icon:tag":444,"i-local-icon:eye":446},{"id":4,"title":5,"body":6,"categories_slug":423,"comment_count":426,"date_published":427,"description":428,"extension":429,"meta":430,"navigation":237,"path":431,"seo":432,"stem":433,"__hash__":434},"content\u002Fblog\u002F18.change-default-npm-global-package-location.md","Change NPM Global Package Location on macOS to Avoid Permission Errors",{"type":7,"value":8,"toc":410},"minimark",[9,13,18,23,27,68,75,79,85,89,94,107,111,132,135,159,163,169,190,195,211,215,252,256,262,280,283,296,300,305,322,327,341,345,357,403,406],[10,11,5],"h1",{"id":12},"change-npm-global-package-location-on-macos-to-avoid-permission-errors",[14,15],"meta-card",{":categories":16,":date":17},"categories_slug","date_published",[19,20,22],"h2",{"id":21},"problem","Problem",[24,25,26],"p",{},"When installing global NPM packages on macOS, you might encounter permission errors like:",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-bash shiki shiki-themes github-dark","npm ERR! Error: EACCES: permission denied, mkdir '\u002Fusr\u002Flocal\u002Flib\u002Fnode_modules'\n","bash","",[35,36,37],"code",{"__ignoreMap":33},[38,39,42,46,50,53,56,59,62,65],"span",{"class":40,"line":41},"line",1,[38,43,45],{"class":44},"svObZ","npm",[38,47,49],{"class":48},"sU2Wk"," ERR!",[38,51,52],{"class":48}," Error:",[38,54,55],{"class":48}," EACCES:",[38,57,58],{"class":48}," permission",[38,60,61],{"class":48}," denied,",[38,63,64],{"class":48}," mkdir",[38,66,67],{"class":48}," '\u002Fusr\u002Flocal\u002Flib\u002Fnode_modules'\n",[24,69,70,71,74],{},"This forces you to use ",[35,72,73],{},"sudo npm install -g package-name",".",[19,76,78],{"id":77},"solution","Solution",[24,80,81,82,74],{},"Configure NPM to use a custom directory in your home folder where you have full permissions. This eliminates permission errors and the need for ",[35,83,84],{},"sudo",[19,86,88],{"id":87},"setup-steps","Setup Steps",[90,91,93],"h3",{"id":92},"_1-create-global-packages-directory","1. Create Global Packages Directory",[28,95,97],{"className":30,"code":96,"language":32,"meta":33,"style":33},"mkdir ~\u002F.npm-global\n",[35,98,99],{"__ignoreMap":33},[38,100,101,104],{"class":40,"line":41},[38,102,103],{"class":44},"mkdir",[38,105,106],{"class":48}," ~\u002F.npm-global\n",[90,108,110],{"id":109},"_2-configure-npm-prefix","2. Configure NPM Prefix",[28,112,114],{"className":30,"code":113,"language":32,"meta":33,"style":33},"npm config set prefix '~\u002F.npm-global'\n",[35,115,116],{"__ignoreMap":33},[38,117,118,120,123,126,129],{"class":40,"line":41},[38,119,45],{"class":44},[38,121,122],{"class":48}," config",[38,124,125],{"class":48}," set",[38,127,128],{"class":48}," prefix",[38,130,131],{"class":48}," '~\u002F.npm-global'\n",[24,133,134],{},"Verify the configuration:",[28,136,138],{"className":30,"code":137,"language":32,"meta":33,"style":33},"npm config get prefix\n# Should output: \u002FUsers\u002Fyour_username\u002F.npm-global\n",[35,139,140,152],{"__ignoreMap":33},[38,141,142,144,146,149],{"class":40,"line":41},[38,143,45],{"class":44},[38,145,122],{"class":48},[38,147,148],{"class":48}," get",[38,150,151],{"class":48}," prefix\n",[38,153,155],{"class":40,"line":154},2,[38,156,158],{"class":157},"sAwPA","# Should output: \u002FUsers\u002Fyour_username\u002F.npm-global\n",[90,160,162],{"id":161},"_3-update-path-environment-variable","3. Update PATH Environment Variable",[24,164,165],{},[166,167,168],"strong",{},"For Zsh (default on macOS Catalina+):",[28,170,172],{"className":30,"code":171,"language":32,"meta":33,"style":33},"echo 'export PATH=~\u002F.npm-global\u002Fbin:$PATH' >> ~\u002F.zshrc\n",[35,173,174],{"__ignoreMap":33},[38,175,176,180,183,187],{"class":40,"line":41},[38,177,179],{"class":178},"sDLfK","echo",[38,181,182],{"class":48}," 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'",[38,184,186],{"class":185},"snl16"," >>",[38,188,189],{"class":48}," ~\u002F.zshrc\n",[24,191,192],{},[166,193,194],{},"For Bash:",[28,196,198],{"className":30,"code":197,"language":32,"meta":33,"style":33},"echo 'export PATH=~\u002F.npm-global\u002Fbin:$PATH' >> ~\u002F.bash_profile\n",[35,199,200],{"__ignoreMap":33},[38,201,202,204,206,208],{"class":40,"line":41},[38,203,179],{"class":178},[38,205,182],{"class":48},[38,207,186],{"class":185},[38,209,210],{"class":48}," ~\u002F.bash_profile\n",[90,212,214],{"id":213},"_4-reload-shell-configuration","4. Reload Shell Configuration",[28,216,218],{"className":30,"code":217,"language":32,"meta":33,"style":33},"# For Zsh\nsource ~\u002F.zshrc\n\n# For Bash\nsource ~\u002F.bash_profile\n",[35,219,220,225,232,239,245],{"__ignoreMap":33},[38,221,222],{"class":40,"line":41},[38,223,224],{"class":157},"# For Zsh\n",[38,226,227,230],{"class":40,"line":154},[38,228,229],{"class":178},"source",[38,231,189],{"class":48},[38,233,235],{"class":40,"line":234},3,[38,236,238],{"emptyLinePlaceholder":237},true,"\n",[38,240,242],{"class":40,"line":241},4,[38,243,244],{"class":157},"# For Bash\n",[38,246,248,250],{"class":40,"line":247},5,[38,249,229],{"class":178},[38,251,210],{"class":48},[90,253,255],{"id":254},"_5-test-installation","5. Test Installation",[24,257,258,259,261],{},"Install a package globally without ",[35,260,84],{},":",[28,263,265],{"className":30,"code":264,"language":32,"meta":33,"style":33},"npm install -g jshint\n",[35,266,267],{"__ignoreMap":33},[38,268,269,271,274,277],{"class":40,"line":41},[38,270,45],{"class":44},[38,272,273],{"class":48}," install",[38,275,276],{"class":178}," -g",[38,278,279],{"class":48}," jshint\n",[24,281,282],{},"Verify it works:",[28,284,286],{"className":30,"code":285,"language":32,"meta":33,"style":33},"jshint --version\n",[35,287,288],{"__ignoreMap":33},[38,289,290,293],{"class":40,"line":41},[38,291,292],{"class":44},"jshint",[38,294,295],{"class":178}," --version\n",[19,297,299],{"id":298},"troubleshooting","Troubleshooting",[24,301,302],{},[166,303,304],{},"Command not found after installation:",[306,307,308,312],"ul",{},[309,310,311],"li",{},"Restart your terminal",[309,313,314,315,318,319],{},"Check PATH: ",[35,316,317],{},"echo $PATH"," should include ",[35,320,321],{},"~\u002F.npm-global\u002Fbin",[24,323,324],{},[166,325,326],{},"Still getting permission errors:",[306,328,329,335],{},[309,330,331,332],{},"Verify prefix: ",[35,333,334],{},"npm config get prefix",[309,336,337,338],{},"Check directory ownership: ",[35,339,340],{},"ls -la ~\u002F.npm-global",[19,342,344],{"id":343},"alternative-use-node-version-manager-nvm","Alternative: Use Node Version Manager (NVM)",[24,346,347,348,356],{},"For a more comprehensive solution, consider using ",[349,350,355],"a",{":target":351,"href":352,"rel":353},"\\_blank","https:\u002F\u002Fgithub.com\u002Fnvm-sh\u002Fnvm",[354],"nofollow","NVM"," which manages both Node.js versions and avoids permission issues entirely:",[28,358,360],{"className":30,"code":359,"language":32,"meta":33,"style":33},"# Install NVM\ncurl -o- https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.0\u002Finstall.sh | bash\n\n# Install latest Node.js\nnvm install node\n",[35,361,362,367,384,388,393],{"__ignoreMap":33},[38,363,364],{"class":40,"line":41},[38,365,366],{"class":157},"# Install NVM\n",[38,368,369,372,375,378,381],{"class":40,"line":154},[38,370,371],{"class":44},"curl",[38,373,374],{"class":178}," -o-",[38,376,377],{"class":48}," https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.0\u002Finstall.sh",[38,379,380],{"class":185}," |",[38,382,383],{"class":44}," bash\n",[38,385,386],{"class":40,"line":234},[38,387,238],{"emptyLinePlaceholder":237},[38,389,390],{"class":40,"line":241},[38,391,392],{"class":157},"# Install latest Node.js\n",[38,394,395,398,400],{"class":40,"line":247},[38,396,397],{"class":44},"nvm",[38,399,273],{"class":48},[38,401,402],{"class":48}," node\n",[24,404,405],{},"This approach eliminates permission issues and allows easy Node.js version switching.",[407,408,409],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}",{"title":33,"searchDepth":154,"depth":154,"links":411},[412,413,414,421,422],{"id":21,"depth":154,"text":22},{"id":77,"depth":154,"text":78},{"id":87,"depth":154,"text":88,"children":415},[416,417,418,419,420],{"id":92,"depth":234,"text":93},{"id":109,"depth":234,"text":110},{"id":161,"depth":234,"text":162},{"id":213,"depth":234,"text":214},{"id":254,"depth":234,"text":255},{"id":298,"depth":154,"text":299},{"id":343,"depth":154,"text":344},[424,425],"javascript","macos",null,"2025-06-24","Configure NPM to use a custom directory for global packages on macOS to avoid permission errors and eliminate the need for sudo commands. Complete setup guide with shell configuration.","md",{},"\u002Fblog\u002Fchange-default-npm-global-package-location",{"title":5,"description":428},"blog\u002F18.change-default-npm-global-package-location","_yo5Tl9LZYu0XMq9iSxatIOOnR33cnsXH9rPkpAL4x4",[436],{"id":437,"name":431,"count":438},33,3617,{"left":440,"top":440,"width":441,"height":441,"rotate":440,"vFlip":442,"hFlip":442,"body":443},0,24,false,"\u003Cpath\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    stroke-width=\"1.5\"\n    d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12zM12 15h.008v.008H12zm0 2.25h.008v.008H12zM9.75 15h.008v.008H9.75zm0 2.25h.008v.008H9.75zM7.5 15h.008v.008H7.5zm0 2.25h.008v.008H7.5zm6.75-4.5h.008v.008h-.008zm0 2.25h.008v.008h-.008zm0 2.25h.008v.008h-.008zm2.25-4.5h.008v.008H16.5zm0 2.25h.008v.008H16.5z\" \u002F>",{"left":440,"top":440,"width":441,"height":441,"rotate":440,"vFlip":442,"hFlip":442,"body":445},"\u003Cg\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    stroke-width=\"1.5\">\n    \u003Cpath\n      d=\"M9.568 3H5.25A2.25 2.25 0 0 0 3 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.1 18.1 0 0 0 5.224-5.223c.54-.827.368-1.908-.33-2.607l-9.583-9.58A2.25 2.25 0 0 0 9.568 3\" \u002F>\n    \u003Cpath d=\"M6 6h.008v.008H6z\" \u002F>\n  \u003C\u002Fg>",{"left":440,"top":440,"width":441,"height":441,"rotate":440,"vFlip":442,"hFlip":442,"body":447},"\u003Cg\n    fill=\"none\"\n    stroke=\"currentColor\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n    stroke-width=\"1.5\">\n    \u003Cpath\n      d=\"M2.036 12.322a1 1 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178c.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178\" \u002F>\n    \u003Cpath d=\"M15 12a3 3 0 1 1-6 0a3 3 0 0 1 6 0\" \u002F>\n  \u003C\u002Fg>"]