假设我在字符串中有js文件的内容。此外,假设它具有exports['default'] = function() {...}
和/或其他导出的属性或函数。有没有办法从该字符串“需要”它(编译它)到一个对象,这样我可以使用它? (另外,我不想像require()
那样缓存它。)
答案 0 :(得分:2)
以下是使用vm.runInThisContext()
的一个非常简单的示例:
const vm = require('vm');
let code = `
exports['default'] = function() {
console.log('hello world');
}
`
global.exports = {}; // this is what `exports` in the code will refer to
vm.runInThisContext(code);
global.exports.default(); // "hello world"
或者,如果你不想使用全局变量,你可以使用eval
实现类似的东西:
let sandbox = {};
let wrappedCode = `void function(exports) { ${ code } }(sandbox)`;
eval(wrappedCode);
sandbox.default(); // "hello world"
这两种方法都假设您输入的代码是“安全的”,因为它们都允许运行任意代码。