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

IT技术 javascript ruby-on-rails git deployment execjs
2021-03-01 23:59:47

部署 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 并重新部署 - 仍然遇到相同的错误。只有完全删除文件并重新部署才有帮助。

将不胜感激任何想法。

6个回答

在这里,我找到了解决您遇到的相同问题的帮助。

运行 rails 控制台并:

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

它将向您显示 Uglifier 导致问题的文件和行。

这样的救命稻草。
2021-04-21 23:59:47
作品!虽然我只需要做:require 'uglifier'在那之前
2021-04-25 23:59:47
就我而言,并不是特定行引发错误,而是我使用 ES6 语法这一事实将一切都搞砸了。可能值得一提的是,如果 uglifier 实际上没有给您提供特定行作为问题,则需要更新它。一旦我更新了 uglifier,它给了我一个关于需要使用和谐的有用错误:true 继续。
2021-04-28 23:59:47
只是为了在目录掩码的末尾添加对带有“ ”的erb 文件的支持,这可能会为某人节省时间:`"app/assets/javascripts/**/ .js*" <-- * 在末尾
2021-05-07 23:59:47
这是正确答案。它会发现您遇到的任何错误,无论它们是否与上述错误相似。
2021-05-13 23:59:47

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

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

用正确的格式替换它,

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

为我工作。

错误清楚地表明,它期待“:”但它找到了“(”。

我的问题是函数中的默认参数:function test(param1='val1', param2='val1') {}. 显然,这只是在 ES2015 中成为一件事。
2021-04-29 23:59:47
这对我来说是个问题。以及使用与键同名的变量的数组:不要使用 { id, content } 不要使用 { id: id, content: content }
2021-05-09 23:59:47
当您在 ES6 和老式 JavaScript 之间进行上下文切换时,这个错误非常普遍!
2021-05-11 23:59:47

刚遇到同样的问题。

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

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

虽然这在我们的环境中不受支持。

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

是的,当我在 gulp --production 上出错时修复
2021-05-06 23:59:47

我不确定您的构建链,但我是通过将相同的错误消息粘贴到 Google 来实现的。

这在 ES2015 中称为“速记属性”。我正在将 Babel 6 与 Gulp 一起使用,需要做一个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

在哪里添加这个?
2021-04-26 23:59:47

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

这实际上对我很有用,它准确地告诉我哪一行有错误。谢谢!
2021-04-21 23:59:47