web-dev-qa-db-ja.com

ExecJS :: ProgramError:予期せぬトークンpunc«(»、期待されるpunc«:»は、本番環境でrake asset:precompileを実行しているとき

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を実行して再デプロイしようとしました-それでも同じエラーが発生しました。ファイルを完全に削除して再デプロイすることのみが役立ちます。

任意のアイデアをいただければ幸いです。

61
snitko

ここで私はあなたが持っていた同じ問題の助けを見つけました。

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が問題を引き起こしている行が表示されます。

231

そのjsファイルには、次のようなものがあると思います。

var User = {
    getName() {
        alert("my name");
    }
}

適切な形式に置き換えて、

var User = {
    getName: function() {
        alert("my name");
    }
}

私のために働いた。

エラーは明らかに「:」を予期しているが、「(」を検出したことを示しています。

32
MadCoder

ビルドチェーンについてはわかりませんが、同じエラーメッセージをGoogleに貼り付けてここに行きました。

これは、ES2015では「速記プロパティ」と呼ばれます。 GulpでBabel 6を使用しており、npm install babel-plugin-transform-es2015-shorthand-properties --save-devそして、その変換をbabelプラグインに追加します。

.pipe(babel({
    plugins: [
        'transform-es2015-shorthand-properties'
    ]
}))

https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-shorthand-properties

6
jamie-wilson

同じ問題が発生するだけです。

私の場合は、ES2015以降のみサポートされている構文を使用した人です

function someThing(param = true) {
    // do something here
};

これは当社の環境ではサポートされていません。

また、エラーメッセージは実際にはUgliferによって生成されます。

6
湯凱甯

https://skalman.github.io/UglifyJS-online/ を使用して、問題が発生した正しい行番号を特定できました。ありがたいことに、少なくとも問題のある正しいファイルはgrunt uglifyによって指摘されました。

5
Amrudesh

私の場合、次のような関数定義の問題

function someFunctionName(param1, param2=defaultValue){
  //code 
}

上記の関数定義のため、Uglifierではサポートされていないため、エラーが発生していました。デフォルトのパラメーターはES6/ES2015言語仕様です。

上記の問題の解決策については、 JavaScript関数のデフォルトのパラメーター値を設定 を参照してください。

3
ShilpeshAgre

コードではなくライブラリの問題が原因でRadovanの答えが役に立たない場合は、Uglifierをアップグレードし、ES6コンパイルを有効にしてみてください。

Gemfile.lock

gem 'uglifier', '~> 4.1'

config/environments/production.rb

config.assets.js_compressor = Uglifier.new(harmony: true)
2
sma

バックトレースは破損したファイルに関する情報を提供しないため、私にとってエラーを特定する最良の方法は 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分以内に、問題の原因となったコミットを見つけることができるはずです。

0
Arnold Roa