当我需要在 module._compile 中时出现 NodeJS 错误

Sir*_*ert 0 javascript module compilation

我正在学习 NodeJS 的require()功能如何工作以更好地了解节点生态系统。

我写了一个使用 module._compile 来编译脚本的脚本。当我尝试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();
Run Code Online (Sandbox Code Playgroud)

脚本输出

这是输出(当问题代码被注释掉时)。

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' ] }
Run Code Online (Sandbox Code Playgroud)

为什么ad hoc模块中的模块不会加载?

Tar*_*ani 5

所以你的代码中有两件事。当你做

var module = new module.constructor();
Run Code Online (Sandbox Code Playgroud)

您丢失了原始模块对象,您不应该这样做。接下来要知道确切的问题是什么,您应该设置环境变量NODE_DEBUG=module。这将为您提供背景中发生的情况。这样做你会收到一条导入消息

MODULE 11063: looking for "json3" in []
Run Code Online (Sandbox Code Playgroud)

这意味着没有为模块加载设置路径。所以你也应该添加路径。下面是更新后的代码

"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();
Run Code Online (Sandbox Code Playgroud)

此外,的第二个参数_compile是正在加载的文件名,因此您不应为其提供路径,而应提供文件名。现在你得到了正确的输出

It works!
Run Code Online (Sandbox Code Playgroud)