指南是我寫的。
您肯定不想活在生產(chǎn)中編譯。
當(dāng)您進(jìn)行編譯時,會發(fā)生這樣的情況:
對/Asset中的文件的每個請求都傳遞給鏈輪。在第一在Rails用于緩存(通常是文件系統(tǒng))的任何資源中編譯和緩存每個資產(chǎn)的請求。
在隨后的請求中,鏈輪接收到請求,并必須查找指紋文件名,檢查構(gòu)成資產(chǎn)的文件(圖像)或文件(CSS和js)沒有被修改,如果存在緩存版本,則提供該文件。
那是一切在“資產(chǎn)”文件夾中和在插件使用的任何供應(yīng)商/資產(chǎn)文件夾中。
這是很大的開銷,因為,老實說,代碼并不是為了速度而優(yōu)化的。
這將對資產(chǎn)傳輸?shù)娇蛻舳说乃俣犬a(chǎn)生影響,并會對站點的頁面加載時間產(chǎn)生負(fù)面影響。
與默認(rèn)情況相比:
當(dāng)資產(chǎn)預(yù)編譯和編譯關(guān)閉時,將對資產(chǎn)進(jìn)行編譯,并將其指紋到public/assets
..鏈輪將普通文件名到指紋文件名的映射表返回給Rails,Rails將其寫入文件系統(tǒng)。清單文件(Rails 3中的yml或Rails 4中具有隨機(jī)名稱的JSON)在啟動時由Rails加載到內(nèi)存中,并被緩存以供資產(chǎn)助手方法使用。
這使得具有正確指紋資產(chǎn)的頁面生成非??欤募旧淼姆?wù)則是從文件系統(tǒng)中快速生成Web服務(wù)器。兩者都比實時編譯快得多。
要獲得管道和指紋的最大優(yōu)勢,您需要在Web服務(wù)器上設(shè)置未來的頭文件,并為js和css文件啟用gzip壓縮。鏈輪編寫gzip版本的資產(chǎn),您可以設(shè)置您的服務(wù)器使用,消除了它這樣做的需要,為每個請求。
這將盡可能快地將資產(chǎn)分發(fā)給客戶端,并且在盡可能小的大小下,加快頁面的客戶端顯示速度,并減少(具有遙遠(yuǎn)未來的頭)請求。
因此,如果您正在進(jìn)行實時編譯,則如下所示:
- 很慢
- 缺乏壓縮
- 將影響頁的呈現(xiàn)時間。
對決
- 越快越好
- 壓縮
- 刪除從服務(wù)器無意中聽到的壓縮(可選)。
- 盡量減少頁面的呈現(xiàn)時間。
編輯:(回復(fù)后續(xù)評論)
管道能更改為在第一個請求時預(yù)編譯,但這樣做有一些主要障礙。首先,必須有一個查表來查找指紋名稱,否則助手方法太慢。在按需編譯的情況下,在編譯或請求每個新資產(chǎn)時,需要有一些方式來附加到查找表。
此外,在所有資產(chǎn)匯編到位之前,有些人將不得不在一段未知的時期內(nèi)支付緩慢交付資產(chǎn)的代價。
默認(rèn)情況下,編譯所有內(nèi)容的代價是一次性支付的,它不會影響公眾訪問者,并確保一切在事情開始運行之前都能正常工作。
打破這一協(xié)議的原因是,它給生產(chǎn)系統(tǒng)增加了許多復(fù)雜性。
如果您正在閱讀這篇文章,因為您正在為部署過程中的緩慢編譯時間尋找解決方案,那么您可以考慮在本地預(yù)編譯這些資產(chǎn)。有關(guān)這方面的信息,請參閱資產(chǎn)管道指南..這允許您只在發(fā)生更改時在本地預(yù)編譯,提交該更改,然后在沒有預(yù)編譯階段的情況下進(jìn)行快速部署。