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
,這是一個包含 ReaderLinkedField
和 NormalizationLinkedField
中屬性的類型。
Flow 類型改進
Flow 使用者現在將從具有更多 Relay API 的 graphql
字面值推斷類型。Flow 使用者不再需要明確鍵入 usePreloadedQuery
、useQueryLoader
、useRefetchableFragment
、usePaginationFragment
和 useBlockingPaginationFragment
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
}
快樂查詢!