新手问题 关于 execjs 的疑问

xiaobai2 · 2018年05月22日 · 最后由 heroyct 回复于 2018年05月23日 · 2449 次阅读

### ruby 代码

require "execjs"
require "open-uri"
source = open("xxx.js").read
ExecJS.compile(source)

Gemfile

gem 'therubyracer', '~> 0.12.3', :platforms => :ruby
gem 'execjs'

部分 xxx.js

const xxx = require('xx-yy-api')

当执行到 ExecJS.compile(source) 的时候会报一个如下的错误:

ExecJS::ProgramError: ReferenceError: require is not defined
  • 文档上说 execjs 本身就不支持 require【哭死】但是 google 了一下,说是缺少 therubyracer,但是我已经安装过了为什么还有这个问题?找了好多资料还是没能解决求解!

  • 好像也不支持 console.log 这种写法【并且 node 也装了】

  • 另外我想把 ruby 里面的特定参数通过 execjs 传到 xxx.js 里能实现吗?【这个文档里面好像没有特定说明】

試試看,安裝 nodejs ??

charlie_hsieh 回复

node 已经安装过了,并且通过 node 去执行这个 xxx.js 是没有问题的。

如果你只是想简单的执行那个 js 文件的话,可以试试用 shell 的方式调用:

res = system("node foo.js")
huacnlee 回复

这样好像把 require 的问题给解决了,但是怎么往这个 foo.js 里面传 ruby 对象或者参数然后让 foo.js 去执行呢?我的参数其实就是一个 string

根据文档提示我在 Gemfile 里面加了一个

gem 'commonjs', '~> 0.2.7'

env = CommonJS::Environment.new(:path => value) env.require('xxx.js') 想问的是 path 后面这个 value 是我的 xxx.js 文件的路径吗?为什么不管我传什么类型的值都会报错

TypeError: no implicit conversion of nil into String

我现在想是不是因为 execjs 是底层的东西,想用的话需要加载以来其它很多文件呢

require "execjs"
require "open-uri"
source = open("xxx.js").read
ExecJS.compile(source)

不是太明白具体要做什么

  1. 编译 javascipt?
  2. 执行 xxx.js, 然后返回结果?

如果是 CoffeeScript 编译到 JS 的话,才用到 compile

require "execjs"
source = File.read("test.coffee")
ExecJS.compile(source)

直接执行 JS 文件

require "execjs"
ExecJS.eval File.read('test.js')
xiaobai2 关闭了讨论。 05月23日 17:44
xiaobai2 重新开启了讨论。 05月23日 17:44
xiaobai2 关闭了讨论。 05月23日 17:44
需要 登录 后方可回复, 如果你还没有账号请 注册新账号