質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

559閲覧

RubyのExecJSでrequireを使ったファイルを読み込めない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/03/19 15:44

前提・実現したいこと

Ruby内でjavascriptファイルをを読み込んで使いたい
Rubyでサーバー側の実装を行い、node.jsでブロックチェーン周りの接続をできるようにしたい。

execjsを使って、Ruby内で単純なjavascriptファイルを読み込むことはできるのですが、
以下のような構文をrbファイル内でコンパイルしようとすると下記の
context = ExecJS.compile(source)の部分でエラーが起こります。

execjsで以下のような構文は読み込めないのでしょうか?
もしくは読み込むために他にツールが必要なのでしょうか。

初歩的なところでつまずいてしまって、大変恐縮ですが、知恵を貸して頂けますと幸いです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

console

1ExecJS::ProgramError (TypeError: require is not a function): 2 3(execjs):1:271 4(execjs):12:14 5(execjs):1:102

該当のソースコード

JS

1const express = require('express'); 2const app = express(); 3const http = require('http').Server(app); 4const io = require('socket.io')(http); 5 6const web3 = new (require("web3")); 7web3.setProvider(new web3.providers.WebsocketProvider("ws://localhost:7545")); 8 9app.use("/", express.static(__dirname + '/')); 10 11io.on('connection', (socket) => { 12 socket.on('call_mining', (msg) => { 13 web3.eth.isMining().then((result) => { 14 socket.emit('msg', 'mining=[' + JSON.stringify(result) + ']'); 15 }); 16 }); 171819

Ruby

1source = open("/PATH/TO/javascripts/app.js").read 2 3context = ExecJS.compile(source)

試したこと

nodeのインストールはして、バージョンも変更してみた
npm installでインストールはしてみた
requireが書かれていないもっと単純なjsファイルがコンパイルできることは確認した

execjsをgemfileに記載済み

補足情報(FW/ツールのバージョンなど)

rails 5.2.2
ruby 2.4.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ExecJSのREADMEに書いてありますが、ExecJSでrequireは使用できないようです。

Why can't I use CommonJS require() inside ExecJS?

ExecJS provides a lowest common denominator interface to any JavaScript runtime. Use ExecJS when it doesn't matter which JavaScript interpreter your code runs in. If you want to access the Node API, you should check another library like commonjs.rb designed to provide a consistent interface.

requireはCommonJSのAPIであり、JavaScript標準のAPIではありません。Node.jsはCommonJSのrequireをサポートしていますが、他のエンジンがサポートしているとは限らないため、ExecJSではそのようなAPIは使用できないようにしているようです。

単純にJavaScriptのコードをNode.jsで実行しただけなら、systemやバッククォート、popen等を使った方が良いでしょう。

投稿2019/03/19 22:21

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/21 05:18

ありがとうございます。 Node.js以外のjsだとサポートしてないから使えないようにしているんですね。。。 そうなると別の方法を探したほうが早そうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問