Railsアプリをデプロイすると、次のエラーが表示されます。
rake aborted!
ExecJS::ProgramError: Unexpected token punc «(», expected punc «:» (line: 15, col: 14, pos: 265)
Error
at new JS_Parse_Error (/tmp/execjs20150524-4411-1p45n63js:2359:10623)
at js_error (/tmp/execjs20150524-4411-1p45n63js:2359:10842)
at croak (/tmp/execjs20150524-4411-1p45n63js:2359:19086)
at token_error (/tmp/execjs20150524-4411-1p45n63js:2359:19223)
at expect_token (/tmp/execjs20150524-4411-1p45n63js:2359:19446)
at expect (/tmp/execjs20150524-4411-1p45n63js:2359:19584)
at /tmp/execjs20150524-4411-1p45n63js:2359:28513
at /tmp/execjs20150524-4411-1p45n63js:2359:19957
at expr_atom (/tmp/execjs20150524-4411-1p45n63js:2359:27269)
at maybe_unary (/tmp/execjs20150524-4411-1p45n63js:2359:30019)new JS_Parse_Error ((execjs):2359:10623)
js_error ((execjs):2359:10842)
croak ((execjs):2359:19086)
token_error ((execjs):2359:19223)
expect_token ((execjs):2359:19446)
expect ((execjs):2359:19584)
(execjs):2359:28513
(execjs):2359:19957
expr_atom ((execjs):2359:27269)
maybe_unary ((execjs):2359:30019)
問題のファイルは有効で、ローカルホストで動作します。また、rake assests:precompile
ローカルホストでは、すべてパスします。最後に、ファイルからコンテンツを削除し、git Pushを実行して再デプロイしようとしました-それでも同じエラーが発生しました。ファイルを完全に削除して再デプロイすることのみが役立ちます。
任意のアイデアをいただければ幸いです。
Rails consoleおよび:
JS_PATH = "app/assets/javascripts/**/*.js";
Dir[JS_PATH].each do |file_name|
puts "\n#{file_name}"
puts Uglifier.compile(File.read(file_name))
end
ファイルとUglifierが問題を引き起こしている行が表示されます。
そのjsファイルには、次のようなものがあると思います。
var User = {
getName() {
alert("my name");
}
}
適切な形式に置き換えて、
var User = {
getName: function() {
alert("my name");
}
}
私のために働いた。
エラーは明らかに「:」を予期しているが、「(」を検出したことを示しています。
ビルドチェーンについてはわかりませんが、同じエラーメッセージをGoogleに貼り付けてここに行きました。
これは、ES2015では「速記プロパティ」と呼ばれます。 GulpでBabel 6を使用しており、npm install babel-plugin-transform-es2015-shorthand-properties --save-dev
そして、その変換をbabelプラグインに追加します。
.pipe(babel({
plugins: [
'transform-es2015-shorthand-properties'
]
}))
同じ問題が発生するだけです。
私の場合は、ES2015以降のみサポートされている構文を使用した人です
function someThing(param = true) {
// do something here
};
これは当社の環境ではサポートされていません。
また、エラーメッセージは実際にはUgliferによって生成されます。
https://skalman.github.io/UglifyJS-online/ を使用して、問題が発生した正しい行番号を特定できました。ありがたいことに、少なくとも問題のある正しいファイルはgrunt uglifyによって指摘されました。
私の場合、次のような関数定義の問題
function someFunctionName(param1, param2=defaultValue){
//code
}
上記の関数定義のため、Uglifierではサポートされていないため、エラーが発生していました。デフォルトのパラメーターはES6/ES2015言語仕様です。
上記の問題の解決策については、 JavaScript関数のデフォルトのパラメーター値を設定 を参照してください。
コードではなくライブラリの問題が原因でRadovanの答えが役に立たない場合は、Uglifierをアップグレードし、ES6コンパイルを有効にしてみてください。
Gemfile.lock
gem 'uglifier', '~> 4.1'
config/environments/production.rb
config.assets.js_compressor = Uglifier.new(harmony: true)
バックトレースは破損したファイルに関する情報を提供しないため、私にとってエラーを特定する最良の方法は git bisect。
バグを引き起こすコミットを見つけることができます。
あなたがマスターにいると仮定しましょう、最初にgit bisectを起動します:
$ git bisect start
$ git bisect bad
次に、前の作業中のリビジョンに戻ります。20回前のリビジョンを考えてみましょう。
$ git checkout HEAD~20
同じコマンドを実行します
$ Rails_ENV=production rake assets:precompile
動作する場合は、リビジョンを良好としてマークします。
$ git bisect good.
gitは別のリビジョンにジャンプし、同じコマンド(assets:precompile)を再度実行し、出力に基づいて良い/悪いとマークします。
1分以内に、問題の原因となったコミットを見つけることができるはずです。