我正在学习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 模块中的模块无法加载?
答案 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!