我有这段代码可以从内存中创建一个Node.js模块:
function requireFromString(src, filename) {
var Module = module.constructor;
var m = new Module(filename);
m._compile(src, filename);
return m;
}
console.log(
requireFromString(
'module.exports = { test: 1}',
'/some/file/path.js'
)
);
当我运行它时,我得到以下输出:
Module {
id: '/some/file/path.js',
exports: { test: 1 },
parent: undefined,
filename: null, // <<< humma?
loaded: false,
children: [] }
有人知道为什么文件名为null吗? id是文件名,而filename为null似乎很有趣。我使用的是Node.js版本10。
答案 0 :(得分:1)
如果您查看Module constructor,它实际上会this.filename = null
稍后在Module.prototype._load中设置文件名,该文件名解析文件名并调用module.load来设置内部属性this.filename
。
对于您来说,您是在不加载文件的情况下直接调用_compile
,因此filename
属性仍为null
。
这只是一个概述,require
的内部逻辑非常复杂,具有许多缓存和本机函数调用,因此我认为您不应该尝试在其中使用filename
属性您的代码。
如果您需要某种方式使用文件名,我将在您的代码中创建一个新属性,假设为myfilename
,请确保它不会干扰节点的内部逻辑。