web-dev-qa-db-ja.com

Next.jsアプリでGraphQLを使用する推奨方法

私のアプリでは、次のNPMモジュールを使用して StrapiGraphQL および- Next.js

次のステップでは、以下の例のようにApollo構成ファイルを作成しています。

_import { HttpLink } from "apollo-link-http";
import { withData } from "next-apollo";

const config = {
  link: new HttpLink({
    uri: "http://localhost:1337/graphql",
  })
};
export default withData(config);
_

次に、クラスコンポーネント内で、静的メソッドgetInitialProps()を使用して、GraphQLクエリを介してStrapiからデータをフェッチしています。

すべては問題ありませんが、Reactフックまたは他の方法で別のより良い方法があるでしょうか?

7
Mario Boss

Next.jsとGraphQL用のもう1つのNiceフックソリューションを見つけました。

共有したいと思います。はじめましょう。

注:私は、Next.jsアプリケーションがすでにインストールされていることを前提としています。そうでない場合は、これに従ってください ガイド

このソリューションを構築するには、次のものが必要です。

1。npmコマンドを実行します。

npm install --save @apollo/react-hooks apollo-cache-inmemory apollo-client apollo-link-http graphql graphql-tag isomorphic-unfetch next-with-apollo

2。Appolo設定ファイルを作成します。フォルダ./configにあり、appollo.jsと呼びます。以下のファイルコード:

import { ApolloClient } from "apollo-client";
import { InMemoryCache } from "apollo-cache-inmemory";
import withApollo from "next-with-apollo";
import { createHttpLink } from "apollo-link-http";
import fetch from "isomorphic-unfetch";

const GRAPHQL_URL = process.env.BACKEND_URL || "https://api.graphql.url";

const link = createHttpLink({
  fetch,
  uri: GRAPHQL_URL
});

export default withApollo(
  ({ initialState }) =>
    new ApolloClient({
      link: link,
      cache: new InMemoryCache()
        .restore(initialState || {})
    })
);

3。以下のコードを使用して、_app.jsフォルダに./pagesファイル(ラッパーの一種)を作成します。

import React from "react";
import Head from "next/head";
import { ApolloProvider } from "@apollo/react-hooks";
import withData from "../config/apollo";

const App = ({ Component, pageProps, apollo }) => {
  return (
    <ApolloProvider client={apollo}>
      <Head>
        <title>App Title</title>
      </Head>
      <Component {...pageProps} />
    </ApolloProvider>
  )
};

export default withData(App);

4。再利用可能なクエリコンポーネントを作成します。 ./components/query.js

import React from "react";  
import { useQuery } from "@apollo/react-hooks";

const Query = ({ children, query, id }) => {  
  const { data, loading, error } = useQuery(query, {
    variables: { id: id }
  });

  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {JSON.stringify(error)}</p>;
  return children({ data });
};

export default Query;

5。GraphQLを介してフェッチされたデータのコンポーネントを作成します

import React from "react";
import Query from "../components/query";
import GRAPHQL_TEST_QUERY from "../queries/test-query";

const Example = () => {  
  return (
    <div>
      <Query query={GRAPHQL_TEST_QUERY} id={null}>
        {({ data: { graphqlData } }) => {
          return (
            <div>
              {graphqlData.map((fetchedItem, i) => {
                return (
                  <div key={fetchedItem.id}>
                    {fetchedItem.name}
                  </div>
                );
              })}
            </div>
          );
        }}
      </Query>
    </div>
  );
};

export default Example;

6。./queries/test-query内にGraphQLクエリを作成します。 注:GraphQLを介してサンプルデータとプロパティidおよびnameにアクセスできると想定しています

import gql from "graphql-tag";

const GRAPHQL_TEST_QUERY = gql`
  query graphQLData {
    exampleTypeOfData {
      id
      name
    }
  }
`;

export default GRAPHQL_TEST_QUERY;

7。結果を表示するには、以下のコードを使用してindex.jsフォルダーに./pagesファイル(ホームページ)を作成します。

import Example from './components/example';

const Index = () => <div><Example /></div>

export default Index;

それがすべてです。このソリューションを好きなように楽しんで拡張してください。

4
Mario Boss

apollo-server-microlodash を使用して、もう1つの興味深いソリューションを見つけました

クイックガイド:

  1. next.jsアプリ(例名:next-app)を作成し、必要なパッケージをインストールします

    npm i apollo-server-micro lodash
    
  2. next.jsアプリで必要なファイルを作成します(next-app

    • /next-app/pages/api/graphql/index.js
    • /next-app/pages/api/graphql/resolvers.js
    • /next-app/pages/api/graphql/typeDefs.js
  3. index.jsにコードを追加する

    import { ApolloServer } from 'apollo-server-micro';
    import resolvers from './resolvers';
    import typeDefs from './TypeDef';
    
    const apolloServer = new ApolloServer({
        typeDefs,
        resolvers,
    });
    
    export const config = {
        api: {
            bodyParser: false
        }
    };
    
    export default apolloServer.createHandler({ path: '/api/graphql' });
    
  4. typeDefs.jsにコードを追加する

    import { gql } from 'apollo-server-micro';
    
    const typeDefs = gql`
        type User {
            id: Int!
            name: String!
            age: Int
            active: Boolean!
        }
        type Query {
            getUser(id: Int): User
        }
    `;
    
    export default typeDefs;
    
  5. resolvers.jsにコードを追加する

    import lodash from 'lodash/collection';
    
    const users = [
        { id: 1, name: 'Mario', age: 38, active: true },
        { id: 2, name: 'Luigi', age: 40, active: true},
        { id: 3, name: 'Wario', age: 36, active: false }
    ];
    
    const resolvers = {
        Query: {
            getUser: (_, { id }) => {
                return lodash.find(users, { id });
            }
        }
    };
    
    export default resolvers;
    
  6. 以下のコマンドを実行し、graphql URLをチェックして、Next.jsアプリ(next-app)をテストします http:// localhost:3000/api/graphql

    npm run dev
    
4
Mario Boss