ExecJS :: ProgramError:运行rake资产时出现意外的令牌punc«(»,预期的punc«:»生产时的预编译

时间:2015-05-24 10:24:30

标签: javascript ruby-on-rails git deployment execjs

部署我的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)

有问题的文件有效,它适用于localhost。我也尝试在localhost上运行rake assests:precompile,它都通过了。最后,我试图从文件中删除内容,git push和redeploy - 仍然得到相同的错误。只有完全删除文件并重新部署帮助。

会感激任何想法。

10 个答案:

答案 0 :(得分:225)

Here I found help for the same problem you had.

运行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出现问题的行。

答案 1 :(得分:32)

我怀疑,在那个js文件中,你有以下内容:

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

用正确的格式替换它,

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

为我工作。

错误显然是在说,它期待“:”但它找到了“(”。

答案 2 :(得分:6)

遇到同样的问题。

我的情况是有人使用的语法是自ES2015以来唯一的支持,例如

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

虽然我们的环境不支持此功能。

错误消息实际上是由Uglifer生成的。

答案 3 :(得分:6)

我不确定你的构建链,但我通过将相同的错误消息粘贴到Google来到这里。

这被称为'速记属性'在ES2015。我使用Babel 6和Gulp,需要做strong并将该转换添加到我的babel插件中。

npm install babel-plugin-transform-es2015-shorthand-properties --save-dev

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

答案 4 :(得分:5)

我可以使用https://skalman.github.io/UglifyJS-online/来确定问题所在的正确行号。值得庆幸的是,至少grunt uglify

指出了有问题的正确文件

答案 5 :(得分:3)

在我的案例中,函数定义问题,如

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

由于上面的函数定义,我遇到了错误,因为Uglifier不支持它。默认参数是ES6 / ES2015语言规范。

要解决上述问题,您可以参考Set a default parameter value for a JavaScript function

答案 6 :(得分:2)

如果由于库而不是代码中的问题而导致Radovan的答案对您不起作用,则可以尝试升级Uglifier并启用ES6编译。

Gemfile.lock

gem 'uglifier', '~> 4.1'

config / environments / production.rb

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

答案 7 :(得分:1)

2019年12月的答案:从4.2.0版(2019年9月发布)开始,Uglifier现在显示出漂亮的(彩色!)调试输出,向您显示令人讨厌的代码行。

我遇到一个Uglifier::Error: Unexpected character ''`错误,即使按照此页面上的所有其他解决方案我也找不到它。

因此转到您的Gemfile,并将Uglifier设置为至少4.2:

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 4.2'

运行bundle update uglifier进行更新。

然后仅查看输出,它将显示以下内容:

enter image description here

答案 8 :(得分:1)

uglifier gem更新到最新版本并更新您的production.rb

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

答案 9 :(得分:0)

由于回溯不提供有关已损坏文件的信息,对我来说,识别错误的最佳方法是使用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分钟的时间内,您应该能够找到引入该问题的提交内容。