javascript - Node 脚本中 eval() 的替代方案

标签 javascript node.js

我正在编写一个脚本,该脚本在 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/

相关文章:

javascript - 等待异步函数并 promise 完成

node.js - 在node.js中执行exe文件时传递多个参数

javascript - 无法从 Android Studio 构建 React-Native,构建失败

javascript - Angular Js : Scope Arrays

javascript - 取消JS和CSS中的所有动画

javascript - ng-view 导致页面崩溃

javascript - Angular js 选择 ng-options 而不是 ng-repeat

node.js - 根据 mongodb 类型不推荐使用 find 方法

javascript - NodeJs : JSON Array/Object merging not working

javascript - 使用在两个(或更多)缓冲区 block 之间拆分的大型 JSON 的最佳方法是什么