10

Tôi đã sẵn sàng triển khai ứng dụng Rails 3.1 của mình vào sản xuất và vì tôi đang sử dụng đường dẫn nội dung, I need to precompile my assets. Tuy nhiên, khi tôi cố gắng này, tôi nhận được một lỗi rõ ràng liên quan đến biên soạn jQuery:tài sản thực thi gói: không biên dịch trước bằng `mã thông báo không mong muốn '

$ 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/[email protected]/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 

[snip rất nhiều thứ]

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

[snip nhiều thứ hơn]

Dưới đây là application.js của tôi :

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

Tôi đang sử dụng máy nén mặc định, tức là uglifier.

Tôi đã phát hiện ra rằng nếu tôi thay đổi config.assets.compress để false trong config/environments/production.rb sau đó nó hoạt động tốt, nhưng tất nhiên ứng dụng của tôi sẽ thực hiện tốt hơn nếu tôi có thể tìm ra một cách để giữ nó như true.

Tôi đã xem rake assets:precompile doesn't work (rails 3.1.1) và tôi không cho rằng đó là bản sao vì lỗi là undefined: Unexpected token: operator (<).

Bất kỳ ý tưởng nào? Tôi mơ hồ nghi ngờ về những ký tự unicode trong mã jQuery, nhưng tôi không chắc chắn làm thế nào để chứng minh hoặc bác bỏ rằng họ đang gây ra vấn đề.

+0

bạn đang sử dụng máy nén js nào? Có gì trong application.js của bạn? –

+0

Câu hỏi đã được cập nhật với những câu hỏi này. –

Trả lời

20

tôi đã chính xác cùng vấn đề này và giải quyết nó, sau đây là các chi tiết:

Khi bạn nhập một hoặc file javascript hơn trong Rails 3.1 môi trường sử dụng application.js và //= require ..., Rails sẽ quấn nội dung của tệp của bạn với <script> ..filecontents.. </script>. Bạn có thể xác minh điều này bằng cách chạy trang web của bạn trong chế độ phát triển và thực hiện một View | Nguồn.

Vấn đề ở chế độ phát triển, nếu bạn đang không thực sự sử dụng tập lệnh đó, nó có thể xuất hiện để hoạt động tốt. Nhưng, về cơ bản, những gì bạn có là <script><script> ..filecontents.. </script></script>.

Tuy nhiên, khi bạn cố gắng PRECOMPILE nội dung, điều gì đó trong quá trình biên dịch (xin lỗi - tôi không biết chính xác) gags trên "<" trong mã thông báo tập lệnh bên trong.

Kiểm tra kỹ các tệp .js được bao gồm của bạn và, nếu có bất kỳ tệp nào trong số đó được bao bọc bởi <script> ... </script>, hãy xóa các thẻ xung quanh đó.

Bạn sẽ thấy rằng, trong Phát triển, mọi thứ vẫn ổn nếu bạn Xem nguồn trang. Và, khi bạn biên dịch trước tài sản của mình, lỗi sẽ biến mất.

Tôi đã gặp sự cố này với đoạn mã javascript Google Analytics phân tích được Google đề xuất và xóa trình bao bọc tập lệnh khỏi tệp được bao gồm đã giải quyết được sự cố.

+0

Cảm ơn rất nhiều vì đã dành thời gian để báo cáo điều này, Dave. Trên thực tế tại một số điểm kể từ khi yêu cầu câu hỏi này, vấn đề kỳ diệu cố định chính nó cho tôi - có lẽ do nâng cấp của tôi của Rails đến 3,2 hoặc một trong những viên đá quý? Tuy nhiên, tôi chấp nhận câu trả lời của bạn vì nó có vẻ giống như một giải pháp hợp lý cho những người vẫn gặp sự cố. –

+0

và 9 tháng sau .... nó khắc phục sự cố của tôi! – Ryan

+0

Cảm ơn! Tôi đã xem qua điều này trong đường ray 3.2. Siêu hữu ích! – EricC

0

Tôi gặp vấn đề tương tự.

Mặc dù tôi không có thẻ <script> trong tệp javascript của mình, đề xuất của Dave đã giúp tôi rất nhiều!

tôi đã có thể nhận ra một nhận xét về lib bên ngoài tôi đã tải trong application.js tôi:

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

Đó bình luận duy nhất được phá vỡ nén uglifier của tôi và nó đã cho tôi một thời gian dài để tìm thấy nó và thậm chí có thể nghĩ đó là thủ phạm.

Vì vậy, hãy xem xem các nhận xét khi bắt đầu các tệp JS, vì có thể làm hỏng quá trình nén của bạn.

+0

Nếu bạn muốn đặt nhận xét trong JavaScript của mình, hãy sử dụng '/ * */'hoặc' // '. – meagar

+0

Cảm ơn bạn đã biết mẹo đó đến từ mã nhúng 'hotjar', mà một số dev được sao chép khi nó thêm hotjar. – lucasarruda

5

Đây là cách tôi đã sửa lỗi này.

tại địa phương, chạy

RAILS_ENV=production bundle exec rake assets:precompile

Cố gắng tìm ra nơi nó nghẹn (kịch bản ngay trước khi nghẹn là file bạn sẽ muốn xem xét). Nhìn vào tất cả các yêu cầu.

Trong trường hợp của tôi, tôi đã có tệp kết thúc bằng .js khi cần phải là .jsx và đó là những gì đã sửa.

Các vấn đề liên quan