bundle exec rake assets:预编译失败,出现“意外令牌”

Posted

技术标签:

【中文标题】bundle exec rake assets:预编译失败,出现“意外令牌”【英文标题】:bundle exec rake assets:precompile fails with `unexpected token` 【发布时间】:2012-02-09 20:41:39 【问题描述】:

我已准备好将我的 Rails 3.1 应用程序部署到生产环境中,因为我正在使用资产管道,I need to precompile my assets。但是,当我尝试这个时,我得到一个显然与编译 jQuery 相关的错误:

$ bundle exec rake --trace assets:precompile
** Invoke assets:precompile (first_time)
** Execute assets:precompile
/home/adam/.rvm/rubies/ruby-1.9.3-p0/bin/ruby /home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace
** Invoke assets:precompile:all (first_time)
** Execute assets:precompile:all
** Invoke assets:precompile:primary (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:primary
rake aborted!
399: unexpected token at '"/*!\u000a * jQuery javascript Library v1.7.1\u000a * http://jquery.com/\u000a *\u000a * Copyright 2011, John Resig\u000a * Dual licensed under the MIT or GPL Version 2 licenses.\u000a * http://jquery.org/license\u000a *\u000a * Includes Sizzle.js\u000a * http://sizzlejs.com/\u000a * Copyright 2011, The Dojo Foundation\u000a * Released under the MIT, BSD, and GPL Licenses.\u000a *\u000a * Date: Mon Nov 21 21:11:03 2011 -0500\u000a */\u000afunction addActiveScaffoldPageToHistory(a,b)if(typeof

[剪掉很多东西]

  (in /data/music/RotC/eventbook/app/assets/javascripts/application.js)
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/json-1.6.4/lib/json/common.rb:148:in `parse'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/json-1.6.4/lib/json/common.rb:148:in `parse'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/multi_json-1.0.4/lib/multi_json/engines/json_common.rb:9:in `decode'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/multi_json-1.0.4/lib/multi_json.rb:76:in `decode'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:61:in `extract_result'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:27:in `block in exec'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:40:in `compile_to_tempfile'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:26:in `exec'

[剪掉更多的东西]

这是我的application.js

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//
// N.B. jQuery requires have to come before this:
//= require active_scaffold

我使用的是默认压缩器,即uglifier

我发现如果我将config/environments/production.rb 中的config.assets.compress 更改为false,那么它可以正常工作,但是如果我能找到一种方法将其保留为true,我的应用程序当然会表现得更好。

我查看了rake assets:precompile doesn't work (rails 3.1.1),我认为它不是重复的,因为错误是undefined: Unexpected token: operator (<)

有什么想法吗?我隐约怀疑 jQuery 代码中的那些 unicode 字符,但我不确定如何证明或反驳它们导致了问题。

【问题讨论】:

你用的是哪个js压缩器?你的 application.js 中有什么? 问题现在更新了这些。 【参考方案1】:

我遇到了这个完全相同同样的问题并解决了,这里是详细信息:

当您使用 application.js 和 //= require ... 在 Rails 3.1 环境中包含一个或多个 javascript 文件时,Rails 将使用 <script> ..filecontents.. </script> 包装文件的内容。您可以通过在开发模式下运行您的站点并执行 View | 来验证这一点。来源。

问题是,在开发模式下,如果您没有实际使用该脚本,它可能看起来可以正常工作。但是,本质上,你拥有的是<script><script> ..filecontents.. </script></script>

但是,当您尝试预编译资产时,编译过程中的某些内容(抱歉 - 我不知道具体是什么)会在内部脚本标记中的“

仔细检查您包含的 .js 文件,如果它们中的任何一个被 <script> ... </script> 包装,请删除那些周围的标签。

您应该看到,在开发中,如果您查看页面源代码,一切看起来仍然正常。而且,当您预编译资产时,错误应该会消失。

我在使用 Google 推荐的 google-analytics javascript sn-p 时遇到了这个问题,从包含的文件中删除脚本包装器解决了这个问题。

【讨论】:

非常感谢您抽出宝贵时间报告此事,Dave。实际上,自从提出这个问题后,这个问题就神奇地为我解决了——也许是由于我将 Rails 升级到 3.2 或其中一个宝石?不过,我接受了您的回答,因为对于仍然看到该问题的人来说,这听起来像是一个合理的解决方案。 谢谢!我在rails 3.2中遇到了这个。超级有帮助! 没有解决我的问题(我没有脚本标签除了application javascript include tag in application.html.erb 优秀的答案!非常感谢。当我的一个 gem 包含具有无效 我遇到了类似的问题,但我意外的令牌是 >。原来我在一个不支持 ES6 的应用程序中编写 ES6。【参考方案2】:

我是这样调试的。

本地运行

RAILS_ENV=production bundle exec rake assets:precompile

尝试找出阻塞的位置(阻塞之前的脚本是您要查看的文件)。查看所有要求。

在我的情况下,我有一个以 .js 结尾的文件,而它本应是 .jsx,这就是修复它的原因。

【讨论】:

【参考方案3】:

我也遇到了同样的问题。

尽管我的 javascript 文件中没有 <script> 标签,但 Dave 的建议对我帮助很大!

我能够在我的 application.js 中加载的外部库中发现评论:

<!-- Hotjar Tracking Code for (...) ->

那条评论打破了我的uglifier 压缩,我花了很长时间才找到它,甚至可能认为它是罪魁祸首。

所以,还要注意 JS 文件开头的 cmets, 因为这可能会破坏您的压缩。

【讨论】:

如果你想在 JavaScript 中加入 cmets,请使用 /* */// 感谢您的提示。这来自 hotjar 嵌入式代码,一些开发人员在添加 hotjar 时复制了该代码。

以上是关于bundle exec rake assets:预编译失败,出现“意外令牌”的主要内容,如果未能解决你的问题,请参考以下文章

我在 Open Project 源代码中遇到了 rake assets 预编译问题

使用 bundle exec rake 还是只使用 rake?

bundle exec rake 是啥意思?

Rails--bundle exec rake db:migrate

rake assets:预编译很慢

如何解决极其缓慢的 rake assets:在 heroku 上预编译?