Nodejs知识点总结

标签: Nodejs 分类: Javascript 创建时间:2019-10-16 06:07:43 更新时间:2024-11-15 10:49:43

1.读写文件

同步读写:readFileSync()、writeFileSync();
异步读写:readFile()、writeFile();

1
2
3
4
5
6
7
8
9
// 将文件读取为buffer
fs.readFile('./image.png', function (err, buffer) {
if (err) throw err;
process(buffer);
});

//将文件读取为字符串
var text = fs.readFileSync(fileName, 'utf8');

参考文章:
1.node基础:文件系统-文件读取:https://www.cnblogs.com/chyingp/p/node-guide-file-read.html
2.fs 模块:http://javascript.ruanyifeng.com/nodejs/fs.html

2.获取文件路径

__filename: module.filename。
__dirname:该行代码所在的目录。

1
2
3
4
5
var path = require('path');
// 获取上级目录
path.resolve(__dirname, '..');
// 获取祖先目录
path.resolve(__dirname, '../../source');
参考文章:
1.node如何获取当前文件的上级目录路径?:https://segmentfault.com/q/1010000005964557

3.遍历目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 同步遍历
function travel(dir, callback) {
fs.readdirSync(dir).forEach(function (file) {
var pathname = path.join(dir, file);

if (fs.statSync(pathname).isDirectory()) {
travel(pathname, callback);
} else {
callback(pathname);
}
});
}
//使用
travel('/home/user', function (pathname) {
console.log(pathname);
});

//异步遍历
function travel(dir, callback, finish) {
fs.readdir(dir, function (err, files) {
(function next(i) {
if (i < files.length) {
var pathname = path.join(dir, files[i]);

fs.stat(pathname, function (err, stats) {
if (stats.isDirectory()) {
travel(pathname, callback, function () {
next(i + 1);
});
} else {
callback(pathname, function () {
next(i + 1);
});
}
});
} else {
finish && finish();
}
}(0));
});
}
参考文章:
1.遍历目录:https://wiki.jikexueyuan.com/project/nodejs-guide/traverse.html
2.使用node.js获取目录中的所有文件名:https://codeday.me/bug/20170226/2491.html

3.增大运行内存

运行nodejs项目时,出现:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 错误,可以再运行时。

主要是因为:,在 Node 中通过 JavaScript 使用内存时只能使用部分内存(64位系统下约为1.4 GB,32位系统下约为0.7 GB),这就是我们编译项目时为什么会出现内存泄露了。可以使用参数增加相应的内存。

(1)执行时直接指定

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

(2)mac配置环境变量
我在mac系统上,修改了 .bash_profile 和 .zshrc 文件,增加了 NODE_OPTIONS 选项,然后关闭了命令行,重写开启。

1
export NODE_OPTIONS=--max-old-space-size=8192

(3)windows 设置环境变量
在 windows 命令行中这么设置,setx NODE_OPTIONS,好像不起作用,我又 $env:NODE_OPTIONS,重启了命令行,重启了VSCode,算是可以看了。

1
2
3
4
setx NODE_OPTIONS --max-old-space-size=16384

## 在powershell中进行配置
$env:NODE_OPTIONS="--max-old-space-size=8192"

(4)使用 cross-env 命令
在 package.json 中安装 cross-env,然后配置 fix-memory-limit 命令,直接执行 pnpm fix-memory-limit 就可以了。

1
2
3
"scripts": {
"fix-memory-limit": "cross-env LIMIT=10000 increase-memory-limit"
},

(5) 配置chrome 使用高性能模式
打开win11设置,然后选择系统-》屏幕——》显示卡,浏览应用,然后选择Chrome,然后右键选项,选择高性能模式。

4.升级过程中的问题

(1) Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead
在使用Buffer()构造时候,会出现上面这个问题,根据参考资料进行适当的调整。

1
2
3
4
new Buffer(body);

// 替换为
new Buffer.from(body)

(2) digital envelope routines::unsupported
在使用nodejs v17.0.0 中创建vue 3.0的项目,然后npm run serve 启动的时候,出现了这个问题。

这个问题我没有解决,感觉是一个bug,我还是换回LTS版本好了。可以设置环境变量。

1
export NODE_OPTIONS=--openssl-legacy-provider; gatsby build
参考文章:
1.nodejs 17: digital envelope routines::unsupported export NODE_OPTIONS=–openssl-legacy-provider
2.Solved: digital envelope routines::unsupported ReactJS和AngularJS中如何避免这个问题,还有作者提出建议,要使用LTS长期支持版本
3.Node 17.0.1 causes some error - digital envelope routines::unsupported “build”: “export NODE_OPTIONS=–openssl-legacy-provider; gatsby build”

5.MaxListenersExceededWarning: Possible EventEmitter memory leak detected

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。