【Rails5】Autoprefixer doesn’t support Node v4.8.2. というエラーへの対処法

Rails5での開発中に

Autoprefixer doesn’t support Node v4.8.2.

というエラーに遭遇しました. (少なくとも私の環境では解決した)対処法をまとめました.

環境

対処法

検索してみると, Stack Overflowで質問されているのが見つかりました.

node.js - Ruby on Rails - Autoprefixer doesn’t support Node v4.9.1. Update it. How to fix? - Stack Overflow

この解答の通り, mini_racerというGemを追加したら直りました.

結局どんなエラーだったの?

経験が浅いなりに調べてみました. 結局どうしてmini_racerを導入するとエラーが解消されたかははっきりわかっていません. しかし原因を調べていく上で自分にとって新しい知識が得られたのでまとめておきます. エラーが解消された理由を推測することはできるかもしれません.

Vender Prefixes とは

CSSにはVender Prefixesというものがありまして, これについては以下のブログにとてもわかりやすく書かれていました.

まだベンダープレフィックスで消耗してるの? – ysklog

少し引用しておきましょう.

「ベンダープレフィックス」とは、主に、CSS3で採用予定(草案段階)の機能を各ブラウザが先行的に実装し、その先行実装した機能を有効化させるために必要な各ブラウザ毎の「-moz-」や「-webkit-」という接頭辞のことをいいます。

つまり, 機能によってはブラウザごとに書かなくてはならない面倒なもの, ということですね.

Autoprefixerとは

面倒なVender Prefixesを自動でつけてくれるのが, AutoprefixerというGemです. エラー文にも登場していますね.

ExecJSとは

ExecJSというGemにより, JavaScriptで書かれたコードをRubyから実行することができるようになります. ExecJSがサポートしているruntimeとして, 以下などが挙げられています.

  • therubyracer
  • Node.js
  • mini_racer

mini_racerとは

これはGitHubのReadmeを読んでもらうのが良いかと. GitHub - discourse/mini_racer: Minimal embedded v8

こちらも少し抜粋しておきましょう.

MiniRacer provides a minimal two way bridge between the V8 JavaScript engine and Ruby.

It was created as an alternative to the excellent therubyracer. Unlike therubyracer, mini_racer only implements a minimal bridge. This reduces the surface area making upgrading v8 much simpler and exhaustive testing simpler.

JavaScriptエンジンのV8とRubyの橋渡しをするものだそうですね. ExecJSはmini_racerのようなものを使って, RubyからJavaScriptを実行するということなのでしょう.

エラーが解消された理由

すでに述べましたが, 正直よくわかっていません.

mini_racerを導入することで, ExecJSはNode.jsではなくmini_racerを使うようになった, ということでしょうか.