起因:
混合TypeScript和javaScript开发,完美升级老项目,这个老项目是一个巨无霸项目,非常庞大,是集团公司的最核心项目
遇到问题:
webpack打包时候遇到
对于曾经开发过C++,addon的我,熟悉的味道,下面有一些v8的字符出现,感觉应该是v8层面出现了问题
报错解决:
任何报错,先看第一个报错,解决顶部的报错。
问题定位:
JS堆栈跟踪,javaScript heap out of memory ,内存不足
隐约记得,v8对使用内存的限制,64位系统是1.4G,32位系统是0.7G,Buffer属于C++层面,不会被限制。但是长度会被限制,当Buffer被创建时候就会被判断长度
https://github.com/nodejs/node/blob/master/lib/buffer.js#L90-L101
node.js官网对长度的文档描述:
这种简单问题不做阐述,继续
项目之前纯js开发,现在接入ts,为什么同样的电脑,之前可以运行,现在却内存不足?
答案:
解决办法:
Node.js的8.0版本以上可以这样调整
export NODE_OPTIONS=--max_old_space_size=4096
也可以使用自动化、工程化配置插件
increase-memory-limit
由于一些部署服务器上的配置未知,在测试过后,我选择了后者,编写了新的构建命令,这样达到效果。
难道做API工程师,不可能的,我的原则,使用第三方库,框架必须看它的 源码实现,包括Node.js
increase-memory-limit
源码只有几十行代码
#!/usr/bin/env node
const path = require('path');
const glob = require('glob');
const fs = require('fs');
const maxOldSpaceSize = process.env.LIMIT || 10240;
const cwd = process.cwd() + path.sep;
glob(path.join(cwd, "node_modules", ".bin", "*"), function (err, files) {
files.forEach(file => {
// readFileSync will crash on non-files. Skip over these
let stat = fs.lstatSync(fs.realpathSync(file));
if (!stat.isFile()) {
return;
}
if (file.indexOf('increase-memory-limit') >= 0) {
return;
}
// build scripts will hand in LIMIT via cross-env
// avoid updating it while we are running it
if (file.indexOf('cross-env') >= 0) {
return;
}
let contents = fs.readFileSync(file).toString();
let lines = contents.split('\n')
let patchedContents = "";
for (var index = 0; index < lines.length; index++) {
var line = lines[index];
if (line.startsWith("if [") || line.startsWith("@IF") || line.indexOf ('has_node') !== -1) {
patchedContents += line + "\n";
} else {
patchedContents += line.replace(/node(\.exe)?\b(?: \-\-max\-old\-space\-size\=[0-9]+)?/, `node$1 --max-old-space-size=${maxOldSpaceSize}`) + "\n";
}
}
fs.writeFileSync(file, patchedContents);
console.log(`'${file.replace(cwd, "")}'`, "written successfully.");
});
});
它依赖glob这个库
https://www.npmjs.com/package/glob
首先读取LIMIT配置
然后拿到node启动的命令路径(配置path.sep针对跨平台,cwd返回的路径做处理分隔)
var glob = require("glob")
通过glob这库,传入路径和配置后,拿到包含文件数组,然后读取文件流信息并且toString()
最核心的源码文件就是下面这个
patchedContents += line + "\n";
} else {
patchedContents += line.replace(/node(\.exe)?\b(?: \-\-max\-old\-space\-size\=[0-9]+)?/, `node$1 --max-old-space-size=${maxOldSpaceSize}`) + "\n";
}
}
fs.writeFileSync(file, patchedContents);
console.log(`'${file.replace(cwd, "")}'`, "written successfully.");
通过正则将读取的文件流信息,匹配相应的配置后,替换内容后同步写入(因为必须同步写入!!!否则项目无法启动,不能异步此处)
目前有一个系列写作计划,面试成长系列和踩坑成长系列同步进行,喜欢的话点个在看,关注下公众号:前端巅峰。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有