Next.js와 Shopify에서 가장 빠른 EC 사이트 만들기 ②
12692 단어 shopifyTypeScriptnext.js
아직 읽지 않은 사람은 먼저 전반 기사를 읽는 것이 좋습니다.
전반 : Next.js와 Shopify에서 가장 빠른 EC 사이트 만들기 ①
후반 : Next.js와 Shopify에서 가장 빠른 EC 사이트 만들기 ② ← 지금 여기
상품 상세 화면 작성
다음에 간단한 상품의 상세 화면을 작성합니다.
["pages/[id].tsx"]
type DetailProps = {
product?: Product
errors?: string
};
const DetailPage = (props: DetailProps) => {
const {product, errors} = props;
if (errors) { return <p>Error: {props.errors}</p> }
if (!product) { return <p>Error: Product not found</p> }
return (
<Layout title={product.title}>
<div>
<p>{product.title}</p>
<img src={product.images[0].src} height={200}/>
</div>
</Layout>
)
}
export default DetailPage
이번에는 SSG에서 각각의 상품 페이지를 생성하므로
getStaticPaths
와 getStaticProps
를 사용하여 그 데이터를 취득합니다.["pages/[id].tsx"]
export const getStaticPaths: GetStaticPaths = async () => {
const products: Product[] = await client.product.fetchAll();
const paths = products.map((product) => ({
params: { id: product.id.toString() },
}))
return { paths, fallback: false }
}
export const getStaticProps: GetStaticProps<DetailProps> = async ({ params }) => {
try {
const id = params?.id;
if(!id) {
return { props: { errors: "not found" } };
}
const productRes = await client.product.fetch(id as string);
const product = JSON.parse(JSON.stringify(productRes));
return { props: { product: product } }
} catch (err) {
return { props: { errors: "unexpected error" } };
}
}
마지막으로, 톱 페이지로부터 링크를 작성하면 완성입니다.
["pages/index.tsx"]
const IndexPage: React.FC<IndexProps> = ({ products }) => {
console.log(products);
return (
<Layout title="Top">
<h1>Hello Next.js 👋</h1>
<ul>
{
products.map((product) =>
<li key={product.id}>
+ <Link href="/[id]" as={`/${product.id}`}>
+ <a>
{product.title}
<img src={product.images[0].src} height={80}/>
+ </a>
+ </Link>
</li>)
}
</ul>
</Layout>
);
}
링크를 눌러 상품 상세 화면에 가면 아래와 같은 화면이 표시되고 있다고 생각합니다.
http://localhost:3000/[商品ID]
구매 버튼 설치
그리고는 구입에의 도선을 준비해 주면 완료입니다.
이번은 최소한의 코드로 시험하고 싶기 때문에, 장바구니 페이지는 준비하지 않고, 상품 상세 화면에 직접 구입 버튼을 두고 싶습니다.
["pages/[id].tsx"]
const DetailPage = (props: DetailProps) => {
const {product, errors} = props;
+ const [checkoutLink, setCheckoutLink] = useState("");
if (errors) { return <p>Error: {props.errors}</p> }
if (!product) { return <p>Error: Product not found</p> }
+
+ useEffect(() => {
+ client.checkout.create().then((checkout: any) => {
+ const variantsId = product.variants[0].id;
+ client.checkout.addLineItems(checkout.id, [{ variantId: variantsId, quantity: 1}])
+ .then((checkout) => {
+ console.log(checkout.lineItems);
+ setCheckoutLink(checkout.webUrl);
+ });
+ });
+ }, []);
return (
<Layout title={product.title}>
<div>
<p>{product.title}</p>
<img src={product.images[0].src} height={200}/>
</div>
+ <Link href={checkoutLink}>
+ <button>購入する</button>
+ </Link>
</Layout>
)
}
처리로서는
useEffect
중에서 구입 처리의 단위가 되는 checkout
를 작성해, 현재의 상품 상세 화면에서 표시하고 있는 상품을 1
개 추가하고 있습니다.이
checkout
를 장바구니처럼 사용할 수 있지만 처리를 단순화하기 위해 이러한 간단한 구현으로 하고 있습니다.checkout
에는 webUrl
라는 속성이 있습니다.이것은 Shopify의 사이트로 이동해 결산을 할 수 있는 페이지의 URL이 되고 있으므로, 이번은 이것을 이용합니다.
그리고, 주의점으로서
addLineItems
로 지정하는 상품의 ID는 product.id
는 아니고, product.variants[x].id
가 됩니다.Shopify의 상품 데이터는, 사이즈나 색등을 다른 바리에이션으로서 가질 수 있어 그 ID가 됩니다.
이번에는 특히 바리에이션은 신경쓰지 않고, 최초의 바리에이션(
product.variants[0].id
)을 선택하고 있습니다.이제 '구매' 버튼이 추가되었는지 궁금합니다.
이 버튼을 누르면 Shopify 사이트로 이동하여
https://nexjs-example.myshopify.com/52339802311/checkouts/[checkoutID]
이런 구매 페이지가 표시된다고 생각합니다.
요약
이상으로 Next.js와 Shopify에서 가장 빠른 EC 사이트를 만드는 내용으로하고 싶습니다!
처음으로 Shopify라는 EC 서비스를 사용해보고 고전하는 경우도 많았지만 어떻게든 구입할 수있는 곳까지 만들 수 있었다고 생각합니다.
Shopify는 셀프 호스팅만으로 EC 사이트를 구축할 수 있습니다만, 이번과 같이 편리한 API를 준비해 주고 있으므로, 독자적으로 JAMStack 구성이나 마이크로 서비스 구성 등에도 편입하기 쉬워지고 있다고 생각합니다.
이번은 Storefront API (by js-by-sdk)를 사용했습니다만, 그 밖에도
Shopify Buy Botton
를 사용하는 방법이나, Admin API등도 있기 때문에 할 수 있는 것은 아직 여러가지 있을 것 같습니다.계속 Shopify에 대해 공부하고 싶습니다.
이번 소스 코드는 여기에 있습니다.
GitHub : htps : // 기주 b. 코 m / 노부 x42 / 네 xt 쇼피 fy 에어 mp ぇ
Reference
이 문제에 관하여(Next.js와 Shopify에서 가장 빠른 EC 사이트 만들기 ②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nobux42/items/fd662e5442127f6eaeb4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)