Next.js+GrapqhQL로 Shopify 앱 개발
소개
최근 화제의 Shopify로 앱을 개발하고 있습니다.
처음으로 GrapqhQL을 만져 Shopify 앱 개발과의 친화성의 높이, 확장성의 높이에 놀랐습니다.
GraphQL로 개발할 때 막힌 부분이 많아 해결책을 남겨 둡니다.
이 기사의 타겟
GraphQL+Next.js의 보일러 플레이트에서 프로젝트 만들기 및 이동
Shopify App CLI 을 사용하여 출력합시다.
shopify create node
대화식에 여러가지 듣기 때문에, 적절히 입력합니다.
완료하고 다음을 실행하면 설치하기위한 URL이 출력되어 스토어에 앱 설치를 할 수 있습니다.
shopify serve
설치 실행 후, 다음과 같은 화면이 되어 Next.js가 움직이고 있는 것을 알 수 있습니다.
소스 코드는 다음과 같아야 합니다.
GraphQL 클라이언트 설치
기본적으로 GraphQL을 실행하기위한 클라이언트가 없으므로 설치합니다.
yarn add @apollo/react-hooks
Component 만들기
ShowProducts
루트 디렉토리에 Components 디렉토리를 작성하고 ShowProducts.js를 작성하십시오.
그 전에 스토어의 관리 화면 왼쪽 메뉴의 상품 관리에서 테스트용으로 상품을 하나 작성해 둡시다.
소스 코드는 여기입니다.
import React from "react";
import { useQuery } from "@apollo/react-hooks";
import { gql } from "apollo-boost";
const GET_PRODUCTS = gql`
query GET_PRODUCTS {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
`;
import ApolloClient from "apollo-boost";
const client = new ApolloClient({
fetch: fetch,
fetchOptions: {
credentials: "include",
},
});
const ShowProducts = () => {
const { data, loading, refetch } = useQuery(GET_PRODUCTS, { client: client });
if (loading || !data.products) {
return <div>Loading...</div>;
}
const products = data.products.edges.map((productEdge) => (
<div key={productEdge.node.id}>
<p>id: {productEdge.node.id}</p>
<p>title:{productEdge.node.title}</p>
</div>
));
return (
<div>
{products}
<button
onClick={() => {
refetch();
}}
>
refetch
</button>
</div>
);
};
export default ShowProducts;
이 부분에서 Shopify에 던지는 GraphQL을 정의합니다.
const GET_PRODUCTS = gql`
query GET_PRODUCTS {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
`;
↑로 정의한 GraphQL은 이하 useQueryhook로 실행되어 data에 결과가 들어갑니다.
const { data, loading, refetch } = useQuery(GET_PRODUCTS, { client: client });
이제 방금 만든 상품이 표시되고 있는지 생각합니다.
AddProduct
다음으로 GraphQL로 앱에서 제품을 만들어 보겠습니다.
Component 디렉토리에 AddProduct.js를 만듭니다.
소스 코드는 다음과 같습니다.
import React, { useState } from "react";
import { gql } from "apollo-boost";
import ApolloClient from "apollo-boost";
import { useMutation } from "@apollo/client";
const client = new ApolloClient({
fetch: fetch,
fetchOptions: {
credentials: "include",
},
});
const ADD_PRODUCT = gql`
mutation ADD_PRODUCT($title: String!) {
productCreate(input: { title: $title }) {
product {
id
}
}
}
`;
const AddProduct = () => {
const [addProduct] = useMutation(ADD_PRODUCT, { client });
const [productTitle, setProductTitle] = useState("");
return (
<div>
<label>
Title
<input
type="text"
value={productTitle}
onChange={(event) => {
setProductTitle(event.target.value);
}}
/>
<button
onClick={() => {
addProduct({
variables: {
title: productTitle,
},
});
}}
>
Submit
</button>
</label>
</div>
);
};
export default AddProduct;
아래에 저장할 GraphQL을 정의합니다.
const ADD_PRODUCT = gql`
mutation ADD_PRODUCT($title: String!) {
productCreate(input: { title: $title }) {
product {
id
}
}
}
`;
버튼을 클릭하여 상품을 추가할 수 있음을 확인할 수 있다고 생각합니다.
요약
이것으로 취득과 추가 일대로의 처리의 흐름을 확인할 수 있었다고 생각합니다.
GraphQL에서 TypeScript 유형을 생성할 수 있어 RestAPI보다 견고하게 작성하는 비용이 낮아지는 것이 좋다고 느꼈습니다.
여기에서 한 걸음 나아가 스스로 작성한 GraphQL 서버와 Shopify의 GraphQL의 결합도 가능하고, 실제로 만들어 보았는데 기능 확장이 꽤 용이하게 할 수 있었으므로 이것도 언젠가 기사로 하고 싶습니다.
Reference
이 문제에 관하여(Next.js+GrapqhQL로 Shopify 앱 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hal_256/items/07626bb0621bc6c8eef8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
shopify create node
shopify serve
기본적으로 GraphQL을 실행하기위한 클라이언트가 없으므로 설치합니다.
yarn add @apollo/react-hooks
Component 만들기
ShowProducts
루트 디렉토리에 Components 디렉토리를 작성하고 ShowProducts.js를 작성하십시오.
그 전에 스토어의 관리 화면 왼쪽 메뉴의 상품 관리에서 테스트용으로 상품을 하나 작성해 둡시다.
소스 코드는 여기입니다.
import React from "react";
import { useQuery } from "@apollo/react-hooks";
import { gql } from "apollo-boost";
const GET_PRODUCTS = gql`
query GET_PRODUCTS {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
`;
import ApolloClient from "apollo-boost";
const client = new ApolloClient({
fetch: fetch,
fetchOptions: {
credentials: "include",
},
});
const ShowProducts = () => {
const { data, loading, refetch } = useQuery(GET_PRODUCTS, { client: client });
if (loading || !data.products) {
return <div>Loading...</div>;
}
const products = data.products.edges.map((productEdge) => (
<div key={productEdge.node.id}>
<p>id: {productEdge.node.id}</p>
<p>title:{productEdge.node.title}</p>
</div>
));
return (
<div>
{products}
<button
onClick={() => {
refetch();
}}
>
refetch
</button>
</div>
);
};
export default ShowProducts;
이 부분에서 Shopify에 던지는 GraphQL을 정의합니다.
const GET_PRODUCTS = gql`
query GET_PRODUCTS {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
`;
↑로 정의한 GraphQL은 이하 useQueryhook로 실행되어 data에 결과가 들어갑니다.
const { data, loading, refetch } = useQuery(GET_PRODUCTS, { client: client });
이제 방금 만든 상품이 표시되고 있는지 생각합니다.
AddProduct
다음으로 GraphQL로 앱에서 제품을 만들어 보겠습니다.
Component 디렉토리에 AddProduct.js를 만듭니다.
소스 코드는 다음과 같습니다.
import React, { useState } from "react";
import { gql } from "apollo-boost";
import ApolloClient from "apollo-boost";
import { useMutation } from "@apollo/client";
const client = new ApolloClient({
fetch: fetch,
fetchOptions: {
credentials: "include",
},
});
const ADD_PRODUCT = gql`
mutation ADD_PRODUCT($title: String!) {
productCreate(input: { title: $title }) {
product {
id
}
}
}
`;
const AddProduct = () => {
const [addProduct] = useMutation(ADD_PRODUCT, { client });
const [productTitle, setProductTitle] = useState("");
return (
<div>
<label>
Title
<input
type="text"
value={productTitle}
onChange={(event) => {
setProductTitle(event.target.value);
}}
/>
<button
onClick={() => {
addProduct({
variables: {
title: productTitle,
},
});
}}
>
Submit
</button>
</label>
</div>
);
};
export default AddProduct;
아래에 저장할 GraphQL을 정의합니다.
const ADD_PRODUCT = gql`
mutation ADD_PRODUCT($title: String!) {
productCreate(input: { title: $title }) {
product {
id
}
}
}
`;
버튼을 클릭하여 상품을 추가할 수 있음을 확인할 수 있다고 생각합니다.
요약
이것으로 취득과 추가 일대로의 처리의 흐름을 확인할 수 있었다고 생각합니다.
GraphQL에서 TypeScript 유형을 생성할 수 있어 RestAPI보다 견고하게 작성하는 비용이 낮아지는 것이 좋다고 느꼈습니다.
여기에서 한 걸음 나아가 스스로 작성한 GraphQL 서버와 Shopify의 GraphQL의 결합도 가능하고, 실제로 만들어 보았는데 기능 확장이 꽤 용이하게 할 수 있었으므로 이것도 언젠가 기사로 하고 싶습니다.
Reference
이 문제에 관하여(Next.js+GrapqhQL로 Shopify 앱 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hal_256/items/07626bb0621bc6c8eef8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import React from "react";
import { useQuery } from "@apollo/react-hooks";
import { gql } from "apollo-boost";
const GET_PRODUCTS = gql`
query GET_PRODUCTS {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
`;
import ApolloClient from "apollo-boost";
const client = new ApolloClient({
fetch: fetch,
fetchOptions: {
credentials: "include",
},
});
const ShowProducts = () => {
const { data, loading, refetch } = useQuery(GET_PRODUCTS, { client: client });
if (loading || !data.products) {
return <div>Loading...</div>;
}
const products = data.products.edges.map((productEdge) => (
<div key={productEdge.node.id}>
<p>id: {productEdge.node.id}</p>
<p>title:{productEdge.node.title}</p>
</div>
));
return (
<div>
{products}
<button
onClick={() => {
refetch();
}}
>
refetch
</button>
</div>
);
};
export default ShowProducts;
const GET_PRODUCTS = gql`
query GET_PRODUCTS {
products(first: 10) {
edges {
node {
id
title
}
}
}
}
`;
const { data, loading, refetch } = useQuery(GET_PRODUCTS, { client: client });
import React, { useState } from "react";
import { gql } from "apollo-boost";
import ApolloClient from "apollo-boost";
import { useMutation } from "@apollo/client";
const client = new ApolloClient({
fetch: fetch,
fetchOptions: {
credentials: "include",
},
});
const ADD_PRODUCT = gql`
mutation ADD_PRODUCT($title: String!) {
productCreate(input: { title: $title }) {
product {
id
}
}
}
`;
const AddProduct = () => {
const [addProduct] = useMutation(ADD_PRODUCT, { client });
const [productTitle, setProductTitle] = useState("");
return (
<div>
<label>
Title
<input
type="text"
value={productTitle}
onChange={(event) => {
setProductTitle(event.target.value);
}}
/>
<button
onClick={() => {
addProduct({
variables: {
title: productTitle,
},
});
}}
>
Submit
</button>
</label>
</div>
);
};
export default AddProduct;
const ADD_PRODUCT = gql`
mutation ADD_PRODUCT($title: String!) {
productCreate(input: { title: $title }) {
product {
id
}
}
}
`;
Reference
이 문제에 관하여(Next.js+GrapqhQL로 Shopify 앱 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hal_256/items/07626bb0621bc6c8eef8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)