چگونه یک برنامه وب مدرن “Food Menu” ساختم: از Tech Stack تا Workflow

معرفی
ساخت برنامه های وب موفق و کارآمد به دو چیز نیاز دارد: یک پایه فنی قوی و یک رویکرد محکم برای مدیریت خود کار.
بسیاری از منابع توسعه بر یکی یا دیگری تمرکز دارند. منابع فنی بسیار خوبی وجود دارد که نحوه ساخت با فناوری ها و چارچوب های متفاوت را مستند می کند. همچنین منابع خوبی از بینش برای چگونگی مدیریت گردش کار توسعه در میان سهامداران متعدد وجود دارد.
اما در این مقاله، سعی خواهم کرد هر دو را در یکی ترکیب کنم و نشان دهم که چگونه از برخی فناوریهای عالی نه تنها برای ساختن یک برنامه کامل پشته، بلکه برای مدیریت فرآیند و گردش کار پیش از انتشار نیز استفاده کردم.
فناوری هایی که من استفاده کردم
ما به نحوه کار من با چهار فناوری اصلی خواهیم پرداخت: Node.js، GraphQL، Next.js و Preevy. هر یک از این ابزارها برای جامعه توسعه وب گستردهتر تأثیرگذار بوده است، و به همین دلیل است که فکر کردم این یک پروژه جالب و نمونه پشته فناوری برای به اشتراک گذاشتن با جامعه است.
برای مثال Node.js ابزارهای توسعه باطن مقیاس پذیر و کارآمد را در اختیار توسعه دهندگان قرار می دهد. سپس GraphQL، یک زبان پرس و جو داده های پیشرفته است که نحوه مدیریت و اصلاح داده ها را تغییر می دهد. Next.js یک چارچوب پیچیده React است که به ایجاد رابطهای فرانتاند بسیار کارآمد و دوستدار SEO کمک میکند. در نهایت، Preevy ابزاری برای ارائه سریع و آسان محیط های پیش نمایش پیش از انتشار در ابر شما (آمازون، گوگل یا مایکروسافت) است. محیط های پیش نمایش قابل اشتراک گذاری Preevy راهی مفید برای توسعه دهندگان برای به اشتراک گذاشتن آخرین تغییرات کد خود، دریافت بازخورد و همکاری با سایر ذینفعان قبل از ادغام هر کدی در مرحله بندی یا تولید است و به توسعه دهندگان این امکان را می دهد تا از گردش کار بررسی پیش از انتشار سریعتر لذت ببرند.
خلاصه ما از ساخت یک برنامه فول استک موضوعات زیر را پوشش می دهد:
- ساخت سرور باطن Node.js Express
- ساخت سرور پیشانی Next.js
- اجرای پروژه در داکر
- تهیه یک محیط پیش نمایش قابل اشتراک گذاری با استفاده از Preevy
ساخت اپلیکیشن “منو غذا” به صورت عمومی
من این خلاصه را به سبک یادداشت روزانه “یادگیری در جمع” نوشته ام. امیدواریم این موضوع باعث شود که محتوا برای مخاطبان بسیار جذاب و قابل دسترس باشد.
اپلیکیشنی که خواهیم ساخت برای منوی غذا خواهد بود. اساسا یک Backend Node.js با یک سرور GraphQL وجود خواهد داشت که یک نقطه پایانی برای داده های ما دارد که کدگذاری سختی خواهد داشت. و پیشنمایش Next.js به باطن Node.js متصل میشود تا دادهها را با استفاده از کوئریهای GraphQL بازیابی کند.
پیش نیازها
مطمئن شوید که پیش نیازها را دارید، بیایید شروع کنیم!
ساخت سرور باطن Node.js Express
ما می خواهیم با ایجاد پروژه خود به صورت محلی در رایانه خود شروع کنیم. به یک دایرکتوری بروید و دستورات زیر را برای تنظیم پروژه و ساختار باطن خود اجرا کنید:
mkdir menu-project
cd menu-project
mkdir server
touch docker-compose.yml
cd server
npm init -y
npm i express express-graphql graphql cors
npm i -D dotenv nodemon
mkdir data schema
touch .env Dockerfile index.js
touch data/menu.js schema/schema.js
بعد، پروژه را در یک ویرایشگر کد باز کنید و سپس کدهای بعدی را به فایل های صحیح اضافه کنید.
این کد را وارد کنید data/menu.js
:
const bases = [
{
id: '1',
menuItem: 'Base',
name: 'Egg Noodles',
},
{
id: '2',
menuItem: 'Base',
name: 'Whole-wheat Noodles',
},
{
id: '3',
menuItem: 'Base',
name: 'Rice Noodles',
},
{
id: '4',
menuItem: 'Base',
name: 'Udon Noodles',
},
{
id: '5',
menuItem: 'Base',
name: 'Jasmine Rice',
},
{
id: '6',
menuItem: 'Base',
name: 'Whole-grain Rice',
},
];
const vegetables = [
{
id: '1',
menuItem: 'Vegetables',
name: 'Pak Choi',
},
{
id: '2',
menuItem: 'Vegetables',
name: 'Shiitake Mushrooms',
},
{
id: '3',
menuItem: 'Vegetables',
name: 'Champignon Mushrooms',
},
{
id: '4',
menuItem: 'Vegetables',
name: 'Mixed Peppers',
},
{
id: '5',
menuItem: 'Vegetables',
name: 'Broccoli',
},
{
id: '6',
menuItem: 'Vegetables',
name: 'Spinach',
},
{
id: '7',
menuItem: 'Vegetables',
name: 'Baby Corn',
},
{
id: '8',
menuItem: 'Vegetables',
name: 'Red Onion',
},
{
id: '9',
menuItem: 'Vegetables',
name: 'Bamboo Shoots',
},
];
const meats = [
{
id: '1',
menuItem: 'Meat',
name: 'Chicken',
},
{
id: '2',
menuItem: 'Meat',
name: 'Chicken Katsu',
},
{
id: '3',
menuItem: 'Meat',
name: 'Beef',
},
{
id: '4',
menuItem: 'Meat',
name: 'Pulled Beef',
},
{
id: '5',
menuItem: 'Meat',
name: 'Bacon',
},
{
id: '6',
menuItem: 'Meat',
name: 'Pork',
},
{
id: '7',
menuItem: 'Meat',
name: 'Duck',
},
{
id: '8',
menuItem: 'Meat',
name: 'Prawns',
},
{
id: '9',
menuItem: 'Meat',
name: 'Tofu',
},
];
const sauces = [
{
id: '1',
menuItem: 'Sauce',
name: 'Sweet Teriyaki',
},
{
id: '2',
menuItem: 'Sauce',
name: 'Sweet and Sour',
},
{
id: '3',
menuItem: 'Sauce',
name: 'Garlic and black pepper',
},
{
id: '4',
menuItem: 'Sauce',
name: 'Oyster Sauce',
},
{
id: '5',
menuItem: 'Sauce',
name: 'Hot soybean sauce',
},
{
id: '6',
menuItem: 'Sauce',
name: 'Yellow curry & coconut',
},
{
id: '7',
menuItem: 'Sauce',
name: 'Peanut',
},
{
id: '8',
menuItem: 'Sauce',
name: 'Asian spiced red sauce',
},
];
module.exports = { bases, vegetables, meats, sauces };
این کد وارد خواهد شد schema/schema.js
:
const { bases, vegetables, meats, sauces } = require('../data/menu');
const {
GraphQLObjectType,
GraphQLID,
GraphQLString,
GraphQLList,
GraphQLSchema,
} = require('graphql');
const BaseType = new GraphQLObjectType({
name: 'Base',
fields: () => ({
id: { type: GraphQLID },
menuItem: { type: GraphQLString },
name: { type: GraphQLString },
}),
});
const VegetableType = new GraphQLObjectType({
name: 'Vegetable',
fields: () => ({
id: { type: GraphQLID },
menuItem: { type: GraphQLString },
name: { type: GraphQLString },
}),
});
const MeatType = new GraphQLObjectType({
name: 'Meat',
fields: () => ({
id: { type: GraphQLID },
menuItem: { type: GraphQLString },
name: { type: GraphQLString },
}),
});
const SauceType = new GraphQLObjectType({
name: 'Sauce',
fields: () => ({
id: { type: GraphQLID },
menuItem: { type: GraphQLString },
name: { type: GraphQLString },
}),
});
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
bases: {
type: new GraphQLList(BaseType),
resolve(parent, args) {
return bases;
},
},
base: {
type: BaseType,
args: { id: { type: GraphQLID } },
resolve(parent, args) {
return bases.find((base) => base.id === args.id);
},
},
vegetables: {
type: new GraphQLList(VegetableType),
resolve(parent, args) {
return vegetables;
},
},
vegetable: {
type: VegetableType,
args: { id: { type: GraphQLID } },
resolve(parent, args) {
return vegetables.find((vegetable) => vegetable.id === args.id);
},
},
meats: {
type: new GraphQLList(MeatType),
resolve(parent, args) {
return meats;
},
},
meat: {
type: MeatType,
args: { id: { type: GraphQLID } },
resolve(parent, args) {
return meats.find((meat) => meat.id === args.id);
},
},
sauces: {
type: new GraphQLList(SauceType),
resolve(parent, args) {
return sauces;
},
},
sauce: {
type: SauceType,
args: { id: { type: GraphQLID } },
resolve(parent, args) {
return sauces.find((sauce) => sauce.id === args.id);
},
},
},
});
module.exports = new GraphQLSchema({
query: RootQuery,
});
و در اینجا ما خودمان را داریم .env
فایل:
NODE_ENV = "development"
PORT = 8080
بیایید این کد را در قسمت قرار دهیم Dockerfile
:
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD ["node", "index.js"]
و ما index.js
فایل این کد سرور را دریافت می کند:
const express = require('express');
const cors = require('cors');
require('dotenv').config();
const { graphqlHTTP } = require('express-graphql');
const schema = require('./schema/schema');
const app = express();
app.use(cors());
app.use(
'/graphql',
graphqlHTTP({
schema,
graphiql: process.env.NODE_ENV === 'development',
})
);
const port = process.env.PORT || 8080;
app.listen(port, () =>
console.log(`Server running on port ${port}, http://localhost:${port}`)
);
و در آخر docker-compose.yml
فایل:
version: '3'
services:
server:
container_name: server
build:
context: ./server
dockerfile: Dockerfile
volumes:
- ./server:/app
ports:
- '8080:8080'
environment:
- NODE_ENV=development
client:
container_name: client
build:
context: ./client
dockerfile: Dockerfile
volumes:
- ./client/src:/app/src
- ./client/public:/app/public
restart: always
ports:
- 3000:3000
ما فقط باید این اسکریپت های اجرا را به آن اضافه کنیم package.json
فایل و ما خوب هستیم که برویم:]
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js"
},
اکنون با بخش Backend راه اندازی پروژه ما، فقط به پوشه root سرور بروید و دستور زیر را برای راه اندازی سرور باطن اجرا کنید:
npm run start
کافی است به http://localhost:8080/graphql بروید تا GraphQL API خود را ببینید.
قسمت بعدی قسمت جلویی است، بیایید به آن برسیم.
ساخت سرور پیشانی Next.js
دایرکتوری خود را طوری تغییر دهید که در ریشه باشد menu-project
پوشه و دستورات زیر را اجرا کنید تا پروژه ما برای استفاده از Next.js تنظیم شود.
npx create-next-app client
تنظیماتی را که من از این پیکربندی استفاده کردم در اینجا کامل کنید:
✔ آیا می خواهید از TypeScript با این پروژه استفاده کنید؟ … خیر / آره
✔ آیا می خواهید از ESLint با این پروژه استفاده کنید؟ … خیر / آره
✔ آیا می خواهید از Tailwind CSS با این پروژه استفاده کنید؟ … خیر / آره
✔ دوست دارید استفاده کنید src/
دایرکتوری با این پروژه؟ … نه / آره
✔ از App Router (توصیه می شود) استفاده کنید؟ … نه / آره
✔ آیا می خواهید نام مستعار واردات پیش فرض را سفارشی کنید؟ … خیر / آره
cd
به درون client
پوشه را وارد کرده و این دستور را اجرا کنید تا بسته های مورد نیاز خود را نصب کنید:
npm i @apollo/client graphql
اکنون باید فایل های پروژه ایجاد کنیم، بنابراین بیایید این کد را اجرا کنیم تا آنها را انجام دهیم:
touch Dockerfile
cd src/app
mkdir components queries utils
touch components/Bases.js components/Meats.js components/Sauces.js components/Vegetables.js
touch queries/clientQueries.js
touch utils/withApollo.js
تنها چیزی که باقی می ماند این است که کد را به فایل های خود اضافه کنیم و کارمان تمام است. بنابراین شروع با components/Bases.js
:
'use client';
import { useQuery } from '@apollo/client';
import { GET_BASE } from '../queries/clientQueries';
import withApollo from '../utils/withApollo';
const Bases = () => {
const { loading, error, data } = useQuery(GET_BASE);
if (loading) return <p>Loading bases...</p>;
if (error) return <p>The food failed to load there is a problem</p>;
return (
<div>
{!loading && !error && (
<div className="base-box">
<div>
<div className="cost-container">
<h1>01</h1>
<p>$5.95 only one</p>
</div>
<h2>
Chose <br />
your base
</h2>
{data.bases.map((bases) => (
<div key={bases.id}>
<table>
<tr>
<td>
{bases.id} {bases.name}
</td>
</tr>
</table>
</div>
))}
</div>
</div>
)}
</div>
);
};
export default withApollo(Bases);
بعدی این است components/Meats.js
:
'use client';
import { useQuery } from '@apollo/client';
import { GET_MEAT } from '../queries/clientQueries';
import withApollo from '../utils/withApollo';
const Meats = () => {
const { loading, error, data } = useQuery(GET_MEAT);
if (loading) return <p>Loading meats...</p>;
if (error) return <p>The food failed to load there is a problem</p>;
return (
<div>
{!loading && !error && (
<div className="meat-box">
<div>
<div className="cost-container">
<h1>03</h1>
<p>$1.25 each 2 Max</p>
</div>
<h2>
Choose <br /> your Meats
</h2>
{data.meats.map((meats) => (
<div key={meats.id}>
<table>
<tr>
<td>
{meats.id} {meats.name}
</td>
</tr>
</table>
</div>
))}
</div>
</div>
)}
</div>
);
};
export default withApollo(Meats);
پس از آن این کد را اضافه کنید components/Sauces.js
:
'use client';
import { useQuery } from '@apollo/client';
import { GET_SAUCE } from '../queries/clientQueries';
import withApollo from '../utils/withApollo';
const Sauces = () => {
const { loading, error, data } = useQuery(GET_SAUCE);
if (loading) return <p>Loading sauces...</p>;
if (error) return <p>The food failed to load there is a problem</p>;
return (
<div>
{!loading && !error && (
<div className="sauces-box">
<div>
<div className="cost-container">
<h1>04</h1>
<p>FREE</p>
</div>
<h2>
Choose <br />
your Sauces
</h2>
{data.sauces.map((sauces) => (
<div key={sauces.id}>
<table>
<tr>
<td>
{sauces.id} {sauces.name}
</td>
</tr>
</table>
</div>
))}
</div>
</div>
)}
</div>
);
};
export default withApollo(Sauces);
این کد وارد خواهد شد components/Vegetables.js
:
'use client';
import { useQuery } from '@apollo/client';
import { GET_VEGETABLE } from '../queries/clientQueries';
import withApollo from '../utils/withApollo';
const Vegetables = () => {
const { loading, error, data } = useQuery(GET_VEGETABLE);
if (loading) return <p>Loading vegetables...</p>;
if (error) return <p>The food failed to load there is a problem</p>;
return (
<div>
{!loading && !error && (
<div className="vegetable-box">
<div>
<div className="cost-container">
<h1>02</h1>
<p>$1.25 each 4 Max</p>
</div>
<h2>
Choose <br />
your Vegetables
</h2>
{data.vegetables.map((vegetables) => (
<div key={vegetables.id}>
<table>
<tr>
<td>
{vegetables.id} {vegetables.name}
</td>
</tr>
</table>
</div>
))}
</div>
</div>
)}
</div>
);
};
export default withApollo(Vegetables);
در حال حاضر به queries/clientQueries.js
:
import { gql } from '@apollo/client';
const GET_BASE = gql`
query getBase {
bases {
id
name
menuItem
}
}
`;
const GET_VEGETABLE = gql`
query getVegetable {
vegetables {
id
name
menuItem
}
}
`;
const GET_MEAT = gql`
query getMeat {
meats {
id
name
menuItem
}
}
`;
const GET_SAUCE = gql`
query getSauce {
sauces {
id
name
menuItem
}
}
`;
export { GET_BASE, GET_VEGETABLE, GET_MEAT, GET_SAUCE };
تقریبا انجام شده این کد برای utils/withApollo.js
:
import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';
import { useMemo } from 'react';
export function initializeApollo(initialState = null) {
const _apolloClient = new ApolloClient({
// Local GraphQL Endpoint
uri: 'http://localhost:8080/graphql',
// Add your Preevy GraphQL Endpoint
// uri: 'https://your-backend-server-livecycle.run/graphql',
cache: new InMemoryCache().restore(initialState || {}),
});
return _apolloClient;
}
export function useApollo(initialState) {
const store = useMemo(() => initializeApollo(initialState), [initialState]);
return store;
}
export default function withApollo(PageComponent) {
const WithApollo = ({ apolloClient, apolloState, ...pageProps }) => {
const client = useApollo(apolloState);
return (
<ApolloProvider client={client}>
<PageComponent {...pageProps} />
</ApolloProvider>
);
};
// On the server
if (typeof window === 'undefined') {
WithApollo.getInitialProps = async (ctx) => {
const apolloClient = initializeApollo();
let pageProps = {};
if (PageComponent.getInitialProps) {
pageProps = await PageComponent.getInitialProps(ctx);
}
if (ctx.res && ctx.res.finished) {
// When redirecting, the response is finished.
// No point in continuing to render
return pageProps;
}
const apolloState = apolloClient.cache.extract();
return {
...pageProps,
apolloState,
};
};
}
return WithApollo;
}
بعدی CSS ما در globals.css
بنابراین همه کدها را با این کد جایگزین کنید:
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: 16px;
}
header h1 {
text-align: center;
color: #ffffff;
font-size: 4rem;
text-transform: uppercase;
}
h1 {
color: #1c1917;
}
h2 {
color: #1c1917;
font-size: 1.4rem;
text-transform: uppercase;
border-top: 0.3rem solid black;
border-bottom: 0.3rem solid black;
margin-bottom: 1rem;
padding: 1rem 0 1rem 0;
}
body {
background: #374151;
}
.container {
width: 100%;
max-width: 90rem;
margin: 2rem auto;
display: flex;
flex-flow: row wrap;
justify-content: space-around;
background: #f9fafb;
padding: 2rem;
}
.base-box,
.vegetable-box,
.meat-box,
.sauces-box {
background: #f43f5e;
width: 20rem;
height: auto;
padding: 1rem;
color: #ffffff;
font-weight: bold;
margin-bottom: 2rem;
}
.cost-container {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
}
.cost-container p {
background: #eff6ff;
padding: 0.2rem;
color: #f43f5e;
font-size: 1rem;
}
@media screen and (max-width: 800px) {
.container {
flex-flow: column;
align-items: center;
}
}
فقط یک مورد دیگر برای رفتن بعد از این، بنابراین بعدی است page.js
فایل و مانند قبل همه کدها را با آنچه در اینجا داریم جایگزین کنید:
'use client';
import Bases from './components/Bases';
import Vegetables from './components/Vegetables';
import Meats from './components/Meats';
import Sauces from './components/Sauces';
export default function Home() {
return (
<>
<header>
<h1>Menu</h1>
</header>
<div className="container">
<Bases />
<Vegetables />
<Meats />
<Sauces />
</div>
</>
);
}
در نهایت، بیایید پروژه خود را با قرار دادن این کد در قسمت تکمیل کنیم Dockerfile
در پوشه مشتری:
FROM node:18-alpine
WORKDIR /app
# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \
# Allow install without lockfile, so example works even without Node.js installed locally
else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && yarn install; \
fi
COPY src ./src
COPY public ./public
COPY next.config.js .
# Next.js collects completely anonymous telemetry data about general usage. Learn more here: https://nextjs.org/telemetry
# Uncomment the following line to disable telemetry at run time
# ENV NEXT_TELEMETRY_DISABLED 1
# Note: Don't expose ports here, Compose will handle that for us
# Start Next.js in development mode based on the preferred package manager
CMD \
if [ -f yarn.lock ]; then yarn dev; \
elif [ -f package-lock.json ]; then npm run dev; \
elif [ -f pnpm-lock.yaml ]; then pnpm dev; \
else yarn dev; \
fi
اکنون با قسمت جلویی و باطن راهاندازی پروژه ما، فقط به پوشه ریشه برای آن بروید client
و دستور زیر را برای راه اندازی سرور frontend اجرا کنید:
npm run dev
دوباره بررسی کنید که سرور باطن شما هنوز در حال اجرا است و باید منویی را ببینید که دادهها را از سرور باطن دریافت میکند.
بخش بعدی به ما نشان می دهد که چگونه برنامه را در داخل یک ظرف Docker اجرا کنیم تا ادامه دهیم.
اجرای پروژه در داکر
اجرای برنامه شما در Docker بسیار آسان است. ابتدا مطمئن شوید که Docker روی رایانه شما اجرا می شود و سرورهای دیگر اجرا نمی شوند زیرا از همان پورت ها استفاده می کنند. سپس فقط مطمئن شوید که در داخل پوشه root برای قرار دارید menu-project
و سپس دستور را اجرا کنید docker-compose up
. با این کار سرورهای Backend و Frontend به طور همزمان اجرا می شوند. اکنون فقط به همان URLهای قبلی رسیدم تا سرور و کلاینت همه چیز را ببینند.
سرور در http://localhost:8080 در حال اجرا است
مشتری در http://localhost:3000 در حال اجرا است
در نهایت، زمان آن است که یک محیط پیش نمایش را با استفاده از Preevy اجرا کنید. با انجام این کار می توانیم کار خود را به راحتی با سایر افرادی که روی پروژه کار می کنند به اشتراک بگذاریم. آنها میتوانند آخرین نسخه برنامه را تنها با یک کلیک ببینند، بدون اینکه نیازی به دیدن ظاهر یا رفتار آن در محیط توسعه ما داشته باشند. این قبلاً باعث صرفهجویی در ساعتها در رفت و برگشت من شده است و من بسیار خوشحالم که این ابزار را پیدا کردهام و آن را در گردش کار خود گنجاندهام.
ایجاد یک محیط پیش نمایش ارائه در Preevy
ابتدا اسناد مربوط به Preevy را بخوانید و آن را نصب کنید و سپس آماده اجرای دستورات در اینجا برای ایجاد یک محیط تامین شوید. داخل پوشه ریشه برای menu-project
دستورات زیر را اجرا کنید:
preevy init
preevy up --id 321
شما باید یک را پاس کنید --id
پرچم با یک رشته اعداد من از 321 به عنوان مثال استفاده کردم که باید کار کند. تکمیل راهاندازی ممکن است کمی طول بکشد زیرا باید باطن و قسمت جلویی را در AWS ایجاد کند. وقتی کامل شد، باید دو URL برای سرور و یکی برای مشتری دریافت کنید، مثال را در اینجا ببینید:
server 8080 https://your-url-server.livecycle.run/
client 3000 https://your-url-client.livecycle.run/
با کلیک بر روی پیوندها باید به هر دو سروری که به صورت آنلاین در حال اجرا هستند هدایت شوید. متوجه خواهید شد که صفحه خطاها را نشان می دهد و داده های ما را در پیوند مشتری بارگیری نمی کند. دلیلش این است که هنوز تنظیم شده است http://localhost:8080/graphql
در کد شما را به روز کنید uri
در فایل client/src/app/utils/withApollo.js
به نقطه پایانی GraphQL سرور Preevy خود و سپس دستور را اجرا کنید preevy up --id 321
دوباره برای اعمال آخرین تغییرات.
اکنون صفحه باید داده هایی را از GraphQL API ما نشان دهد.
نتیجه
در نهایت، ترکیبی از ابزارهایی مانند Node.js، GraphQL، Next.js، محیط توسعه آنلاین را با ارائه بهبود عملکرد، انعطافپذیری و رعایت حریم خصوصی دادهها در خط مقدم تغییر میدهد. وقتی این فناوریها با هم ترکیب میشوند، جعبه ابزار قدرتمندی را تشکیل میدهند که توسعهدهندگان را قادر میسازد تا برنامههای مقیاسپذیر، کارآمد و آگاه به حریم خصوصی ایجاد کنند.
و ابزارهایی مانند Preevy تنها تجربه بهتر توسعهدهنده را تسهیل میکنند و به توسعهدهندگان امکان میدهند راههای سریعی را برای استقرار ایمن و به اشتراک گذاشتن کار خود با دیگران فراهم کنند تا بتوانند بازخورد واضح جمعآوری کرده و محصولات با کیفیت بالاتر را منتشر کنند.
امیدواریم متوجه شده باشید که این مقاله یک استراتژی واقع بینانه برای بهره برداری از هم افزایی این فناوری ها ارائه می دهد.
با این حال، از آنجایی که فناوری همیشه در حال پیشرفت است، برای هر توسعه دهنده ای واجب است که دائماً با این ابزارها تحقیق و آزمایش کند. با این دانش، شما به خوبی مجهز خواهید شد تا استعدادهای توسعه وب خود را به سطح بعدی ارتقا دهید، در لبه نوآوری فنی قرار بگیرید و برنامه هایی ایجاد کنید که واقعاً تفاوت ایجاد کنند.