刚开始只是一个项目打包报错
<--- Last few GCs ---> [8928:0x128008000] 39920 ms: Scavenge 2026.3 (2081.4) -> 2019.6 (2081.7) MB, 6.8 / 0.0 ms (average mu = 0.586, current mu = 0.404) allocation failure [8928:0x128008000] 39929 ms: Scavenge 2026.8 (2081.7) -> 2020.1 (2082.9) MB, 3.1 / 0.0 ms (average mu = 0.586, current mu = 0.404) allocation failure [8928:0x128008000] 39945 ms: Scavenge 2027.6 (2082.9) -> 2021.0 (2098.9) MB, 9.1 / 0.0 ms (average mu = 0.586, current mu = 0.404) allocation failure <--- JS stacktrace ---> FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
注意这里显示FATAL 致命错误,这个问题通常发生在编译或打包大型项目时,JavaScript 堆内存用满了,并且 V8 引擎无法继续分配内存。
原来的 package.json 是这样的
"dev": "vite --open",
"serve": "vite build && vite preview",
"build": "vite build", "lint:eslint": "eslint --cache --ma
后面使用 --max-old-space-size
参数来增加 Node.js 进程的内存限制,你需要修改 scripts
部分的相应命令。--max-old-space-size
参数的值为 4096,即 4GB。
"scripts": {
"serve": "NODE_OPTIONS=--max-old-space-size=4096 vite build && vite preview",
"build": "NODE_OPTIONS=--max-old-space-size=4096 vite build",
...
}
后来 又觉得每次都在后面加个命令太麻烦,想着能否升级下 Node.js 版本:尝试升级你使用的 Node.js 版本到最新的稳定版,以便享受更好的性能和内存管理。我的MAC系统一直都是使用n作为node版本管理器的,但是在使用n升级过程中就出现了
sudo n Password: jason is not in the sudoers file. This incident has been reported to the administrator.
显示我不是超管用户,可是我电脑只有这一个用户,怎么试都不行,想要删除多余的node版本时也不行
rm: /usr/local/n/versions/node/19.4.0/share/doc: Permission denied rm: /usr/local/n/versions/node/19.4.0/share: Permission denied rm: /usr/local/n/versions/node/19.4.0: Permission denied
没有管理员权限,无法删除 /usr/local/n
目录下的文件和文件夹。只有具有管理员权限的用户才能删除这些文件。
在查找了众多资料的基础上,后来发现是系统升级的原因导致,苹果系统的 shell 和 GUI 似乎产生了脑裂问题,shell 不认为你是管理员了,但是 GUI 还认!也因此可以通过 GUI 的方式修复了 sudoers 文件。
具体可以参考下面知乎大佬的文章:
按照他的说法执行替换,后来发现有更简便的方式,去操作这个sudoers的文件,这个文件在系统里默认是只读的,在文件右键-显示简介-共享与访问权限将系统、admin、和你的用户名添加读写权限就可以了。
按照以上步骤执行完了之后,想用n 更新下node版本,例如使用:n 18.18.0,安装过程中就会提示没有权限
jason@JasonyedeMBP fe_wcrm % n 18.18.0 installing : node-v18.18.0 mkdir : /usr/local/n/versions/node/18.18.0 mkdir: /usr/local/n/versions/node/18.18.0: Permission denied Error: sudo required (or change ownership, or define N_PREFIX) jason@JasonyedeMBP fe_wcrm % sudo n 18.18.0 Password: sudo: n: command not found
使用n安装提示没有权限创建文件夹,使用sudo提示n not found
好家伙,那我就想着使用npm重新安装下n呗,结果使用sudo npm install -g n Password: sudo: npm: command not found依然报找不到。
在询问了gpt和来来回回反反复复折腾了MAC上的zsh shell和bash shell的file配置文件和官网重新安装了node.js之后,确保我的环境变量在系统中存在
最终发现问题可能是由于sudo命令无法找到正确的环境变量而引起的。于是每次执行sudo 都在后买带上当前的环境变量。就可以了
sudo env "PATH=$PATH" npm uninstall -g n
问题到这里,看起来似乎已经结束了。
但是每次执行sudo 都要带上env "PATH=$PATH",才能执行成功。可是我的MAC电脑就只我一个用户,我不应该就是超管吗,我的环境变量不就是超管的环境变量吗?
继续寻根究底...
询问gpt,得到
要检查/etc/sudoers
文件中是否有与secure_path
相关的设置,您可以按照以下步骤进行操作:
- 打开终端应用程序。
- 运行以下命令以使用超级用户权限打开
/etc/sudoers
文件:sudo visudo
这将打开sudoers
文件并使用visudo
编辑器进行编辑,visudo
会在编辑完成后检查文件的语法错误。 - 在
sudoers
文件中查找是否有类似以下行的设置:Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
如果存在这样的行,并且其中的路径设置与您的环境变量路径相匹配,则表示secure_path
已经设置正确。 - 如果找不到此行或者路径设置不正确,您可以使用编辑器修改
secure_path
的设置,将其设置为您环境变量中正确的路径。请注意,在编辑sudoers
文件时务必小心,如果出现语法错误可能会导致系统问题。 - 编辑完成后,使用
Ctrl + X
组合键保存并退出编辑器。
请注意,在修改sudoers
文件之前,请确保了解您的操作系统和文件系统的工作原理,并且谨慎操作以避免任何潜在的问题或安全风险。如果您对此过程感到不确定,建议咨询有经验的系统管理员或更深入地了解相关文档和资源。
我怎么知道我MAC系统环境变量的路径呢?
您可以使用以下命令在终端上查看您的 macOS 系统环境变量的路径:
- 打开终端应用程序。
- 运行以下命令来显示当前的环境变量设置:
printenv
这将显示当前的所有环境变量,其中包括您可能感兴趣的路径变量。 - 在输出的结果中,查找类似于以下的路径变量:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
这是PATH
环境变量,它包含了系统用于查找可执行文件的一组目录路径。 - 通过查看
PATH
中的不同路径,您可以确定您的系统环境变量的路径。
在etc/sudoers 的 secure_path=后面,您可以添加可信任的路径,以确保只有在这些路径下的可执行文件才能被系统直接调用。一般来说,建议将系统的标准路径和您自己的自定义路径添加到secure_path中。
在您提供的环境变量中,您可以将以下路径添加到secure_path中:
secure_path="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/bin:/Library/Java/JavaVirtualMachines/apache-maven-3.6.3/bin:/usr/local/mysql//bin:/Library/Tomcat/apache-tomcat-8.5.95/bin:/opt/homebrew/bin:/opt/homebrew/sbin"
请注意,这里只是一个示例。根据您自己的需求和系统配置,您可以根据需要自行调整和添加路径。
修改完secure_path后,请确保保存更改。这样,在使用类似sudo命令时,系统将只允许在secure_path中定义的路径下的可执行文件。
最后的最后,还是系统升级带来的锅。。。在etc/sudoers 的 secure_path= 后面把当前用户配置的环境变量路径加进去终于大功告成啦!