微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Ruby (Rails) 中评估 module.exports

如何解决在 Ruby (Rails) 中评估 module.exports

目前我想尝试在 Ruby 中从 JS 中获取 Hash 格式的内容

我有一个看起来像这样的 JS 模块

module.exports = {
  key1: "val",key2: {
    key3: "val3"
  }
  ...
}

这只是作为一个字符串提供给我的。我知道 ExecJS 在这里可能会有所帮助,但我不确定将其转换为哈希的最佳方法是什么。

我目前正在尝试做这样的事情

contents.prepend("var module = {exports: {}};\n")
context = ExecJS.compile contents

context.eval('module.exports').to_hash

但是当给它一个像上面这样的字符串时,我收到了来自 JSON gem 的解析错误

解决方法

我只是尝试将其放入脚本中并运行它:

require 'execjs'

str = <<-JS
  // Note,you could just do `var module = {}` here
  var module = {exports: {}};

  module.exports = {
    key1: "val",key2: {
      key3: "val3"
    }
  }
JS

context = ExecJS.compile str 
puts context.eval('module.exports').to_hash
# => {"key1"=>"val","key2"=>{"key3"=>"val3"}}

也许您收到 JSON 解析错误是因为模块包含无法序列化的内容。


这是另一种方法。

制作一个加载模块并将其导出为 JSON 的 JS 文件。

var fs = require('fs');
var hash = require('path/to/my_module.js');

fs.writeFileSync('path/to/output.json',JSON.stringify(hash),'utf8');

使用 nodejs my_script.js 运行它,然后从 Ruby 中读取它:

require 'json'
hash  = JSON.parse "path/to/output.json"
,

如果是runtime的问题,可以使用mini_racer作为ExecJS使用的runtime。只包括宝石:

gem 'execjs'
gem 'mini_racer'

然后你可以运行:

p ExecJS.runtime
# > #<ExecJS::MiniRacerRuntime:0x00007fc44ea20bd8>

然后您将首先设置上下文:

require 'execjs'

jscode = <<-JS
  module.exports = {
    key1: "val",key2: {
      key3: "val3"
    }
  }
JS

context = ExecJS.compile "var module = {};"
result_hash = context.eval jscode
puts result_hash["key1"]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。