الفرق بين المراجعتين لصفحة: «Next.js/custom server»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:استخدام خادم مخصص في Next.js}}</noinclude> | <noinclude>{{DISPLAYTITLE:استخدام خادم مخصص في Next.js}}</noinclude> | ||
تستخدم Next.js خادمها الافتراضي عند تنفيذ الأمر ، لكن إن كانت لديك واجهة خلفية جاهزة ستتمكن من استخدامها في Next.js. يتيح لك خادم Next.js المخصص أن تشغّل خادمًا بطريقة برمجية تمامًا كي تستخدم أية نماذج من الخوادم المخصصة. قد | تستخدم Next.js خادمها الافتراضي عند تنفيذ الأمر <code>next start</code>، لكن إن كانت لديك واجهة خلفية جاهزة ستتمكن من استخدامها في Next.js. يتيح لك خادم Next.js المخصص أن تشغّل خادمًا بطريقة برمجية تمامًا كي تستخدم أية نماذج من الخوادم المخصصة. قد لا تحتاج إلى ذلك في أغلب الأوقات، لكن الأمر متاح للتخصيص في Next.js. | ||
'''تنويه''': لا يمكن نشر تطبيقات بخوادم مخصصة على [https://vercel.com/solutions/nextjs Vercel]. | |||
'''ملاحظة''': تذكر قبل أن تقرر استخدام خادم مخصص أنها قد تستخدم فقط في الحالات التي لا يلبي فيها الموّجه المتكامل مع Next.js متطلبات تطبيقك، لأنك باستخدام هذه الخوادم ستزيل آليات تحسين أداء مهمة مثل الدوال الوظيفية المستقلة عن الخادم [[Next.js/automatic static optimization|والتحسين الساكن التلقائي]]. | |||
الق نظرة على الخادم المخصص التالي:<syntaxhighlight lang="javascript"> | الق نظرة على الخادم المخصص التالي:<syntaxhighlight lang="javascript"> | ||
سطر 11: | سطر 15: | ||
const hostname = 'localhost' | const hostname = 'localhost' | ||
const port = 3000 | const port = 3000 | ||
//هنا عند استخدامهما `hostname` و `port` يجب الإشارة إلى | //هنا عند استخدامهما `hostname` و `port` يجب الإشارة إلى البرمجيتين الوسطيتين | ||
const app = next({ dev, hostname, port }) | const app = next({ dev, hostname, port }) | ||
const handle = app.getRequestHandler() | const handle = app.getRequestHandler() | ||
سطر 40: | سطر 44: | ||
}) | }) | ||
}) | }) | ||
</syntaxhighlight | </syntaxhighlight>'''تنبيه''': لا يُمرر للملف <code>server.js</code> إلى babel أو webpack، لذا تأكد أن صياغة هذا الملف والمصادر التي يحتاجها متوافقة مع النسخة الحالية التي تشغلها من Node. | ||
لتشغيل الخادم المخصص، عليك تحديث الحقل <code>scripts</code> في الملف <code>package.json</code> كالتالي:<syntaxhighlight lang="json"> | |||
"scripts": { | "scripts": { | ||
"dev": "node server.js", | "dev": "node server.js", | ||
سطر 46: | سطر 52: | ||
"start": "NODE_ENV=production node server.js" | "start": "NODE_ENV=production node server.js" | ||
} | } | ||
</syntaxhighlight>يحتاج الخادم المخصص إلى | </syntaxhighlight>يحتاج الخادم المخصص إلى الحزمة التالية ليصل الخادم مع تطبيق Next.js:<syntaxhighlight lang="javascript"> | ||
const next = require('next') | const next = require('next') | ||
const app = next({}) | const app = next({}) | ||
</syntaxhighlight>تُمثِّل <code>next</code> دالة | </syntaxhighlight>تُمثِّل <code>next</code> دالة تقبل كائنًا بالخيارات التالية: | ||
* <code>dev</code>: يأخذ قيمة منطقية Boolean، ويحدد إن كنت ستشغل في نمط التطوير أو لا، وقيمته الافتراضية <code>false</code>. | * <code>dev</code>: يأخذ قيمة منطقية Boolean، ويحدد إن كنت ستشغل Next.js في نمط التطوير أو لا، وقيمته الافتراضية <code>false</code>. | ||
* <code>dir</code>: يأخذ قيمة نصية string، ويحدد موقع مشروع Next.js، وقيمته الافتراضية <code>'.'</code>. | * <code>dir</code>: يأخذ قيمة نصية string، ويحدد موقع مشروع Next.js، وقيمته الافتراضية <code>'.'</code>. | ||
* <code>quiet</code>: يأخذ قيمة منطقية Boolean، يخفي رسائل الخطأ التي تحوي معلومات عن الخادم، وقيمته الافتراضية <code>false</code>. | * <code>quiet</code>: يأخذ قيمة منطقية Boolean، يخفي رسائل الخطأ التي تحوي معلومات عن الخادم، وقيمته الافتراضية <code>false</code>. | ||
* <code>conf</code>: من النوع <code>object</code>، وهو نفسه الكائن الذي قد تستخدمه في <code>next.config.js</code>، وقيمته الافتراضية <code>{}</code>. | * <code>conf</code>: من النوع كائن <code>object</code>، وهو نفسه الكائن الذي قد تستخدمه في <code>next.config.js</code>، وقيمته الافتراضية <code>{}</code>. | ||
يمكن استخدام المكوّن المُعاد كي يتيح معالجة الطلبات كما هو مطلوب من خلال Next.js. | يمكن استخدام المكوّن المُعاد كي يتيح معالجة الطلبات كما هو مطلوب من خلال Next.js. | ||
== تعطيل | == تعطيل التوجيه القائم على نظام الملفات == | ||
تُخدّم <code>Next</code> افتراضيًا كل ملف موجود في المجلد <code>pages</code> تحت اسم مسار يطابق اسم الملف. لكن إن استخدم تطبيقك خادمًا مخصصًا، فقد ينتج عن ذلك | تُخدّم <code>Next</code> افتراضيًا كل ملف موجود في المجلد <code>pages</code> تحت اسم مسار يطابق اسم الملف. لكن إن استخدم تطبيقك خادمًا مخصصًا، فقد ينتج عن ذلك تخديم نفس المحتوى وفق مسارت عدة، ويسبب مشاكل في تحسين محركات البحث SEO ومشاكل في تجربة المستخدم UX. | ||
لإيقاف هذا السلوك ومنع | لإيقاف هذا السلوك ومنع التوجيه اعتمادًا على ملفات المجلد <code>pages</code>، افتح الملف <code>next.config.js</code> وعطّل الإعداد <code>useFileSystemPublicRoutes</code>.<syntaxhighlight lang="javascript"> | ||
module.exports = { | module.exports = { | ||
useFileSystemPublicRoutes: false, | useFileSystemPublicRoutes: false, | ||
} | } | ||
</syntaxhighlight>'''ملاحظة''': يعطّل الخيار <code>useFileSystemPublicRoutes</code> التوجه بناء على اسم الملف من | </syntaxhighlight>'''ملاحظة''': يعطّل الخيار <code>useFileSystemPublicRoutes</code> التوجه بناء على اسم الملف من طرف الخادم SSR، وقد يبقى نظام التوجيه هذا متاحًا من طرف العميل. فعند استخدام هذا الخيار، لا بد من الانتباه عند الانتقال برمجيًا إلى وجهات لا تريدها. | ||
'''ملاحظة''': قد ترغب في إعداد موّجهٍ من جانب العميل client-side router يمنع إعادة التوجيه إلى وجهات تعتمد على اسم الملف، لهذا راجع [[Next.js/next router#.D8.A7.D9.84.D8.AA.D8.A7.D8.A8.D8.B9 router.beforePopState|توثيق الواجهة البرمجية للموّجه في Next.js]]. | |||
== أمثلة == | |||
* [https://github.com/vercel/next.js/tree/canary/examples/custom-server Custom Server] | |||
* [https://github.com/vercel/next.js/tree/canary/examples/ssr-caching SSR Caching] | |||
== المصادر == | == المصادر == | ||
* الصفحة [https://nextjs.org/docs/advanced-features/custom-server Custom Server] من توثيق Next.js الرسمي. | * الصفحة [https://nextjs.org/docs/advanced-features/custom-server Custom Server] من توثيق Next.js الرسمي. | ||
[[تصنيف:Next.js|{{SUBPAGENAME}}]] | |||
[[تصنيف:Next.js Advanced Features|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 17:09، 3 يناير 2023
تستخدم Next.js خادمها الافتراضي عند تنفيذ الأمر next start
، لكن إن كانت لديك واجهة خلفية جاهزة ستتمكن من استخدامها في Next.js. يتيح لك خادم Next.js المخصص أن تشغّل خادمًا بطريقة برمجية تمامًا كي تستخدم أية نماذج من الخوادم المخصصة. قد لا تحتاج إلى ذلك في أغلب الأوقات، لكن الأمر متاح للتخصيص في Next.js.
تنويه: لا يمكن نشر تطبيقات بخوادم مخصصة على Vercel.
ملاحظة: تذكر قبل أن تقرر استخدام خادم مخصص أنها قد تستخدم فقط في الحالات التي لا يلبي فيها الموّجه المتكامل مع Next.js متطلبات تطبيقك، لأنك باستخدام هذه الخوادم ستزيل آليات تحسين أداء مهمة مثل الدوال الوظيفية المستقلة عن الخادم والتحسين الساكن التلقائي.
الق نظرة على الخادم المخصص التالي:
// server.js
const { createServer } = require('http')
const { parse } = require('url')
const next = require('next')
const dev = process.env.NODE_ENV !== 'production'
const hostname = 'localhost'
const port = 3000
//هنا عند استخدامهما `hostname` و `port` يجب الإشارة إلى البرمجيتين الوسطيتين
const app = next({ dev, hostname, port })
const handle = app.getRequestHandler()
app.prepare().then(() => {
createServer(async (req, res) => {
try {
//`url.parse` كوسيط ثان للتابع `true` تأكد من تمرير القيمة
// URL فهذا ما سيخبره بضرورة تحليل جزء الاستعلام من عنوان
const parsedUrl = parse(req.url, true)
const { pathname, query } = parsedUrl
if (pathname === '/a') {
await app.render(req, res, '/a', query)
} else if (pathname === '/b') {
await app.render(req, res, '/b', query)
} else {
await handle(req, res, parsedUrl)
}
} catch (err) {
console.error('Error occurred handling', req.url, err)
res.statusCode = 500
res.end('internal server error')
}
}).listen(port, (err) => {
if (err) throw err
console.log(`> Ready on http://${hostname}:${port}`)
})
})
تنبيه: لا يُمرر للملف server.js
إلى babel أو webpack، لذا تأكد أن صياغة هذا الملف والمصادر التي يحتاجها متوافقة مع النسخة الحالية التي تشغلها من Node.
لتشغيل الخادم المخصص، عليك تحديث الحقل scripts
في الملف package.json
كالتالي:
"scripts": {
"dev": "node server.js",
"build": "next build",
"start": "NODE_ENV=production node server.js"
}
يحتاج الخادم المخصص إلى الحزمة التالية ليصل الخادم مع تطبيق Next.js:
const next = require('next')
const app = next({})
تُمثِّل next
دالة تقبل كائنًا بالخيارات التالية:
dev
: يأخذ قيمة منطقية Boolean، ويحدد إن كنت ستشغل Next.js في نمط التطوير أو لا، وقيمته الافتراضيةfalse
.dir
: يأخذ قيمة نصية string، ويحدد موقع مشروع Next.js، وقيمته الافتراضية'.'
.quiet
: يأخذ قيمة منطقية Boolean، يخفي رسائل الخطأ التي تحوي معلومات عن الخادم، وقيمته الافتراضيةfalse
.conf
: من النوع كائنobject
، وهو نفسه الكائن الذي قد تستخدمه فيnext.config.js
، وقيمته الافتراضية{}
.
يمكن استخدام المكوّن المُعاد كي يتيح معالجة الطلبات كما هو مطلوب من خلال Next.js.
تعطيل التوجيه القائم على نظام الملفات
تُخدّم Next
افتراضيًا كل ملف موجود في المجلد pages
تحت اسم مسار يطابق اسم الملف. لكن إن استخدم تطبيقك خادمًا مخصصًا، فقد ينتج عن ذلك تخديم نفس المحتوى وفق مسارت عدة، ويسبب مشاكل في تحسين محركات البحث SEO ومشاكل في تجربة المستخدم UX.
لإيقاف هذا السلوك ومنع التوجيه اعتمادًا على ملفات المجلد pages
، افتح الملف next.config.js
وعطّل الإعداد useFileSystemPublicRoutes
.
module.exports = {
useFileSystemPublicRoutes: false,
}
ملاحظة: يعطّل الخيار useFileSystemPublicRoutes
التوجه بناء على اسم الملف من طرف الخادم SSR، وقد يبقى نظام التوجيه هذا متاحًا من طرف العميل. فعند استخدام هذا الخيار، لا بد من الانتباه عند الانتقال برمجيًا إلى وجهات لا تريدها.
ملاحظة: قد ترغب في إعداد موّجهٍ من جانب العميل client-side router يمنع إعادة التوجيه إلى وجهات تعتمد على اسم الملف، لهذا راجع توثيق الواجهة البرمجية للموّجه في Next.js.
أمثلة
المصادر
- الصفحة Custom Server من توثيق Next.js الرسمي.