GraphQl Relay Vite 및 Github API 사용 경험
계전기
Relay는 유지 보수성, 유형 안전성 및 런타임 성능을 강조하는 React 애플리케이션에서 GraphQL 데이터를 가져오고 관리하기 위한 JavaScript 프레임워크입니다.
나는 그것을 반응의 제작자 인 메타가 만든 매우 독단적 인 grapqhql 클라이언트로 간단히 요약하고 싶습니다.
full code
릴레이의 이상적인 사용 사례
여러 계층의 페이지 매김이 있는 중첩된 구성 요소
이것이 내가 그것을 선택한 주된 이유이며 더 빨리 기회를 주었으면합니다
{!fragData.isLoadingNext &&
fragData.hasNext ? (
<button
className="m-2 hover:text-purple-400 shadow-lg hover:shadow-purple"
onClick={() => {
fragData.loadNext(5);
}}
>
--- load more ---
</button>
) : null}
해당 스니펫만 있으면 목록에서 다음 5개를 가져오고 자동으로 이전 데이터에 병합합니다.
모든 구성 요소에 대한 프레임을 구성한 다음 컴파일러가 이를 가장 최적의 쿼리로 결합하도록 하는 것은 마법입니다
단점
apollo-client
및 urql
로 래핑해야 합니다. const res = await response.json()
if(!response.ok){
throw new Error(res.message,res)
}
// Get the response as JSON
return res;
i also added that snippet to throw an error if the status wasn't ok becasuse errors from this specific graphql api were embedded as the response which would cause relay client to error out withut knowing what specific error was returned
react-query
에서 권장되는 가져오기 전략인 미리 가져오기 기능은 react-router에서 지원되지 않지만 Suspense
대신 내 경우에는 github graphql api를 사용하고 있지만 자체 서버가 있는 경우 Hasura과 같은 것을 사용하거나 직접 만들 때 지정된 사양
용법
> 이것은 컴파일러를 한 번만 실행합니다.
ErrorBoundary
플래그를 사용하여 컴파일러를 실행하려는 시도는 소용이 없었으므로 쿼리를 변경할 때마다 다른 터미널에서 npm 실행 릴레이를 실행합니다간단한 설명
이에 대한 나의 목표는 내 github API project, live preview에 대한 github 저장소 대시보드를 만드는 것이었습니다.
내가 원했던 것 중 하나는 모든 분기를 나열하고 두 레이어에 페이지 매김을 사용하여 각 분기 아래의 모든 cmmit을 나열하는 것이 었습니다.
첫 번째 레이어에 대한 페이지 번호 매기기는 반응 쿼리와 함께 작동했지만 문제가 계속 쌓여서 nesetd 페이지 번호 매기기를 시도할 때 경험이 더 일관성이 없었습니다. re-rener 및 위의 모든 것에서 매우 비효율적이며 예상대로 작동하지 않는 거의 3 수준 깊이로 중첩된 어레이를 병합해야 합니다.
참고: 이와 같은 경우 일반적으로 쿼리를 분해하고 cild 구성 요소에서 하위 쿼리를 실행하지만 이 경우 쿼리는 다음과 같습니다.
export const REPOREFS = gql`
# github graphql query to get more details
query getRepoRefs(
$repoowner: String!
$reponame: String!
$first: Int
$after: String
$firstcommits: Int
$$aftercommits: String
) {
repository(owner: $repoowner, name: $reponame) {
nameWithOwner
#refs: get branches and all the recent commits to it
refs(
refPrefix: "refs/heads/"
orderBy: { direction: DESC, field: TAG_COMMIT_DATE }
first: $first
after: $after
) {
edges {
node {
name
id
target {
... on Commit {
history(first: $firstcommits, after: $aftercommits) {
edges {
node {
committedDate
author {
name
email
}
message
url
pushedDate
authoredDate
committedDate
}
}
}
}
}
}
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
totalCount
}
# end of refs block
}
}
`;
하위 구성 요소의 커밋을 쿼리하기 위해 이 쿼리를 가져오기 위해 하위 구성 요소에 전달하는 변수가 없었습니다.
릴레이 대안은 다음과 같습니다
onerepo.tsx
export const FULLREPO = graphql`
query onerepoFullRepoQuery(
$repoowner: String!,
$reponame: String!,
) {
repository(owner: $repoowner, name: $reponame) {
nameWithOwner,
forkCount,
...Stars_stargazers
...Branches_refs
# stargazers(after:$after,first:$first) @connection(key: "Stars_stargazers"){
# ...Stars_stars
# }
}
}
`;
그런 다음 모든 하위 구성 요소는 기본 쿼리의 일부만 정의합니다.
branches.tsx
export const Branchesfragment = graphql`
fragment Branches_refs on Repository
@argumentDefinitions(
first: { type: "Int", defaultValue: 3 }
after: { type: "String" }
)
@refetchable(
queryName: "BranchesPaginationQuery"
) {
refs(
refPrefix: "refs/heads/"
orderBy: {
direction: DESC
field: TAG_COMMIT_DATE
}
first: $first
after: $after
) @connection(key: "Branches_refs",) {
edges {
node {
name
id
target {
...Commits_history
}
}
}
}
}
`;
Commits.tsx
export const CommitsOnBranchFragment = graphql`
fragment Commits_history on Commit
@argumentDefinitions(
first: { type: "Int", defaultValue: 5 }
after: { type: "String" }
)
@refetchable(
queryName: "CommitsPaginationQuery"
) {
history(first: $first, after: $after)
@connection(key: "Commits_history") {
edges {
node {
committedDate
author {
name
email
}
message
url
pushedDate
authoredDate
committedDate
}
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
totalCount
}
}
`;
자식 구성 요소에 상대적인 자율성을 부여하고 변경 사항을 격리하고 해당 구성 요소로 다시 렌더링합니다.
마지막으로 (릴레이 컴파일러)가 유형을 생성합니다. 모든 예제에서 흐름과 함께 이상한 팅이 있지만 package.json의 컴파일러 옵션에서 정의하면 typecrit 유형을 생성합니다.
"relay": {
"src": "./src",
"schema": "schema.docs.graphql",
"language": "typescript",
"eagerEsModules": true,
"exclude": [
"**/node_modules/**",
"**/__mocks__/**",
"**/__generated__/**"
]
}
전체 코드
Reference
이 문제에 관하여(GraphQl Relay Vite 및 Github API 사용 경험), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tigawanna/my-experience-with-graphql-relay-vite-and-github-api-5b97텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)