Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
521 views
in Technique[技术] by (71.8m points)

jquery - bundle exec rake assets:precompile fails with `unexpected token`

I'm ready to deploy my Rails 3.1 app into production, and since I'm using the asset pipeline, I need to precompile my assets. However, when I try this, I get an error apparently related to compiling 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.1u000a * http://jquery.com/u000a *u000a * Copyright 2011, John Resigu000a * Dual licensed under the MIT or GPL Version 2 licenses.u000a * http://jquery.org/licenseu000a *u000a * Includes Sizzle.jsu000a * http://sizzlejs.com/u000a * Copyright 2011, The Dojo Foundationu000a * Released under the MIT, BSD, and GPL Licenses.u000a *u000a * Date: Mon Nov 21 21:11:03 2011 -0500u000a */u000afunction addActiveScaffoldPageToHistory(a,b){if(typeof

[snip lots of stuff]

  (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'

[snip lots more stuff]

Here's my application.js:

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

I'm using the default compressor, i.e. uglifier.

I've found that if I change config.assets.compress to false in config/environments/production.rb then it works fine, but of course my app would perform better if I could figure out a way to keep it as true.

I've looked at rake assets:precompile doesn't work (rails 3.1.1) and I don't think it's a duplicate because the error is undefined: Unexpected token: operator (<).

Any ideas? I'm vaguely suspicious of those unicode characters in the jQuery code, but I'm not sure how to prove or disprove that they are causing the problem.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I had this exact same problem and solved it, here are the details:

When you include one or more javascript files in your Rails 3.1 environment using application.js and //= require ..., Rails will wrap the contents of your file with a <script> ..filecontents.. </script>. You can verify this by running your site in development mode and doing a View | Source.

The problem is, in development mode, if you are not actually using that script, it may appear to work fine. But, Essentially, what you have is <script><script> ..filecontents.. </script></script>.

However, when you attempt to PRECOMPILE the assets, something in that compiling process (sorry - I do not know what exactly) gags on the "<" in the inner script token.

Double-check your included .js files and, if any of them are wrapped by <script> ... </script> remove those surrounding tags.

You should see that, in Development, everything still looks fine if you View Page Source. And, when you precompile your assets, the error should go away.

I ran into this problem with Google's recommended google-analytics javascript snippet and removing the script wrapper from the included file solved the problem.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...