目录
问题描述
最近在使用webstorm运行vue项目时,总会运行崩溃,查看报错信息后发现是内存溢出造成的问题,经过一系列的查询资料后发现node在64位系统最大内存为1.4G左右,32位系统为0.7G左右,当项目太大后运行时占用内存超过最大内存就会导致项目内存溢出造成运行崩溃。
解决方案
1.安装两个库
代码如下(示例):
> npm install increase-memory-limit
> npm install cross-env
increase-memory-limit
库可以将 Node.js 进程的内存限制提高到更高的级别,从而提高应用程序的性能和稳定性。Node.js 是基于 V8 引擎构建的,V8 引擎会对每个 Node.js 进程的内存使用进行限制,一旦超过限制就会导致进程崩溃。 increase-memory-limit
则可以提高这个限制,让应用程序在处理大量数据或者高并发请求时不易出现内存报错、奔溃等问题。
而 cross-env
则是一个跨平台的命令行工具,可以在不同的操作系统和环境下,设置和使用环境变量。在开发中,我们常常需要采用不同方式来运行应用程序,例如不同的端口、不同的数据库连接等。而这些配置通常都需要通过环境变量来传递,以便应用程序可以在不同的环境中正确地运行。 cross-env
可以在不同的命令行中正确设置环境变量,确保应用程序在不同的环境下都能够正常运行。
2.在package.json中配置
代码如下(示例):
"scripts": {
"fix-memory-limit": "cross-env LIMIT=4096 increase-memory-limit"
},
这里的 fix-memory-limit
是一个自定义的 npm 脚本命令,在项目根目录下的 package.json 文件中设置。它是通过 cross-env LIMIT=4096 increase-memory-limit
命令来执行 increase-memory-limit
库的。具体来说:
cross-env
是一个跨平台的命令行工具,可以在不同的操作系统和环境下,设置和使用环境变量。在这里,使用cross-env
命令来设置一个名为LIMIT
的环境变量,将其值设置为 4096。- 然后,使用管道符号
|
将cross-env
命令的输出作为输入传递给increase-memory-limit
命令。 increase-memory-limit
命令会修改 Node.js 进程的最大内存限制,让应用程序可以更高效地运行。
因此,当你在命令行中运行 npm run fix-memory-limit
时,实际上就相当于运行了 cross-env LIMIT=4096 increase-memory-limit
命令。这个命令的作用是将 Node.js 进程的内存限制提高到 4096 MB(即 4 GB),从而提高应用程序的性能和稳定性。
3.命令执行
执行命令如下:
> npm run fix-memory-limit
具体作用已经在步骤二中做了详细解释
4.项目重启
执行npm run fix-memory-limit命令,成功后重启项目即可,但是如果项目重启时发现如下报错:
'"node --max-old-space-size=4096"' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
找到路径为:node_modules\.bin\webpack-dev-server.cmd文件,内容为:
@ECHO off
SETLOCAL
CALL :find_dp0
IF EXIST "%dp0%\node.exe --max-old-space-size=4096" (
SET "_prog=%dp0%\node.exe --max-old-space-size=4096"
) ELSE (
SET "_prog=node --max-old-space-size=4096"
SET PATHEXT=%PATHEXT:;.JS;=;%
)
"%_prog%" "%dp0%\..\webpack-dev-server\bin\webpack-dev-server.js" %*
ENDLOCAL
EXIT /b %errorlevel%
:find_dp0
SET dp0=%~dp0
EXIT /b
将"%_prog%"的双引号去掉就可以了,这是因为将 "%_prog%"的双引号去掉,是为了确保操作系统可以正确解析 node
命令的路径。在 Windows 系统中,命令行参数包含空格时需要使用双引号将其括起来,否则操作系统会将该参数拆分成多个部分处理,导致命令无法执行。在这里,"%_prog%" 括起来是为了保证 "node --max-old-space-size=4096
"这个字符串作为一个整体被传递给操作系统,从而正确启动 Node.js 进程。
但是,如果系统环境变量中已经正确配置了 Node.js 的路径,那么操作系统会自动查找并解析 node
命令的路径,此时就不需要使用双引号括起来了。因此,在这种情况下,将 "%_prog%"的双引号去掉也不会影响脚本的执行效果,反而可以减少不必要的字符输入。
再次重启项目后应该就可正确执行啦!