نحوه ساختن یک وبلاگ Nextjs با Hygraph و استقرار در Vercel در سال 2023.

معرفی
به عنوان بخشی از چالش 100 روزه کد نویسی امسال، تصمیم گرفتم یک وبلاگ Next.js با Hygraph که پشتیبان من را تقویت می کند بسازم و همچنین روند را در این مقاله مستند کنم.
در این نوشته، من به شما یاد می دهم که چگونه در دو مرحله ساده یک وبلاگ کاملا واکنش گرا بسازید.
در اینجا یک پیش نمایش از وبلاگی است که می سازید.
توصیه شده: این آموزش نیاز دارد Node v16 یا بالاتر و هیگراف.
Next.js چیست؟
Next.js یک چارچوب واکنش برای ساخت برنامه های وب است. Next.js دارای ویژگیهایی مانند رندر سمت سرور، تولید سایت استاتیک و بازسازی استاتیک افزایشی است که کارهای زیادی را از توسعهدهنده انتزاع میکند تا بتوانید روی رابط کاربری تمرکز کنید.
GraphQL چیست؟
Graphql اساساً یک زبان پرس و جو برای انجام عملیات CRUD به یک API است.
Hygraph چیست؟
Hygraph یک cms بدون هد است که می تواند پشتیبان برنامه های وب شما را تقویت کند. بر خلاف سایر cms های بدون هد، Hygraph از graphql برای انجام عملیات CRUD استفاده می کند که ساده است و به شما امکان می دهد داده های خاصی را از یک API واحد درخواست کنید.
Vercel چیست؟
Vercel اساساً بستری برای میزبانی برنامه تک صفحه ای شما است.
بدون هیچ مقدمه ای بیایید درست شیرجه بزنیم.
مرحله 1: راه اندازی GRAPHCMS BackEND.
در مرورگر خود به https://hygraph.com/ بروید و اگر قبلاً ندارید یک حساب کاربری ایجاد کنید.
اکنون، کلیک کنید اضافه کردن پروژه برای ایجاد یک پروژه جدید به پروژه یک نام، توضیح بدهید و منطقه ای را که می خواهید محتوای خود را از آن ارائه کنید انتخاب کنید.
توصیه شده: نزدیک ترین منطقه به مخاطبان هدف خود را انتخاب کنید.
– اضافه کردن طرح محتوا
اکنون، بیایید دو مدل را به طرح خود اضافه کنیم، یکی برای پست های وبلاگ و دیگری برای اطلاعات نویسنده.
مدل ها در Hygraph ساختاری را برای اضافه کردن داده ها تعریف می کنند. فیلدهای یک مدل را می توان از آن اضافه کرد فیلد اضافه کنید بخش در سمت راست
از داشبورد Hygraph خود، روی Schema و سپس روی آن کلیک کنید + Add
. حالا، ورودی “نویسنده” به عنوان نام نمایشی آن و کلیک کنید اضافه کردن مدل.
برای مدل نویسنده، دو فیلد نام نویسنده و فیلد توضیحات نویسنده اضافه کنید.
نام نویسنده: افزودن الف فیلد تک خطی از نوار کناری سمت راست و آن را به عنوان مورد نیاز در زبانه Advanced تنظیم کنید.
توضیحات نویسنده: افزودن الف فیلد چند خطی از نوار کناری سمت راست و آن را به عنوان مورد نیاز در زبانه Advanced تنظیم کنید.
هورای! شما اولین مدل خود را ایجاد کرده اید.
حالا بیایید مدل Blogpost را اضافه کنیم، این مدل شامل یک فیلد عنوان، یک فیلد Excerpt، یک فیلد Slug، یک قسمت دارایی برای تصویر ویژه پست، یک فیلد قالب متن غنی برای محتوای پست و یک فیلد مرجع برای پیوند دادن مدل نویسنده به آن است. مدل پست.
عنوان: اضافه کردن یک فیلد تک خطی، در صورت نیاز تنظیم کنید.
گزیده: الف اضافه کنید فیلد چند خطی، در صورت نیاز تنظیم کنید.
Slug: یک فیلد Slug اضافه کنید. برای قسمت Slug، باید بررسی کنید تولید مثل حلزون حرکتی از الگو زیر گزینه های اسلاگ و وارد شوید {title}
در قسمت الگوی اسلاگ این اجازه می دهد تا اسلاگ با استفاده از فیلد عنوان به طور خودکار تولید شود.
در برگه اعتبارسنجی، بررسی کنید فیلد را مورد نیاز قرار دهید، فیلد را منحصر به فرد تنظیم کنید، مطابقت با الگوی خاص، و مورد غیر حساس.
تصویر ویژه: اضافه کردن یک قسمت انتخابگر دارایی، از coverPhoto به عنوان نام نمایشی استفاده کنید و آن را در صورت نیاز تنظیم کنید.
محتوا: یک فیلد متن غنی از نوار کناری سمت راست اضافه کنید و موارد مورد نیاز را تنظیم کنید.
مرجع نویسنده: یک فیلد مرجع به مدل BlogPost اضافه کنید.
در تب Define رابطه، Allow only one model to be reference را انتخاب کنید، مرجع دوطرفه، و اجازه چندین بلاگ پست به ازای هر نویسنده را بدهید.
اکنون به پیکربندی مرجع ادامه دهید و نام نمایشی Author را به آن بدهید.
در زیر برگه فیلد معکوس، نام نمایشی Blogposts را به آن بدهید.
خوب، این تمام چیزی است که ما برای مدل پست نیاز داریم.
بیایید یک چیز دیگر به آن اضافه کنیم زمینه دارایی، رفتن به دارایی در سمت چپ و یک فیلد تک خطی برای ویژگی alt تصویر اضافه کنید.
با خیال راحت فیلدهای دیگر را به مدل ها اضافه کنید. با این حال، برای این آموزش، این تنظیمات باید درست باشد.
توصیه شده: قبل از ادامه با بقیه مقاله، مدل پست خود را پر کنید.
مرحله 2: ساختن جبهه
– راه اندازی Next.js
اکنون، بیایید در توسعه وبلاگ خود با Next.js اقدام کنیم.
برای شروع یک برنامه Next.js، اجرا کنید npx create-next-app@latest
در ترمینال شما
دستور create-next-app به طور خودکار یک دایرکتوری ایجاد می کند و همه چیز را برای شما تنظیم می کند.
توجه: آخرین نسخه های create-next-app از شما می پرسد که آیا مایل به استفاده از آن هستید یا خیر /src
یا تجربی /app
دایرکتوری، برای این آموزش انتخاب کنید /src
فهرست راهنما.
بعد از اینکه Next.js با موفقیت نصب شد، اجرا کنید cd project_name
در ترمینال، و اجرا کنید code .
برای باز کردن کدهای تصویری
قبل از شروع سرور توسعه خود را اجرا کنید npm install next-mdx-remote graphql-request graphql
برای نصب چند وابستگی که نیاز داریم و سپس npm dev را اجرا کنیم تا سرور توسعه را در پورت 3000 راه اندازی کنیم.
برنامه شما باید اجرا شود http://localhost:3000.
قبل از حرکت، دایرکتوری /src خود را به شکل زیر ساختار دهید.
|--/src
| |--/Components
| | |--Layout.js
| |--/pages
| | |--/api
| | |--_app.js
| | |--_document.js
| | |--index.js
| | |--[slug].js
| |--/styles
| | |--global.css
| | |--Home.module.css
| | |--Layout.module.css
| | |--SinglePost.module.css
را /جزء دایرکتوری شامل اجزایی است که پروژه شما مجدداً از آنها استفاده خواهد کرد. به عنوان مثال مولفه layout.
را /صفحات دایرکتوری حاوی فایل هایی است که مسیرهای برنامه ما را مشخص می کند.
را /سبک ها دایرکتوری حاوی فایل های CSS برای استایل دادن به اجزای ما است.
– ساخت اجزای مشترک
1. ایجاد کامپوننت Layout.js.
در پوشه کامپوننت، یک فایل Layout.js حاوی کد زیر ایجاد کنید:
import Link from "next/link";
import styles from "../styles/Layout.module.css";
function Layout({ children }) {
return (
<>
<nav className={styles.nav}>
<div>
<Link href="https://dev.to/">
<h1>NextBlog 0.1</h1>
</Link>
</div>
</nav>
{children}
</>
);
}
export default Layout;
بلوک کد تابعی را صادر می کند که می پذیرد '{children}'
props را بهعنوان آرگومان برمیگرداند و یک لوگوی متنی ساده را برمیگرداند و وسایل کودکان در یک قطعه پیچیده شدهاند.
2. اضافه کردن مقداری CSS.
توجه: در این آموزش، ما به سبک استایل نمی پردازیم، بنابراین من چند فایل CSS ایجاد کردم که در مقطعی به کد اضافه می کنیم.
یک فایل Layout.module.css حاوی کد زیر در پوشه /styles ایجاد کنید.
.nav {
overflow: hidden;
padding: 0 50px;
}
.nav div {
max-width: 80%;
margin: auto;
border-bottom: 2px solid #3f3f3f67;
}
.nav h1 {
color: #202020;
text-align: center;
padding: 20px 26px;
text-decoration: none;
font-size: 3rem;
}
/* CSS for tablets and small laptops */
@media (min-width: 701px) and (max-width: 1120px) {
.nav {
overflow: hidden;
padding: 0 50px;
}
.nav div {
max-width: 95%;
margin: auto;
border-bottom: 2px solid #3f3f3f67;
}
.nav h1 {
color: #202020;
text-align: center;
padding: 20px 26px;
text-decoration: none;
font-size: 2.5rem;
}
}
/* CSS for mobiles */
@media (max-width: 700px) {
.nav {
overflow: hidden;
padding: 0 50px;
}
.nav div {
max-width: 95%;
margin: auto;
border-bottom: 2px solid #3f3f3f67;
}
.nav h1 {
color: #202020;
text-align: center;
padding: 20px 26px;
text-decoration: none;
font-size: 1.9rem;
}
}
همچنین باید فایل global.css پیش فرض را با کد زیر لغو کنید.
:root {
--max-width: 1100px;
--border-radius: 12px;
--font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono",
"Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro",
"Fira Mono", "Droid Sans Mono", "Courier New", monospace;
--foreground-rgb: 0, 0, 0;
--background-start-rgb: 214, 219, 220;
--background-end-rgb: 255, 255, 255;
--primary-glow: conic-gradient(
from 180deg at 50% 50%,
#16abff33 0deg,
#0885ff33 55deg,
#54d6ff33 120deg,
#0071ff33 160deg,
transparent 360deg
);
--secondary-glow: radial-gradient(
rgba(255, 255, 255, 1),
rgba(255, 255, 255, 0)
);
--tile-start-rgb: 239, 245, 249;
--tile-end-rgb: 228, 232, 233;
--tile-border: conic-gradient(
#00000080,
#00000040,
#00000030,
#00000020,
#00000010,
#00000010,
#00000080
);
--callout-rgb: 238, 240, 241;
--callout-border-rgb: 172, 175, 176;
--card-rgb: 180, 185, 188;
--card-border-rgb: 131, 134, 135;
}
@media (prefers-color-scheme: dark) {
:root {
--foreground-rgb: 255, 255, 255;
--background-start-rgb: 0, 0, 0;
--background-end-rgb: 0, 0, 0;
--primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
--secondary-glow: linear-gradient(
to bottom right,
rgba(1, 65, 255, 0),
rgba(1, 65, 255, 0),
rgba(1, 65, 255, 0.3)
);
--tile-start-rgb: 2, 13, 46;
--tile-end-rgb: 2, 5, 19;
--tile-border: conic-gradient(
#ffffff80,
#ffffff40,
#ffffff30,
#ffffff20,
#ffffff10,
#ffffff10,
#ffffff80
);
--callout-rgb: 20, 20, 20;
--callout-border-rgb: 108, 108, 108;
--card-rgb: 100, 100, 100;
--card-border-rgb: 200, 200, 200;
}
}
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
html,
body {
max-width: 100vw;
overflow-x: hidden;
}
a {
color: inherit;
text-decoration: none;
}
@media (prefers-color-scheme: dark) {
html {
color-scheme: dark;
}
}
3. جهانی کردن جزء مشترک ما.
در pages/_app.js، محتوا را با کد زیر جایگزین کنید:
import '@/styles/globals.css'
import Layout from '../Components/Layout'
export default function App({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
)
}
بلوک کد مولفه طرحبندی را که ایجاد کردهاید وارد میکند و آن را در اطراف ” میپیچد. _app.js به عنوان نقطه ورود برای همه مسیرها در فهرست صفحات عمل می کند.
– واکشی داده ها از Hygraph.
1. صفحه فهرست
می بینید که پوشه pages حاوی یک فایل index.js است. بیایید با افزودن یک فایل index.js جدید حاوی کد زیر، آن را لغو کنیم.
import Head from "next/head";
import Style from "../styles/Home.module.css";
import Image from "next/image";
import { GraphQLClient, gql } from "graphql-request";
import Link from "next/link";
const url =
"https://api-us-east-1-shared-usea1-02.hygraph.com/v2/cld3i52fm0lpi01up5mpk5v3i/master";
const graphConnect = new GraphQLClient(url);
const query = gql`
query {
blogposts {
title
slug
coverPhoto {
url
}
excerpt
id
author {
authorName
}
}
}
`;
export async function getServerSideProps() {
const { blogposts } = await graphConnect.request(query);
return { props: { blogposts } };
}
function Homepage({ blogposts }) {
return (
<>
<Head>
<title>Blog Tutorial</title>
</Head>
<div className={Style.postcontainer}>
{blogposts.map((blogposts) => {
return (
<div key={blogposts.id}>
<div className={Style.inside}>
<div className={Style.img}>
<Image
src={blogposts.coverPhoto.url}
alt="featured text"
fill
/>
</div>
<div className={Style.container}>
<Link href={blogposts.slug}>
<h2>{blogposts.title}</h2>
</Link>
<p>{blogposts.excerpt}</p>
<p>By {blogposts.author.authorName}</p>
<Link href={blogposts.slug}>
<button className={Style.readButton}>Read More</button>{" "}
</Link>
</div>
</div>
</div>
);
})}
;
</div>
</>
);
}
export default Homepage;
برای دریافت نقطه پایانی API خود، به پروژه Hygraph خود بروید، به تنظیمات پروژه > دسترسی به API بروید، نقطه پایانی API را در زیر Content API کپی کنید و آن را به متغیر URL اختصاص دهید.
اکنون به پایین اسکرول کنید و به API محتوای عمومی بروید و آن را تغییر دهید read all...
تحت مجوزهای محتوا
به متغیر پرس و جو const یک رشته پرس و جو graphql اختصاص داده می شود که برای پرس و جو داده ها از Hygraph استفاده می شود.
را **new GraphQLClient()**
متد یک GraphQLClient جدید را نمونهسازی میکند و نقطه پایانی API ما را به عنوان آرگومان میگیرد و یک ارتباط با پروژه ما در Hygraph ایجاد میکند.
همچنین می توانید متوجه شوید که بلوک کد شامل دو تابع است getServerSideProps
تابع و تابع Home.
را async
getServerSideProps
تابع بر اساس هر درخواست اجرا میشود و به ما اجازه میدهد برای دادهها یک درخواست برای هیگراف ارائه دهیم، سپس آرایهای از دادهها (بلاگ پستها) را به عنوان props برمیگرداند که به عنوان آرگومان به تابع Home ارسال میشود.
تابع Home پشتیبانی از getServerSideProps
عملکرد به عنوان یک آرگومان، از طریق آرایه تکرار می شود و داده ها را به UI برمی گرداند.
2. صفحه SinglePost.
اکنون، بیایید یک صفحه واحد برای هر یک از پست های وبلاگ خود ایجاد کنیم.
ایجاد یک فایل جدید ‘[slug].js حاوی کد زیر است.
import { GraphQLClient, gql } from "graphql-request";
import Head from "next/head";
import Style from "../styles/SinglePost.module.css";
import Image from "next/image";
import { serialize } from "next-mdx-remote/serialize";
import { MDXRemote } from "next-mdx-remote";
const url =
"https://api-us-east-1-shared-usea1-02.hygraph.com/v2/cld3i52fm0lpi01up5mpk5v3i/master";
const graphConnect = new GraphQLClient(url);
const query = gql`
query MyQuery($slug: String!) {
blogpost(where: { slug: $slug }) {
title
author {
authorName
}
content {
markdown
}
coverPhoto {
alt
url
}
}
}
`;
export async function getStaticPaths() {
const { blogposts } = await graphConnect.request(gql`
query {
blogposts {
slug
}
}
`);
return {
paths: blogposts.map(({ slug }) => ({
params: {
slug,
},
})),
fallback: "blocking",
};
}
export async function getStaticProps({ params }) {
const { blogpost } = await graphConnect.request(query, { slug: params.slug });
const content = blogpost.content.markdown;
const MdxSource = await serialize(content);
return { props: { post: blogpost, source: MdxSource } };
}
function SinglePost({ post, source }) {
return (
<>
<Head>
<title>Blog</title>
</Head>
<div className={Style.main}>
<div className={Style.header}>
<h1>{post.title}</h1>
<h3>Author: {post.author.authorName}</h3>
</div>
<div className={Style.img}>
<Image src={post.coverPhoto.url} alt={post.coverPhoto.alt} fill />
</div>
<div className={Style.mdxs}>
<MDXRemote {...source} />
</div>
</div>
</>
);
}
export default SinglePost;
بلوک کد بالا دارای سه عملکرد است، getStaticPath
، getStaticProps,
و یک جزء تابع.
getStaticPaths
تابع یک پرس و جو به API ما می کند و مسیرها (slug) را به عنوان props به getStaticProps برمی گرداند.
را getStaticProps
تابع پروپ های برگردانده شده توسط getStaticPaths
و از آن به عنوان یک متغیر برای پرس و جو برای پستی استفاده می کند که با اسلاگ مطابقت دارد.
همچنین از کنترل از راه دور next-mdx برای سریال کردن محتوای علامتگذاری شده در قالبی قابل خواندن استفاده میکند. و پست و محتوای سریال شده را برای رندر به مولفه تابع برمی گرداند.
**
4. اضافه کردن پشتیبانی برای تصاویر خارجی.
برای اینکه بتوانیم از تصاویر خارجی Hygraph خود استفاده کنیم، باید کمی تنظیمات را به فایل next.config اضافه کنیم.
بیایید فایل next.config را با این کد لغو کنیم.
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'media.graphassets.com',
port: '',
pathname: '/**',
},
],
},
}
module.exports = nextConfig
اضافه کردن مقداری CSS
حالا بیایید کامپوننت خود را استایل کنیم. سه فایل ماژول CSS با کدهای زیر ایجاد کنید.
یک Home.module.css ایجاد کنید تا حاوی این کد باشد.
.postcontainer {
max-width: 800px;
margin: auto;
margin-top: 30px;
margin-bottom: 30px;
padding: 0 5px;
}
.inside {
margin-bottom: 30px;
padding: 10px 20px;
box-shadow: 2px 3px 2px rgb(218, 218, 218);
display: flex;
flex-direction: row;
}
.inside div:last-child {
margin-left: 25px;
}
.inside h2 {
text-align: justify;
margin-bottom: 15px;
font-size: 1.5rem;
font-weight: 600;
}
.inside p {
margin-bottom: 15px;
font-size: 0.9rem;
}
.readButton {
padding: 10px 16px;
background-color: aliceblue;
font-weight: 500;
cursor: pointer;
}
.img {
width: 260px;
height: 200px;
position: relative;
}
.container {
width: 555px;
}
/* Tablet and Smaller Desktop */
@media (min-width: 701px) and (max-width: 1120px) {
.postcontainer {
max-width: 80%;
margin: auto;
margin-top: 30px;
margin-bottom: 30px;
}
.inside {
margin-bottom: 30px;
padding: 10px 20px;
box-shadow: 2px 3px 2px rgb(218, 218, 218);
display: flex;
flex-direction: row;
}
.postcontainer h2 {
text-align: justify;
margin-bottom: 10px;
font-size: 1.9rem;
font-weight: 600;
}
.inside p {
margin-bottom: 10px;
font-size: 0.9rem;
}
.readButton {
padding: 10px 16px;
background-color: aliceblue;
font-weight: 500;
}
.img {
width: 250px;
height: 200px;
position: relative;
}
.container {
width: 65%;
}
}
/* Mobile */
@media (max-width: 700px) {
.postcontainer {
max-width: 90%;
margin: auto;
margin-top: 30px;
margin-bottom: 30px;
}
.inside {
margin-bottom: 30px;
padding: 10px 20px;
box-shadow: 2px 3px 2px rgb(218, 218, 218);
display: flex;
flex-direction: column;
}
.inside div:last-child {
margin-left: 0;
}
.postcontainer h2 {
text-align: justify;
margin-bottom: 10px;
font-size: 1.5rem;
font-weight: 600;
}
.inside p {
margin-bottom: 10px;
font-size: 0.9rem;
}
.readButton {
padding: 10px 16px;
background-color: aliceblue;
font-weight: 500;
cursor: pointer;
}
.img {
width: 100%;
height: 200px;
position: relative;
}
.container {
width: 100%;
}
}
اکنون یک SinglePost.module.css ایجاد کنید تا حاوی این کد باشد.
.main {
max-width: 700px;
margin: auto;
}
.header {
margin-top: 40px;
}
.header h1,
.header h3 {
margin-top: 10px;
}
.header h1 {
font-size: 2rem;
}
.header h3 {
color: #777777;
}
.img {
margin-top: 20px;
width: 100%;
height: 500px;
position: relative;
}
.mdxs {
padding: 60px 0;
font-size: 1.4rem;
line-height: 1.5;
}
/* CSS for tablets and small laptops */
@media (min-width: 701px) and (max-width: 1120px) {
.main {
max-width: 90%;
margin: auto;
}
.header {
margin-top: 40px;
}
.header h1,
.header h3 {
margin-top: 10px;
}
.header h1 {
font-size: 2rem;
}
.header h3 {
color: #777777;
}
.img {
margin-top: 20px;
width: 100%;
height: 470px;
position: relative;
}
.mdxs {
padding: 60px 0;
font-size: 1.4rem;
line-height: 1.5;
}
}
/* CSS for mobiles */
@media (max-width: 700px) {
.main {
max-width: 85%;
margin: auto;
}
.header {
margin-top: 40px;
}
.header h1,
.header h3 {
margin-top: 10px;
}
.header h1 {
font-size: 2rem;
}
.header h3 {
color: #777777;
}
.img {
margin-top: 20px;
width: 100%;
height: 280px;
position: relative;
}
.mdxs {
padding: 60px 0;
font-size: 1.4rem;
line-height: 1.5;
}
}
خودشه! اجزای شما استایل داده شده است.
استقرار پروژه
1. میزبانی در GitHub
اگر تا اینجا پیش رفته اید، فرض می کنم هیچ خطایی وجود ندارد، اما اجازه دهید قبل از استقرار آن در Vercel، بررسی های بیشتری انجام دهیم.
- اول، اجرا کنید
npm run lint
در ترمینال دایرکتوری پروژه شما
کد eslint را برای بررسی خطاهای احتمالی جاوا اسکریپت اجرا می کند.
اگر خطایی پیدا نشد، پیام «No Eslint warnings or error» را در ترمینال خود دریافت خواهید کرد.
- اجرا کن
git init
تا محیط محلی خود را به یک مخزن تبدیل کنیم. - اکنون، به اکانت GitHub خود وارد شوید و یک مخزن جدید بسازید.
- به ترمینال خود برگردید، بیایید مخزن محلی را به GitHub متصل کنیم، اجرا کنیم
git remote add origin <url to your GitHub repository>
. - شعبه خود را با اجرا تغییر دهید تا با شاخه در GitHub مطابقت داشته باشد
git branch -M main
- اجرا کن
git add -all
، فایل های خود را مرحله بندی کنید. - اجرا کن
git commit -m "<message>"
تا فایل های خود را commit کنید. - در نهایت، اجرا کنید
git push -u origin main
برای فشار دادن به GitHub.
2. استقرار در Vercel.
اگر قبلاً با آنها حساب ندارید ابتدا در https://vercel.com/signup ثبت نام کنید.
توصیه می شود: با حساب GitHub خود ثبت نام کنید.
- وارد شوید و یک پروژه جدید ایجاد کنید.
- مخزن پروژه خود را در Vercel وارد کنید.
- پس از وارد کردن موفقیت آمیز، روی deploy کلیک کنید تا پروژه شما با تنظیمات پیش فرض Vercel اجرا شود.
- هنگامی که استقرار موفقیت آمیز باشد، آدرس های اینترنتی استقرار را دریافت می کنید که می توانید آنها را مشاهده کرده و با دوستان خود به اشتراک بگذارید.
بسته بندی.
شما این آموزش را با موفقیت به پایان رساندید و اولین برنامه تک صفحه ای خود را به کار گرفتید. امیدوارم از سفر لذت برده باشید.
PS: با خیال راحت با کد بازی کنید و آن را اجرا کنید. اگر میخواهید کارتان را با من به اشتراک بگذارید، در توییتر به اشتراک بگذارید و مرا FineyKempt@ تگ کنید.
کد منبع را در GitHub پیدا کنید
*منبع: *
برای کسب اطلاعات بیشتر در مورد graphql، به https://graphql.org/ سر بزنید.
درباره Hygraph بیشتر بدانید.
همچنین می توانید اطلاعات بیشتری درباره Next.js در اینجا بیابید.