GraphQl Relay Vite 및 Github API 사용 경험

11473 단어 relaygraphqlreactvite

계전기



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개를 가져오고 자동으로 이전 데이터에 병합합니다.
  • ### 큰 쿼리에 의존하는 복잡한 애플리케이션
    모든 구성 요소에 대한 프레임을 구성한 다음 컴파일러가 이를 가장 최적의 쿼리로 결합하도록 하는 것은 마법입니다
  • .


    단점


  • 설정 프로세스가 지루하고 cmmunity 문서가 매우 부족함
  • 쿼리 결과에 로드 상태 및 오류 상태가 직접 포함되지 않으며 구성 요소를 apollo-clienturql로 래핑해야 합니다.

  •   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 대신
  • 를 사용하여 측면 분리할 수 있습니다.
  • 에는 서버에 compliant schema이 있어야 합니다.
    내 경우에는 github graphql api를 사용하고 있지만 자체 서버가 있는 경우 Hasura과 같은 것을 사용하거나 직접 만들 때 지정된 사양
  • 을 따를 수 있습니다.

    용법


  • npm 설치
  • npm 실행 개발
    > 이것은 컴파일러를 한 번만 실행합니다. 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__/**"
        ]
      }
    


    전체 코드

    좋은 웹페이지 즐겨찾기