来自 NodeJS 脚本的注释是否可能造成内存问题?

Is it possible that the comments from a NodeJS script create memory issues?

我写 NodeJS 库,我通常在代码中加入 JSDoc 注释,然后生成文档。

因此,我的代码如下所示:

/**
 * Sum
 * Calculates the sum of two numbers.
 *
 * @name Sum
 * @function
 * @param {Number} a The first number,
 * @param {Number} b The second number.
 * @return {Number} The sum of the two numbers.
 */
module.exports = function (a, b) {
    return a + b;
};

当另一个 NodeJS 脚本需要此脚本时,上面的注释是否会加载到 RAM 中?

那么,大评论会不会影响内存?

我猜 NodeJS 脚本被解析了,不相关的东西(例如评论)没有保存在内存中。这是真的吗?

那么,总而言之,这样的评论会造成任何内存问题吗?


例子

函数字符串化,注释也打印出来:

function foo () {
    // Hello World comment
    return 10;
}

console.log(foo.toString());

输出:

$ node index.js 
function foo() {
    // Hello World comment
    return 10;
}

另一个例子是在 200 万行上生成 lorem ipsum,然后在最后一行上生成 console.log(1)

因此,文件如下所示:

 // long lorem ipsum on each line
 // ...
 // after 2 million lines
 console.log(1)

运行上面的脚本我得到:

$ node run.js 
FATAL ERROR: CALL_AND_RETRY_0 Allocation failed - process out of memory
Aborted (core dumped)

这发生在一台 16GB RAM 的机器上。


我还比较了一个简单的 console.log(1) 文件和有很多评论的文件的性能:

$ time node with-comments.js
1

real    0m0.178s
user    0m0.159s
sys 0m0.023s

$ time node no-comments.js
1

real    0m0.040s
user    0m0.036s
sys 0m0.004s

正如您的 .toString() 代码证明的那样,所有注释都作为函数源代码的一部分保存在内存中,在函数外部的节点模块中是模块函数。您可以在构建步骤中删除注释。

V8 将源代码保存在内存中,因为它是函数的最紧凑表示,AST 和其他中间表示是根据需要即时创建然后丢弃。