# npm 安装报错

# 1. install electron with Error: EACCES: permission denied, mkdir ...

npm config -g set unsafe-perm
npm config -g set allow-root
npm config get unsafe-perm
npm config get allow-root

# 2. 运行 npm run xxx 的时候发生了什么

第一步:会执行 package.json 中的 scripts
"scripts": {
    "dev": "vue-cli-service serve"
    ......
}
npm run dev <=> ./node_modules/.bin/vue-cli-service serve

第二步:
Mac端
./node_modules/.bin/vue-cli-service,这个文件就是最终执行的文件。

windows端
在安装依赖完成后(npm i xxx),./node_modules/.bin/ 目录中会生成3个 vue-cli-service 为名的几个可执行文件。
(1) # unix 系统默认的可执行文件,必须输入完整文件名
vue-cli-service

#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

case `uname` in
    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
  "$basedir/node"  "$basedir/../@vue/cli-service/bin/vue-cli-service.js" "$@"
  ret=$?
else
  node  "$basedir/../@vue/cli-service/bin/vue-cli-service.js" "$@"
  ret=$?
fi
exit $ret

(2) # windows cmd 中默认的可执行文件,当我们不添加后缀名时,自动根据 pathext 查找文件
vue-cli-service.cmd

@ECHO off
SETLOCAL
CALL :find_dp0

IF EXIST "%dp0%\node.exe" (
  SET "_prog=%dp0%\node.exe"
) ELSE (
  SET "_prog=node"
  SET PATHEXT=%PATHEXT:;.JS;=;%
)

"%_prog%"  "%dp0%\..\@vue\cli-service\bin\vue-cli-service.js" %*
ENDLOCAL
EXIT /b %errorlevel%
:find_dp0
SET dp0=%~dp0
EXIT /b

(3) # Windows PowerShell 中可执行文件,可以跨平台
vue-cli-service.ps1

第三步:windows端,./node_modules/.bin 目录下的文件表示软连接(映射),那这个bin目录下的那些软连接文件是哪里来的呢?   
它又是怎么知道这条软连接是执行哪里的呢?
node_modules/@vue/cli-service/package.json
"bin": {
    "vue-cli-service": "bin/vue-cli-service.js"
}