Ruby on Rails Assets Pipeline 的使用方式
Assets Pipeline
在 config/initializers/assets.rb
中把 assets 加入 precompile 的路徑,不建議使用 *.css *.js
加入所有的東西,因為會將一些有的沒的或是不需要的東西一起編譯進去。
assets pipeline 的主要好處就是把所有的 css 包成一個檔案,漸少 request 的數量,像是 application.css
會載入所有被 require
的檔案,最後只需要傳送一個 css 就行了,同理 javascript 也是如此。
Layout
看不懂在說什麼,直接看例子比較快。
假設現在我們的 layout 裡面有兩個不同的頁面 admin.html.erb 跟 user.html.erb,要分別讓他們使用不同的 css js。
1 | app |
但為了減少請求的數量,我們讓一個 layout 只需要一個 css 和一個 js,在 layout 中的話會像這樣:
1 | # app/views/layouts/admin.html.erb |
如果使用 admin 的 layout 就會載入 admin.css
admin.js
。
如果使用 user 的 layout 就會載入 user.css
user.js
。
Assets
現在 layout 的頁面只會分別載入一個 css js,那如果想要使用別人寫好的套件該怎麼辦?這時候就把套件用 require
的方式寫在 admin.css
admin.js
user.css
user.js
這四個檔案裡面。
1 | # app/assets/javascripts/user.js |
這邊只有舉 user.js
的例子而已,可以使用以下的方法來把你要的 css js 加進這四個檔案。
操作方法
- require [路徑] 載入某支特定檔案,如果這支檔案被載入多次,Sprockets 也會很聰明的只幫你載入一次。
- include [路徑] 與 require 一樣,差別在即使是被載入過的檔案也會再被載入。
- require_directory [路徑] 將路徑下不包含子目錄的檔案按照字母順序依次載入。
- require_tree [路徑] 會將路徑下包含子目錄的檔案全部載入。
- require_self [路徑] 告訴 Sprockets 再載入其他的檔案前,先將自己的內容插入。
- depend_on [路徑] 宣告依賴於某支 js,在需要通知某支快取的 assets 過期時非常實用。
- stub [路徑] 將路徑中的 assets 加入黑名單,所有其他的 require 都不會將他載入。
Precompile
在執行 precompile 的指令時,rails 預設只會 precompile 這兩個檔案 application.css
和 application.js
,所以像剛剛我們有使用 admin.css
admin.js
user.css
user.js
的話,就必須告知 rails 幫我們 precompile 這四個檔案。
1 | # config/initializers/assets.rb |
1 | rake assets:precompile |
執行完後,如果在 public/assets
下有看到我們產生的 css 和 js,那就代表成功了。
1 | public/assets |
注意
假如有用到很多的套件的話,盡量使用上面的方法,而下面這是萬用的解法,會降低效能所以不建議使用。
1 | # config/initializers/assets.rb |