影 響 RubyonRails 成為 Web 開發(fā)主流解決方案的最大阻力因素依然是執(zhí)行效率問題,這應(yīng)該是 Ruby 語言本身決定的。目前來說,除了使用可以使用合理的 cache 機(jī)制進(jìn)行優(yōu)化,我們還有一個非常容易做到的增效措施:把你站點(diǎn)中的靜態(tài)文件拆分出去,使用高性能 Web 服務(wù)器專門處理靜態(tài)文件,讓 Rails 的 router 從無謂的文件服務(wù)中解脫出來。
這里所說的靜態(tài)文件,主要是指 ROR 應(yīng)用中用到的,但不需要 Rails 解釋執(zhí)行的原始文件,比如圖片文件、CSS 風(fēng)格定義文件、Javascript 代碼文件等等,只要是可以離開 Rails 獨(dú)立存在的,都可以歸為靜態(tài)文件。每次向 Rails 請求文件,Rails 都會去查找相應(yīng)的 router,并進(jìn)行一定的操作,對于靜態(tài)文件,Rails 只是一個單純的 Web 服務(wù)器而已,那我們何不使用更加高效的軟件代替 Rails 執(zhí)行這部分功能呢。
ROR 有一個設(shè)置開關(guān),可以自定義靜態(tài)文件的引用起始地址:
ActionController::Base.asset_host = "http://assets."
這個選項(xiàng)可以設(shè)置在 config/environment.rb 文件中,這樣你的開發(fā)環(huán)境和產(chǎn)品環(huán)境使用同樣的配置參數(shù)。
進(jìn)行如上配置后,你可以使用專門為靜態(tài)文件進(jìn)行優(yōu)化的 Web 服務(wù)器提供對靜態(tài)文件的服務(wù),比如 Lighttpd、thttpd 等。Rails 只用于對動態(tài)請求的解析和執(zhí)行。
需要注意的是,如果想要讓你的 Rails 應(yīng)用方便這種 asset_host 的調(diào)整,你的源代碼中應(yīng)該充分使用 Rails 中 ActionView 提供的鏈接幫助函數(shù),不要將靜態(tài)文件的引用地址 hardcode 到代碼中,諸如:
- ActionView::Helpers::AssetTagHelper::image_tag —針對圖片的引用
- ActionView::Helpers::AssetTagHelper::javascript_include_tag —針對Javascript的引用
- ActionView::Helpers::AssetTagHelper::stylesheet_link_tag —針對CSS文件的引用
- ActionView::Helpers::FormTagHelper::image_submit_tag —表單圖片按鈕的引用
- ActionView::Helpers::UrlHelper::link_image_to —帶鏈接的圖片引用
更多信息可以好好研究 Rails API 文檔;比較重要的一點(diǎn)就是,ROR 為 Web 開發(fā)定制了大量有效的方法和規(guī)則,我們只要遵守,就可以獲得預(yù)料不到的好處!
標(biāo)簽:rubyonrails,優(yōu)化,靜態(tài)文件