Astro 4.14 引進了新的功能:Content Layer,加強了原有的 Content Collection。原本的 Content Collection 資料只能放在 src/content
資料夾裡面,新的 Content Layer 則是沒有這個限制了,可以想放在哪個路徑就放在哪個路徑,即使資料來源在網路上也 OK。我們接下來就看看它的用法吧。
啟用 Content Layer
首先因為 Content Layer 還是實驗功能,所以要在 Astro config 啟用:
Loader
在舊有的 Content Collection,定義可能長這樣子:
要使用新的 Content Layer,我們把 type
去掉,加上一個 loader
:
這個 loader
是 Content Layer 的重點,現在在 Astro 有兩個內建的 loader
:glob
跟 file
。你可以用 glob
loader 存取本地的資料,這個資料不一定要在 src/content
底下,或者可以用 file
loader 存取包含很多筆資料的單一檔案。
除了使用內建的 loader 外,也可以自己做一個 loader 獲得不知道哪來的資料,像 NotWoods 就做了一個 Notion Loader,可以把 Notion 的頁面當做資料來源。
跟 Content Collection 的差別
除了剛剛提到 Content Layer 的資料放置位置沒有 Content Collection 的限制外,Content Layer 跟 Content Collection 還有一些差別,使得要改用 Content Layer 需要改很多東西。
Slug vs ID
在 type
為 content
的 Content Collection 中有一個特殊的 property:slug
,它預設從 file id 產生,也可以自己另外設定。在一個 Content Collection 中每個 entry 的 slug
都是獨一無二的,可以用 slug
經由 getEntry()
取得它所代表的 entry。
但是在 Content Layer slug
被合併成 id
了,所以如果是 Markdown 檔案的 Content Collection 要改成 Content Layer 的話,要把所有 slug
替換成 id
。
Markdown 內容的 render()
原本 Content Collection 中將內容 render 成 HTML 的 render()
是 entry 的 function property:
在 Content Layer 裡獨立出來了,需要另外 import:
結論
Content Layer 比 Content Collection 還要強大,可以自製的 loader
讓內容不只侷限在 src/content
中的檔案。但是要將 Markdown Collection 改成 Content Layer 會是一個大工程。
要詳細了解 Content Layer 可以參考: