跳到主要内容

7 篇博文 含有标签「Javascript」

查看所有标签

· 阅读需 3 分钟
Meoo

这两天吃饱撑着,在探究为什么我的 Node 程序 Heap Usage 一直居高不下,而且会越来越多。

如何调试 NodeJS 程序

在VSCode中可以直接调试,选择Debug,显示所有自动调试配置,选择要运行的命令,就进入了调试模式,侧栏会显示出调试的信息。可以捕获 Heap 快照,拿到 ChromeDevTool 里面导入分析。

用 Node 的 --inspect 参数搭配 Chrome 实时分析

运行以下命令,进入了调试模式

node --inspect serve.js

在 Chrome 中打开 chrome://inspect,就可以看到 Open dedicated DevTool for Node,点击进入 Node 调试工具,就可以开始分析了。

放大问题

很多时候,人工是难以准确排查出问题的,因为会有很多不可预料的误差,导致每次运行的结果数据不准。这时候,要放大问题,大量测试多次触发漏洞,就能很清楚的发现问题。

k6 对接口进行测试,运行下列测试程序 k6 run test.js

// test.js
import http from 'k6/http';

export let options = {
vus: 100,
duration: '20s',
};

export default function () {
let res = http.post("http://localhost:5000/monitor/start", JSON.stringify({ phone: Math.random()*100000 }), { headers: { 'Content-Type': 'application/json' } })

console.log(res.body);
}

通过对比前后的 Heap Size,确实管用,明显增加了将近 8MB。

接着调用了一下其他的接口,调用 processMap.clear() 把保存子进程的 processMap 清空。内存果然又降回去了,但并没有和最开始一样,而是稍稍高出了一点点。

得出结论,引用计数法回收垃圾是实实在在的,这个例子验证了它。但是仍然困扰我的是,Heap 里的 [compiled code] 这部分会一直增加,无法被回收,增加的量很小...

未解之谜:每次访问接口,即使是访问 / 路径,返回一段文本, [compiled code] 也会不断增加?

· 阅读需 1 分钟
Meoo

每一个函数都有这三个方法,平时也不怎么能用到,整的时间长不看真容易迷糊...

function Fn(){}

函数 Fn,可调用 Fn.call(), Fn.apply(), Fn.bind(),下面细说。

const person = {
name: 'Lee',
say: function (greet) {
console.log(`${greet}, I'm ${this.name}`)
}
}
const dog = { name: 'coco' }

person.say('hi') // hi, I'm Lee

person.say.apply(dog, ['woof']) // woof, I'm coco

person.say.call(dog, 'woof') // woof, I'm coco

let person_dog = person.say.bind(dog, 'woof')
person_dog() // woof, I'm coco

相同之处

将调用此函数的 Fn 的 this 指向传入的第一个参数。

不同之处

  1. call 和 apply 立即执行,bind 返回绑定过的函数,需要手动执行。
  2. call 和 bind 传入参数列表,而 apply 则是要求传入一个参数数组

· 阅读需 1 分钟
Meoo

写 Github Action 的 配置文件时遇到个问题,想把 secret 密钥在执行 npm run xxx 的时候传进来,并在nodejs程序中用到这个变量。

方法

package.json 部分

  "scripts": {
"action": "node ./src/action.js"
}

action.js

let username, password
username = process.argv[process.argv.indexOf('--username')+1] // 用户名在 --username 后面
password = process.argv[process.argv.indexOf('--password')+1] // 密码在 --password 后面
console.log(username + ' ' + password) // 输出传入的参数

· 阅读需 2 分钟
Meoo

官方文档写道:

请注意,大多数情况下@rollup/plugin-commonjs应该在其他插件转化你的模块之前进行,这是为了防止其他插件的更改导致对 CommonJS 的检测被破坏。这个规则的一个例外是 Babel 插件,如果你正在使用它,那么把它放在 commonjs 插件之前。

迷惑的问题来了,如果output中写了好几个输出配置,应该在output中的每一个plugins里把commonjs插件执行放在第一个吗,还是写在外面的plugins里写在第一个?