LoginSignup
1
0

More than 5 years have passed since last update.

Rails4.1のProduction環境でJavascriptが動かない

Posted at

ググってもあまり有用な情報がなかったので書いておく。

結論

javascriptを圧縮するプラグインをデフォルトのUglifierからyui-compressorに変更した。

Gemfile
gem 'yui-compressor' #追加
config/environments/production.rb
#config.assets.js_compressor = :uglifier
config.assets.js_compressor = :yui #追加

yui-compressorの実行にはjavaが必要。

以上。

環境

実行環境

筐体 Synology Diskstation(debian-chroot)
Ruby - 2.4
Rails - 4.1.8

開発環境

MacOS Sierra - 10.12.3

状況

Michel Hertle氏のRuby on Railsチュートリアルを参考に
簡単な業務用Webアプリを開発中。
開発環境下でとりあえず作成したものを実行環境下で試運転したところ。FUllCalendar等表示されなかった。
ブラウザではapplication-hogehoge.jsで

SyntaxError: Left hand side of operator '=' must be a reference.

スクリプトは圧縮されているので、フォーマットツールで整形して、エラー行を確認すると識別子!0に代入しているところで止まってるっぽい。

asset-hogehoge.js
 !0 = o && (nt.boxSizingReliable() || i === t.style[e]), i = parseFloat(i) || 0

初めは自前のスクリプトがまずいと思い、書き換え、削除してみたが、解決せず。新しいアプリを立ち上げて、似た環境を作っても再現できなかった。

config/environments/production.rbにdevelopment環境のためにある以下のデバッグ用コードを入れても動くには動いた。

config/environments/production.rb
config.assets.debug = true

でも、これではあまりうまくないと思い探究を続けた。

結局、assetパイプラインを作る過程で上手くいってないのだろうということで、asset関連で検索。
assetパイプラインを作っているのはSprockets というgemということが判明。関連して調べると、その中でjavascriptの圧縮を担っているのがuglifierというgemということがわかった。
それで、圧縮はuglifierの他にも選択肢があることがわかった。
というわけで、yui-compressorを利用することで今回は解決した。

なぜ?

なぜこういう状況になったのでしょうか。何か変なことをやったのでしょうか。再現しようと思ってもできなかったし、同じ状況がググっても出てこなかったのでレアなケースかもしれません。

参考

当該エラーやアセットパイプラインいついて幾つかググったが、最終的にはこのサイトが一番役にたった。
Rails日本語ドキュメント-アセットパイプライン

蛇足

Sprocketsとかuglifireとかカッコイイ名前つけるのはいいんだけど、用途・機能が連想しにくいね。作者はそれなりの思い入れがあって名付けてるんだろうけど。ある意味、生産性の低下を招いてる気がする。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0