ExecJS :: ProgramError:运行rake资产时意外的标记点«(»,预期的点«:»:在生产中进行预编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ExecJS :: ProgramError:运行rake资产时意外的标记点«(»,预期的点«:»:在生产中进行预编译相关的知识,希望对你有一定的参考价值。

[部署我的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上有效。我也尝试在本地主机上运行rake assests:precompile,所有这些都通过了。最后,我尝试从文件git push和redeploy中删除内容-仍然遇到相同的错误。仅完全删除文件并重新部署会有帮助。

将不胜感激。

答案

Here I found help for the same problem you had.

运行Rails控制台和:

JS_PATH = "app/assets/javascripts/**/*.js"; 
Dir[JS_PATH].each do |file_name|
  puts "
#{file_name}"
  puts Uglifier.compile(File.read(file_name), harmony: true)
end

它将显示文件和Uglifier问题所在的行。

另一答案

我怀疑,在该js文件中,您的内容类似于以下内容:

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

以正确的格式替换它,

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

为我工作。

错误显然是在说,它期望是“:”,但发现是“(”。

另一答案

只是遇到相同的问题。

我的情况是有人使用了自ES2015起才支持的语法,例如

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

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

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

另一答案

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

在ES2015中称为“简写属性”。我将Gubel与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

另一答案

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

另一答案

就我而言,函数定义之类的问题,

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

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

有关上述问题的解决方法,您可以参考Set a default parameter value for a JavaScript function

另一答案

如果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分钟的时间内,您应该能够找到导致此问题的提交。

以上是关于ExecJS :: ProgramError:运行rake资产时意外的标记点«(»,预期的点«:»:在生产中进行预编译的主要内容,如果未能解决你的问题,请参考以下文章

ExecJS::ProgramError: SyntaxError: 保留字“函数”

Pages#home 中的 Rails ExecJS::ProgramError?

ExecJS::ProgramError: SyntaxError: Unexpected token: name <ClassName>

如何调试资产提示语法错误?

Rails:找不到 JavaScript 运行时。有关可用运行时的列表,请参阅 https://github.com/sstephenson/execjs。 (ExecJS::RuntimeUnava

耙中止! ExecJS::RuntimeError: (execjs):1