68

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

将不胜感激任何想法。

4

11 回答 11

253

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

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

于 2016-07-27T06:42:37.927 回答
33

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

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

用正确的格式替换它,

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

为我工作。

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

于 2015-09-12T01:03:15.150 回答
7

只是遇到同样的问题。

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

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

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

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

于 2016-04-11T11:16:53.080 回答
6

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

这在 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

于 2016-06-27T10:42:08.647 回答
5

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

于 2017-03-15T06:41:54.060 回答
4

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以更新它。

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

在此处输入图像描述

于 2019-12-03T12:45:30.213 回答
4

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

Gemfile.lock

gem 'uglifier', '~> 4.1'

配置/环境/production.rb

config.assets.js_compressor = Uglifier.new(harmony: true)
于 2019-02-08T22:23:14.507 回答
3

就我而言,函数定义存在问题,例如,

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

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

对于上述问题的解决方案,您可以参考为 JavaScript 函数设置默认参数值

于 2017-07-10T13:00:06.197 回答
1

由于回溯不提供有关损坏文件的信息,对我而言,识别错误的最佳方法是使用git bisect。

它允许您找到引入错误的提交。

假设您在 master 上,首先您启动 git bisect:

$ git bisect start
$ git bisect bad 

然后你回到以前的工作版本,假设 20 之前的版本。

$ git checkout HEAD~20

您运行相同的命令

$ RAILS_ENV=production rake assets:precompile

如果它有效,您将修订标记为良好:

$ git bisect good.

git 将跳转到另一个版本,您再次运行相同的命令(资产:预编译)并根据输出将其标记为好/坏。

在不到 1 分钟的时间内,您应该能够找到引入问题的提交。

于 2018-03-10T03:39:38.560 回答
1

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

config.assets.js_compressor = Uglifier.new(harmony: true)
于 2020-03-27T22:04:47.593 回答
0

如果您正在维护一个遗留项目(使用 ruby​​ 非常旧的版本,例如 1.9.3 和 Rails 3.2.x),我建议您不要使用 uglifier&exec-js,只需将这行代码注释掉config/environments/production.rb

config.assets.compress = true

还要确保您安装nodejs为 js 运行时。

参考:“rake assets:precompile”给出 punc 错误

于 2021-11-15T13:08:45.007 回答