Next.js
คอมโพเนนต์ Wink เป็น custom elements ที่ทำงานเฉพาะบนเบราว์เซอร์ — สคริปต์ CDN ต้องโหลดฝั่งไคลเอนต์ รูปแบบด้านล่างครอบคลุมทั้ง App Router (Next.js 13+) และ Pages Router แบบเก่า
@wink/elements npm package ติดตั้งและโหลด CDN bundle พร้อมกับ TypeScript types.
ติดตั้ง
หัวข้อที่มีชื่อว่า “ติดตั้ง”npm install @wink/elementsApp Router (Next.js 13+)
หัวข้อที่มีชื่อว่า “App Router (Next.js 13+)”สร้าง client component ที่เรียกใช้ load() ครั้งเดียวและเรนเดอร์ภายใน root layout ของคุณ:
'use client';import { useEffect } from 'react';import { load } from '@wink/elements';
export function WinkLoader() { useEffect(() => { load({ clientId: process.env.NEXT_PUBLIC_WINK_CLIENT_ID! }); }, []); return null;}import { WinkLoader } from '@/components/WinkLoader';
export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <body> <WinkLoader /> {children} </body> </html> );}ใช้คอมโพเนนต์ Wink ใน Client Component ใดก็ได้:
'use client';
export default function HotelsPage() { return ( <main> <wink-content-loader layout="HOTEL" id="YOUR_LAYOUT_ID" /> </main> );}Pages Router
หัวข้อที่มีชื่อว่า “Pages Router”โหลดครั้งเดียวใน _app.tsx:
import type { AppProps } from 'next/app';import { useEffect } from 'react';import { load } from '@wink/elements';
export default function App({ Component, pageProps }: AppProps) { useEffect(() => { load({ clientId: process.env.NEXT_PUBLIC_WINK_CLIENT_ID! }); }, []); return <Component {...pageProps} />;}จากนั้นใช้คอมโพเนนต์ Wink ในหน้าใดก็ได้:
export default function HotelsPage() { return <wink-content-loader layout="HOTEL" id="YOUR_LAYOUT_ID" />;}ตัวแปรสภาพแวดล้อม
หัวข้อที่มีชื่อว่า “ตัวแปรสภาพแวดล้อม”เพิ่มใน .env.local:
NEXT_PUBLIC_WINK_CLIENT_ID=your-client-idคำนำหน้า NEXT_PUBLIC_ จำเป็นเพื่อเปิดเผยตัวแปรให้กับ bundle ฝั่งเบราว์เซอร์
TypeScript types
หัวข้อที่มีชื่อว่า “TypeScript types”เพิ่มไฟล์ประกาศเพื่อให้ TypeScript รู้จักชื่อ custom element ใน JSX — ดูที่ React integration page สำหรับโค้ดตัวอย่างเต็มของ wink-elements.d.ts