当我需要内部module._compile时NodeJS错误

时间:2017-09-21 18:57:57

标签: javascript module compilation

我正在学习NodeJS的require()函数如何更好地理解节点生态系统。

我编写了一个使用module._compile编译脚本的脚本。当我尝试在字符串中require()时,它会bal ...但它似乎有正确的路径。我做错了什么?

我想值得一提的是我在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!

为什么 ad hoc 模块中的模块无法加载?

1 个答案:

答案 0 :(得分:3)

代码中有两件事。当你这样做

var module = new module.constructor();

您丢失了原始模块对象,您不应该这样做。接下来要知道确切的问题是什么,您应该设置环境变量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的第二个参数是正在加载的文件名,因此您不应该为它提供路径而是文件名。现在你得到了正确的输出

It works!