Имя файла экземпляра модуля пустое, но почему? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть этот код, который создает модуль 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: [] }

кто-нибудь знает, почему имя файланоль?кажется забавным, что id - это имя файла, а filename - null.Я на Node.js версии 10.

1 Ответ

0 голосов
/ 22 ноября 2018

Если вы посмотрите на конструктор модуля , он на самом деле делает this.filename = null

Имя файла будет позже установлено в Module.prototype._load , который разрешает имя файлаи вызывает module.load , чтобы установить внутреннее свойство this.filename.

В вашем случае вы вызываете _compile напрямую, не загружая файл, поэтому свойство filename остается null.

Это просто обзор, внутренняя логика require довольно сложна с большим количеством кэширования и вызовов собственных функций, поэтому я не думаю, что вам следует пытаться использовать свойство filename в вашемкод.

Если вам нужно каким-то образом использовать имя файла, я бы создал новое свойство в вашем коде, скажем, myfilename, убедившись, что оно не мешает внутренней логике узла.

...