我正在编写一个脚本,该脚本在 npm install
之前在 Jenkins 的构建过程中运行。我的问题是我需要从外部资源下载 JavaScript 文件并从中读取变量。
unzipper.on('extract', () => {
const content = fs.readFileSync(`${outputDir}/js/en.js`, 'utf8');
eval(content); // Less smellier alternative?
if (obj) {
const str = JSON.stringify(obj);
fs.writeFileSync(`${outputDir}/public/data.json`, str);
} else {
throw 'Variable `obj` not found';
}
});
我知道“eval
是邪恶的”,但我在网上找到的任何建议的替代方案似乎都不起作用。
我尝试了 new Function(obj)()
的不同变体,但 Node 似乎在之后退出了脚本(if
-case 从未运行)。
想法?
最佳答案
因为node.js提供了API要直接与 V8 运行者交谈,使用它可能是个好主意。基本上,它是 Node 的 require
在底层使用的 API。
假设相关 js 文件包含我们感兴趣的变量 obj
,我们执行以下操作:
- 从文件中读取代码
- 附加
; obj
到代码中以确保它是它计算的最后一个表达式 - 将代码传递给 V8 进行评估
- 获取返回值(这是我们的
obj
):
const fs = require('fs'),
vm = require('vm');
const code = fs.readFileSync('path-to-js-file', 'utf8');
const obj = vm.runInNewContext(code + ';obj');
关于javascript - Node 脚本中 eval() 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769378/