@open-press/core
useSource
這是一個 React hook,可從 Press 樹狀結構已解析的來源對應表中讀取已註冊的 MDX 來源。它是同步的,可以在 <Press> 內部的任何地方安全地呼叫。
useSource 為一個同步 React Hook,設計用於在 <Press> 渲染樹內安全獲取已解析的 MDX 來源資料結構。
基於來源 ID 提取解析完畢之 MDX AST 及元資料。引擎保證資料填入於渲染週期之前,因此該方法不回傳 null。
import { useSource } from "@open-press/core"; function useSource<T = ResolvedSource>(id: string): T 參數 (Parameters)
| Name | Type | Default | Description |
|---|---|---|---|
id required | string | 於 ` |
回傳值 (Returns)
| Name | Type | Default | Description |
|---|---|---|---|
ResolvedSource | object | 引擎解析完成之來源物件,涵蓋區塊 (blocks)、區塊來源對應 (source maps) 及自訂元資料。支援利用 TypeScript 泛型 ` |
例外狀況 (Throws)
| Name | Type | Default | Description |
|---|---|---|---|
Outside Press Boundary | Error | 呼叫點缺乏 `PressContext`(不在 ` | |
Unknown Source ID | Error | 傳入之 `id` 未被註冊時拋出,並附帶已註冊來源清單提示。 |
範例:存取來源元資料
import { useSource } from "@open-press/core";
function CustomTableOfContents() {
const story = useSource("story");
return (
<ul>
{story.sections.map((s) => (
<li key={s.id}>{s.title}</li>
))}
</ul>
);
}範例:附帶泛型的強制轉換
import { useSource, type ResolvedSource } from "@open-press/core";
interface StorySource extends ResolvedSource {
sections: Array<{ id: string; title: string; chapterCount: number }>;
}
function ChapterCounts() {
const story = useSource<StorySource>("story");
return story.sections.map((s) => (
<div key={s.id}>{s.title}: {s.chapterCount} chapters</div>
));
} 適用場景與限制
適用情境:
- 開發底層工具:編寫替代
<Sections>的自訂文稿分配器。 - 進階版面元件:建構非標準樹狀結構之目錄 (
TOC)。 - 全域資訊介面:需存取來源彙整資料的自訂頁首、頁尾或統計儀表板。
禁止模式:
- MDX 區塊內部:MDX 節點已身處編譯管道中,應依賴 Prop drilling,不應反向透過 Hook 重取資料。
- 非 React 執行期:嘗試在伺服器端腳本或無
<Press>邊界處呼叫。對於外部腳本,應直接分析document.json產物。