跳至主要內容

Relay v15.0

·4 分鐘閱讀

Relay 團隊很高興宣布 Relay v15 的發布。雖然此版本是主要版本更新,並包含一些重大變更,但我們預期大多數使用者不會受到影響,並且會體驗到無縫升級。您可以在 v15 發行說明中找到完整的變更列表。

Relay 15 的新功能?

支援介面上的 @refetchable

先前無法在伺服器介面類型的片段定義上新增 @refetchable 指令。

// schema.graphql

interface RefetchableInterfaceFoo @fetchable(field_name: "id") {
id: ID!
}

extend type Query {
fetch__RefetchableInterfaceFoo(id: ID!): RefetchableInterfaceFoo
}

// fragment

fragment RefetchableFragmentFoo on RefetchableInterfaceFoo
@refetchable(queryName: "RefetchableFragmentFooQuery") {
id
}

持續查詢改進

如果您使用基於 URL 的持續查詢,您現在可以指定自訂標頭,以便與持續查詢的請求一起傳送。例如,這可以用來將驗證標頭傳送到您的查詢持續 URL 端點。

persistConfig: {
url: 'example.com/persist',
headers: {
Authorization: 'bearer TOKEN'
}
}

對於基於檔案的持續查詢,我們新增了一個新的功能旗標 compact_query_text,它會從持續查詢文字中移除所有空白。這可以使檔案縮小 60% 以上。此新功能旗標可以在您的 Relay 組態檔案中啟用。

persistConfig: {
file: 'path/to/file.json',
algorithm: 'SHA256'
},
featureFlags: {
compact_query_text: true
}

類型安全更新現在支援遺失欄位處理程式

類型安全更新程式現在支援遺失欄位處理程式。先前,如果您在類型安全更新程式中選取 node(id: 4) { ... on User { name, __typename } },但該使用者是以不同的方式提取的(例如,使用 best_friend { name }),您將無法使用類型安全更新程式來存取和變更該使用者。

在此版本中,我們新增了對類型安全更新程式中遺失欄位處理程式的支援,這表示如果為節點設定了遺失欄位處理程式(如此範例所示),您將能夠使用此遺失欄位處理程式更新使用者的名稱。

為了支援此功能,遺失欄位處理程式的簽名已變更。處理程式的 record 引數以前接收 Record 類型(這是一個未鍵入的資料包)。現在它會接收 ReadOnlyRecordProxy。此外,類型為 NormalizationLinkedField 的欄位引數現在是 CommonLinkedField,這是一個包含 ReaderLinkedFieldNormalizationLinkedField 中屬性的類型。

Flow 類型改進

Flow 使用者現在將從具有更多 Relay API 的 graphql 字面值推斷類型。Flow 使用者不再需要明確鍵入 usePreloadedQueryuseQueryLoaderuseRefetchableFragmentusePaginationFragmentuseBlockingPaginationFragment API 方法的傳回值。

Relay 解析器改進

自上次發布以來,我們的大部分開發工作都投入到改進 Relay 解析器(一種在圖表中公開衍生資料的機制)。值得注意的是,Relay 解析器仍處於實驗階段,未來可能會發生 API 變更。

更簡潔的 docblock 標籤

Relay 解析器函數的註解已簡化。在許多情況下,您現在可以使用 ParentType.field_name: ReturnType 語法來定義您的 Relay 解析器公開的新欄位。

之前

/**
* @RelayResolver
* @onType User
* @fieldName favorite_page
* @rootFragment myRootFragment
*/

之後

/**
* @RelayResolver User.favorite_page: Page
* @rootFragment myRootFragment
*/

在上面的範例中,Page 類型是結構描述類型。如果您的 Relay 解析器未傳回結構描述類型,您可以使用固定的 RelayResolverValue 值作為您的傳回類型。

/**
* @RelayResolver User.best_friend: RelayResolverValue
* @rootFragment myRootFragment
*/

每個檔案定義多個解析器

在此版本之前,我們只允許每個檔案有一個 Relay 解析器,並要求 Relay 解析器函數為預設匯出。在 Relay 15 中,您現在可以在每個檔案中定義多個 Relay 解析器,並使用具名匯出。

/**
* @RelayResolver User.favorite_page: Page
* @rootFragment favoritePageFragment
*/
function usersFavoritePage(){
...
}

/**
* @RelayResolver User.best_friend: RelayResolverValue
* @rootFragment bestFriendFragment
*/
function usersBestFriend(){
...
}

module.exports = {
usersFavoritePage,
usersBestFriend
}

快樂查詢!