2011-11-04 129 views
28

在Rails 3.1中,您必須將您希望包含在資源預編譯中的文件列入白名單。您必須打開配置/環境/ production.rb並明確包括資產你想預編譯:config.assets.precompile的用途是什麼?

config.assets.precompile += ['somestylesheet.css']

如果你不這樣做,這一點,你運行耙資產:預編譯,你的資產會不會被複制到公共/資產,並且您的應用程序會在找不到資產時引發異常(因此會導致生產中出現500錯誤)。

這是爲什麼這是必要的?爲什麼全部資產自動預編譯?

這種當前的方法在部署時會產生額外的代碼和壓力。黑名單/排除資產不是很容易嗎,所以事情就是開箱即用的。其他人分享這些感受?

+1

只是爲了澄清,這更多的是**需要明確**指定資產的批評。 rails預編譯過程不僅僅是編譯代碼,它還會將編譯後的資源代碼複製到Web服務器的公共目錄中。 即使資產不需要編譯(如簡單的'.js'文件),您仍然需要告訴應用程序「預編譯」它,以便將其複製到'public/assets'。如果您不這樣做,那麼需要該資產的頁面會引發異常。 – dhulihan

+1

如果您正在合併和縮小文件的練習中,您可能不希望預編譯所有資產。此技術適用於您計劃單獨包含的資產。例如,在application.js中,您可以'需要'許多其他不需要預編譯的JS文件。 –

+0

@Simon Peck:你說的對,一些資產不需要預先編譯,但如果它們沒有明確包含,它們將不會被複制到最終資產位置(例如:'public/assets'),並且在請求時不會被找到。 使用'// = require'將資產添加到'application.js'工作,但會增加帶寬開銷,並且不適用於不會在站點範圍內使用的資產。 – dhulihan

回答

2

預編譯給我的資產非常酷,因此您不會最終部署不需要的資產。不要忘記uglifer寶石可以幫助壓縮你的javascript。想象所有這些都不存在,你只需部署你的應用程序,你會發現你有未使用的CSS文件和未壓縮的JavaScript。你覺得如何。這只是我自己的看法,我說資產管道是鐵軌中最酷的東西。能夠正確管理所有資產。

你得注意,如果我的軌道我不想編譯你不想這樣,你會在你的心中說爲什麼這個傢伙編譯這些資產的資產.. :)

+0

好點,感謝您的反饋。如果一個資產沒有在應用程序中使用,它不應該是其文件結構的一部分。除非這些不需要的資產是第三方gem的一部分,這些寶石具有其他所需的非資產功能。 – dhulihan

+4

我寧願有比用戶看到頁面500更多的未使用資產,因爲某些內容沒有明確編譯。 – Gunchars

19

大部分資產自動包含在資產預編譯中。按照RoR Guide on the Asset Pipeline

編譯文件的默認匹配包括的application.js,application.css和所有文件不結束JS和CSS:[ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]

如果你會使用config.assets.precompile有額外的資產包括:

config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

或者你可以覆蓋它。

+1

這裏的關鍵詞是* most *。您仍然需要明確地將這些額外的任意資產(如admin.js)添加到您的應用配置中,或者某些頁面可能會引發異常。我在辯論這個額外的步驟可能沒有必要。 – dhulihan

8

我認爲這與管道/鏈輪需要單獨文件的能力有關。

例如,我在我的app/assets/javascripts文件夾中有一個admin.js文件。但它所做的只是需要其他幾個.js文件。

//= require jquery 
//= require jquery_ujs 
//= require jquery.colorpicker.js 
//= require jquery.wysiwyg.js 
//= require wysiwyg.image.js 
//= require jquery.fileupload.js 
//= require jquery.fileupload-ui.js 
//= require codemirror.js 
//= require css.js 
//= require admin_load 

這是因爲(a)我使用外部JS插件和(b)我喜歡讓事情就像在不同的文件jQuery的onload事件處理程序。

如果 .js文件預編譯,那麼它會預先編譯這些單獨的文件,這是完全沒有必要的每一個。我想要/需要的是預編譯的單個admin.js文件。

同樣適用於CSS文件。

+4

的確,有些資源不需要任何形式的編譯(比如普通的'.js'文件),不應該編譯它們,就像你說的那樣。但是,如果您在鏈接清單以外的地方使用此資產(例如:在視圖中使用'javascript_include_tag'admin.js''),並且您沒有在應用程序的配置中明確包含此專用資源,則它永遠不會複製到'public/assets',頁面會在生產中引發異常。 – dhulihan