详解基于node的前端项目编译时内存溢出问题


Posted in Javascript onAugust 01, 2017

前段时间公司有个基于vue的项目在运行npm run build的时候会报内存溢出,今天在某个技术流交群也有位小伙伴基于angular的项目也出现了这个问题,所以查了一些相关的资料总结了一下,下面会详细说明前端三大框架编译时遇到这个问题具体怎么解决。首先看我模拟出的报错内容

具体截图如下

详解基于node的前端项目编译时内存溢出问题

里面有句关键的话,CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory JavaScript堆内存不足,这里说的 JavaScript 其实就是 Node,我们都知道 Node 是基于V8引擎,在一般的后端开发语言中,在基本的内存使用上没有什么限制,但是我去查阅了相关的资料才发现,在 Node 中通过 JavaScript 使用内存时只能使用部分内存(64位系统下约为1.4 GB,32位系统下约为0.7 GB),这就是我们编译项目时为什么会出现内存泄露了,因为前端项目如果非常的庞大,webpack 编译时就会占用很多的系统资源,如果超出了V8对 Node 默认的内存限制大小就会出现刚刚我截图的那个错误了,那怎么解决呢?V8依然提供了选项让我们使用更多的内存。Node 在启动时可以传递 --max-old-space-size 或 --max-new-space-size 来调整内存大小的使用限制,示例如下

node --max-old-space-size=1700 test.js // 单位为MB
// 或者
node --max-new-space-size=1024 test.js // 单位为KB

上述参数在V8初始化时生效,一旦生效就不能再动态改变。如果遇到 Node 无法分配足够内存给 JavaScript 的情况,可以用这个办法来放宽V8默认的内存限制,避免在执行过程中稍微多用了一些内存就轻易崩溃,既然知道了解决办法那就好办了,下面来分别详细说明三大框架下的具体操作。

Vue

先说vue,因为vue是最简单的,因为基于 vue-cli 生成的项目,vue没有把 package.json 里面 scripts 字段的脚本命令的node命令隐藏起来,我们直接把上面v8提供的选项参数直接写入scripts 字段的 node 命令后就好了,示例如下

"build": "node --max_old_space_size=4096 build/build.js"

直接在 node 后面写上 --max_old_space_size=4096 就好了,我这里设置的内存大小是4G,这个具体的大小可以根据自己的项目情况来设置就好了。然后再重新运行 npm run build 就可以正常打包构建了。

React

下面来说说 react ,首先如果自己的 react 项目的开发打包环境是自己搭建的话,那解决方法就和上面的 vue 一样,在 node 命令后面加上 --max_old_space_size=4096 就好了,如果是基于 react-cli 生成的项目那就接着看吧,基于react-cli 生成的项目我们发现package.json 里面 scripts 字段的内容如下

"scripts": {
 "start": "react-scripts start",
 "build": "react-scripts build",
 "test": "react-scripts test --env=jsdom",
 "eject": "react-scripts eject"
}

这个就和 vue-cli 不一样了,运行npm run build的时候跑的实际代码是 react-scripts build, 这个脚本是来源于哪里呢,我们打开项目根目录mode_modeles文件夹,会看到一个.bin的目录,react-scripts脚本就定义在这里,在.bin目录下可以找到一个叫react-scripts的文件,打开这个文件,我们发现里面就是一些javascript代码,这个代码的首行有些特殊,我们可以看到#!/usr/bin/env node一行这样的代码,它的意思就是,用当前电脑/usr/bin/env目录下的node来运行该文件里面的javascript代码,看到这里我们都明白了,回到我们最初要解决的问题,我们可以把--max_old_space_size=4096这行代码写在#!/usr/bin/env node后面,#!/usr/bin/env node --max_old_space_size=4096,这样就好了,我们的内存溢出问题也就解决了。

Angular

最后开始说 angular ,当然这里说的 angular 是 angular 的最新版本不是angularjs,写angular应用我们一般也都会用angular-cli来搭建项目,如果是自己搭建的开发编译那解决办法和上面的vue是一样的了。用angular-cli来生成的项目也和react一样,cli把node命令也隐藏起来了,package.json 里面 scripts 字段的内容如下

"scripts": {
 "ng": "ng",
 "start": "ng serve",
 "build": "ng build",
 "test": "ng test",
 "lint": "ng lint",
 "e2e": "ng e2e"
}

这里的ng命令也和react一样,定义在项目根目录mode_modeles文件夹下的.bin目录里面,.bin目录下我们能找到一个叫ng的文件,在该文件的首行写上#!/usr/bin/env node --max_old_space_size=4096,这样也就可以解除v8对node的内存使用限制了。

参考

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
分享别人写的一个小型js框架
Aug 13 Javascript
jQuery 处理网页内容的实现代码
Feb 15 Javascript
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
javascript实现window.print()去除页眉页脚
Dec 30 Javascript
JavaScript基于ajax编辑信息用法实例
Jul 15 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
JavaScript中三种异步上传文件方式
Mar 06 Javascript
全面接触神奇的Bootstrap导航条实战篇
Aug 01 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
三剑客:offset、client和scroll还傻傻分不清?
Dec 04 Javascript
Node与Python 双向通信的实现代码
Jul 16 Javascript
javascript 中select框触发事件过程的分析
Aug 01 #Javascript
谈谈对vue响应式数据更新的误解
Aug 01 #Javascript
详解jquery选择器的原理
Aug 01 #jQuery
浅谈node中的exports与module.exports的关系
Aug 01 #Javascript
Vue2.0 组件传值通讯的示例代码
Aug 01 #Javascript
谈谈VUE种methods watch和compute的区别和联系
Aug 01 #Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 #Javascript
You might like
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
vue项目中使用scss的方法步骤
2019/05/16 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
Python深入学习之闭包
2014/08/31 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
python中pop()函数的语法与实例
2020/12/01 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
英国袜子店:Sock Shop
2017/01/11 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
高二英语教学反思
2014/01/19 职场文书
银行职员自我鉴定
2014/04/20 职场文书
学雷锋月活动总结
2014/04/25 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书