模块实例文件名为null,但为什么呢?

时间:2018-11-22 09:14:22

标签: node.js es6-modules

我有这段代码可以从内存中创建一个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。

1 个答案:

答案 0 :(得分:1)

如果您查看Module constructor,它实际上会this.filename = null

稍后在Module.prototype._load中设置文件名,该文件名解析文件名并调用module.load来设置内部属性this.filename

对于您来说,您是在不加载文件的情况下直接调用_compile,因此filename属性仍为null

这只是一个概述,require的内部逻辑非常复杂,具有许多缓存和本机函数调用,因此我认为您不应该尝试在其中使用filename属性您的代码。

如果您需要某种方式使用文件名,我将在您的代码中创建一个新属性,假设为myfilename,请确保它不会干扰节点的内部逻辑。