Ошибка NodeJS, когда мне нужен внутренний модуль ._compile

Я узнаю, как работает require()функция NodeJS, чтобы лучше понять экосистему узла.

Я написал скрипт, который использует module.require () для компиляции скрипта. Когда я пытаюсь json3внутри строки, она перестает ... но она, кажется, имеет правильные пути. Что я делаю не так?

Думаю, стоит упомянуть, что у меня ./node_modules/установлен модуль в том же каталоге ."use strict"; var json3 = require('json3'); console.log("require.main.filename:", require.main.filename); console.log("require.main:", require.main); var module = new module.constructor(); module._compile(` "use strict"; console.log("require.main.filename:", require.main.filename); console.log("require.main:", require.main); // When I uncomment this, it breaks. Why? //var json3 = require('json3'); module.exports = { run: function () { console.log("It works!") } }; `, require.main.paths[0]); module.exports.run();

Сценарий

Я написал этот скрипт, который работает - пока я не раскомментирую выделенную строку.


require.main.filename: /home/user/tmp/tmp.js
require.main: Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/home/user/tmp/tmp.js',
  loaded: false,
  children: 
   [ Module {
       id: '/home/user/tmp/node_modules/json3/lib/json3.js',
       exports: [Object],
       parent: [Circular],
       filename: '/home/user/tmp/node_modules/json3/lib/json3.js',
       loaded: true,
       children: [],
       paths: [Array] } ],
  paths: 
   [ '/home/user/tmp/node_modules',
     '/home/user/node_modules',
     '/home/node_modules',
     '/node_modules' ] }
require.main.filename: /home/user/tmp/tmp.js
require.main: Module {
  id: '.',
  exports: {},
  parent: null,
  filename: '/home/user/tmp/tmp.js',
  loaded: false,
  children: 
   [ Module {
       id: '/home/user/tmp/node_modules/json3/lib/json3.js',
       exports: [Object],
       parent: [Circular],
       filename: '/home/user/tmp/node_modules/json3/lib/json3.js',
       loaded: true,
       children: [],
       paths: [Array] } ],
  paths: 
   [ '/home/user/tmp/node_modules',
     '/home/user/node_modules',
     '/home/node_modules',
     '/node_modules' ] }
It works!

Вывод скрипта

Вот результат (когда код проблемы закомментирован). var module = new module.constructor();

Почему модуль в модуле ad hoc не загружается?

javascript,module,compilation,

0

Ответов: 1


2 принят
+50

Итак, две вещи в вашем коде. Когда вы это сделаете

NODE_DEBUG=module

Вы теряете исходный объект модуля, вы не должны этого делать. Чтобы узнать, в чем проблема, вы должны установить переменную среды . Это даст вам то, что происходит в фоновом режиме. При этом вы получите сообщение об импортеMODULE 11063: looking for "json3" in []

"use strict";

var json3 = require('json3');
var os = require("os");
console.log("require.main.filename:", require.main.filename);
console.log("require.main:", require.main);

var _module = new module.constructor();
_module.paths = module.paths;

_module._compile(`
"use strict";

// console.log("require.main.filename:", require.main.filename);
// console.log("require.main:", require.main);

//When I uncomment this, it breaks.  Why?
var json3 = require('json3');

module.exports = {
  run: function () { console.log("It works!") }
};
`, __dirname + "/dynamic_code_loaded_at_run_time.js");

_module.exports.run();

Это означает, что для загрузки модуля нет путей. Поэтому вы также должны добавить пути. Ниже приведен обновленный код

_compile

Также вторым параметром _compileявляется загружаемое имя файла, поэтому вы не должны указывать путь, а не имя файла. И теперь вы получаете правильный результат

It works!
JavaScript, модуль компиляции,