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

sni*_*tko 62 javascript git deployment ruby-on-rails 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)
Run Code Online (Sandbox Code Playgroud)

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

会欣赏任何想法.

Rad*_*zic 236

在这里,我找到了您遇到的同样问题的帮助.

运行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), harmony: true)
end
Run Code Online (Sandbox Code Playgroud)

它将显示文件和Uglifier出现问题的行.

  • 作品!虽然我只需要这样做:`之前需要'uglifier' (5认同)
  • 这是正确的答案.无论是否与上述相似,它都会发现您遇到的任何错误. (3认同)
  • 只是为了在dir掩码的末尾添加对"*"的erb文件的支持,这可以为某人节省时间:`"app/assets/javascripts/**/*.js*"< - *结尾 (2认同)
  • 这样的救生员. (2认同)
  • 这非常有帮助,谢谢! (2认同)
  • 就我而言,不是特定行引发了错误,而是我使用ES6语法的事实使一切破灭。如果实际上没有给您特定的问题,可能需要提及更新uglifier的问题。更新uglifier后,它给了我一个关于需要使用和声的有用错误:true继续。 (2认同)

Mad*_*der 33

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

var User = {
    getName() {
        alert("my name");
    }
}
Run Code Online (Sandbox Code Playgroud)

用正确的格式替换它,

var User = {
    getName: function() {
        alert("my name");
    }
}
Run Code Online (Sandbox Code Playgroud)

为我工作.

错误显然是在说,它期待":"但它找到了"(".

  • 我的问题是函数中的默认参数:`function test(param1 ='val1',param2 ='val1'){}`.显然,这只是ES2015中的一件事. (2认同)

湯凱甯*_*湯凱甯 7

刚遇到同样的问题.

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

function someThing(param = true) {
    // do something here
};
Run Code Online (Sandbox Code Playgroud)

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

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


jam*_*son 6

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

这在ES2015中被称为"速记属性".我正在使用Babel 6和Gulp,需要做一个npm install babel-plugin-transform-es2015-shorthand-properties --save-dev并将该转换添加到我的babel插件中.

.pipe(babel({
    plugins: [
        'transform-es2015-shorthand-properties'
    ]
}))
Run Code Online (Sandbox Code Playgroud)

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


Amr*_*esh 5

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


sma*_*sma 5

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

Gemfile.lock

gem 'uglifier', '~> 4.1'
Run Code Online (Sandbox Code Playgroud)

配置/环境/生产.rb

config.assets.js_compressor = Uglifier.new(harmony: true)
Run Code Online (Sandbox Code Playgroud)


san*_*e89 5

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'
Run Code Online (Sandbox Code Playgroud)

运行bundle update uglifier以更新它。

然后看看输出,它会显示如下内容:

在此输入图像描述