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模块中的模块不会加载?
所以你的代码中有两件事。当你做
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)