【问题标题】:ExecJS::ProgramError: Unexpected token punc «(», expected punc «:» when running rake assets:precompile on productionExecJS::ProgramError: Unexpected token punc «(», expected punc «:» when running rake assets:precompile on production
【发布时间】:2015-08-05 23:53:57
【问题描述】:

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

希望有任何想法。

【问题讨论】:

  • 你说的是清单文件吗?请解释清楚
  • 不,它不是清单文件。这是一个 .js 文件,使用 //= require 指令包含在 application.js 中。
  • 哪个 CSS 代码导致了这个问题?你能提供吗?你用的是哪个版本的 execjs?
  • 有人可以解释一下您是如何知道错误指的是哪个文件吗?根据这个错误,如何判断是哪个JS文件导致了错误?
  • @snitko 如果您选择正确的答案对每个人都很好,看来 Rasovan Skendzic 的答案是最好的!

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


【解决方案1】:

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

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

用正确的格式替换它,

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

为我工作。

错误很明显,它期待“:”但它找到了“(”。

【讨论】:

  • 这对我来说是个问题。以及使用与键同名的变量的数组:不要使用 { id, content } 使用 { id: id, content: content }
  • 我的问题是函数中的默认参数:function test(param1='val1', param2='val1') {}。显然,这只是在 ES2015 中才出现的。
  • 当你在 ES6 和老式 JavaScript 之间进行上下文切换时,这个错误非常普遍!
【解决方案2】:

遇到同样的问题。

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

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

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

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

【讨论】:

  • 是的,当我在 gulp --production 上遇到错误时解决了这个问题
【解决方案3】:

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

这在 ES2015 中称为“速记属性”。我正在使用带有 Gulp 的 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

【讨论】:

  • 在哪里添加这个?
【解决方案4】:

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 "\n#{file_name}"
  puts Uglifier.compile(File.read(file_name), harmony: true)
end

它将向您显示 Uglifier 出现问题的文件和行。

【讨论】:

  • 这是正确答案。它会发现您遇到的任何错误,无论它们是否与上述错误相似。
  • 有效!虽然我只需要在此之前做:require 'uglifier'
  • 只是在 dir 掩码末尾添加对带有“”的 erb 文件的支持,这可能会为某人节省时间:`"app/assets/javascripts/**/.js*"
  • 这样的救命稻草。
  • 在我的例子中,不是某个特定的行引发了错误,而是我使用 ES6 语法的事实让一切都崩溃了。如果它实际上并没有给你一个特定的行作为问题,那么可能值得一提的是需要更新 uglifier。一旦我更新了 uglifier,它给了我一个关于需要使用和谐的有用错误:true 继续。
【解决方案5】:

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

【讨论】:

  • 这实际上对我很有用,它可以准确地告诉我哪一行有错误。谢谢!
【解决方案6】:

在我的例子中,函数定义有问题,

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

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

以上问题可以参考Set a default parameter value for a JavaScript function

【讨论】:

    【解决方案7】:

    由于回溯不提供有关损坏文件的信息,对我来说识别错误的最佳方法是使用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 将跳转到另一个版本,你再次运行相同的命令 (assets:precompile) 并根据输出将其标记为好/坏。

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

    【讨论】:

      【解决方案8】:

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

      Gemfile.lock

      gem 'uglifier', '~> 4.1'
      

      config/environments/production.rb

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

      【讨论】:

        【解决方案9】:

        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 进行更新。

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

        【讨论】:

        • 这应该是当今最好的结果了。更新 uglifier 似乎也没有任何兼容性问题。
        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

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

          config.assets.compress = true
          

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

          参考:"rake assets:precompile" gives punc error

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-16
            • 1970-01-01
            • 2016-04-07
            • 2013-06-24
            • 2016-06-22
            • 1970-01-01
            相关资源
            最近更新 更多