خادم مخصص
بشكل افتراضي، يتضمن Next.js خادمه الخاص مع next start
. إذا كان لديك خادم خلفي موجود، فلا يزال بإمكانك استخدامه مع Next.js (هذا ليس خادمًا مخصصًا). يسمح لك خادم Next.js المخصص ببدء خادم بنسبة 100% برمجيًا لاستخدام أنماط الخوادم المخصصة. في معظم الأحيان، لن تحتاج إلى هذا - ولكنه متاح للتخصيص الكامل.
من الجيد معرفة:
- قبل اتخاذ قرار استخدام خادم مخصص، يرجى ملاحظة أنه يجب استخدامه فقط عندما لا يتمكن جهاز التوجيه المدمج في Next.js من تلبية متطلبات تطبيقك. سيؤدي الخادم المخصص إلى إزالة تحسينات الأداء المهمة، مثل وظائف الخادم (serverless functions) و**التحسين الثابت التلقائي (Automatic Static Optimization).**
- لا يمكن نشر خادم مخصص على Vercel.
إليك مثالًا على خادم مخصص:
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
// عند استخدام middleware يجب توفير `hostname` و `port` أدناه
const app = next({ dev, hostname, port })
const handle = app.getRequestHandler()
app.prepare().then(() => {
createServer(async (req, res) => {
try {
// تأكد من تمرير `true` كوسيطة ثانية لـ `url.parse`.
// هذا يخبرها بتحليل جزء الاستعلام من 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('حدث خطأ أثناء التعامل مع', req.url, err)
res.statusCode = 500
res.end('خطأ داخلي في الخادم')
}
})
.once('error', (err) => {
console.error(err)
process.exit(1)
})
.listen(port, () => {
console.log(`> جاهز على 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
أعلاه هو دالة تستقبل كائنًا بالخيارات التالية:
الخيار | النوع | الوصف |
---|---|---|
conf | Object | نفس الكائن الذي ستستخدمه في next.config.js. الافتراضي هو {} |
customServer | Boolean | (اختياري) اضبطه على false عندما يتم إنشاء الخادم بواسطة Next.js |
dev | Boolean | (اختياري) ما إذا كان سيتم تشغيل Next.js في وضع التطوير أم لا. الافتراضي هو false |
dir | String | (اختياري) موقع مشروع Next.js. الافتراضي هو '.' |
quiet | Boolean | (اختياري) إخفاء رسائل الخطأ التي تحتوي على معلومات الخادم. الافتراضي هو false |
hostname | String | (اختياري) اسم المضيف الذي يعمل عليه الخادم |
port | Number | (اختياري) المنفذ الذي يعمل عليه الخادم |
httpServer | node:http#Server | (اختياري) خادم HTTP الذي يعمل خلفه Next.js |
يمكن بعد ذلك استخدام app
المُعاد للسماح لـ Next.js بمعالجة الطلبات حسب الحاجة.
تعطيل توجيه نظام الملفات
بشكل افتراضي، سيقدم Next
كل ملف في مجلد pages
تحت مسار مطابق لاسم الملف. إذا كان مشروعك يستخدم خادمًا مخصصًا، فقد يؤدي هذا السلوك إلى تقديم نفس المحتوى من مسارات متعددة، مما قد يسبب مشاكل في تحسين محركات البحث (SEO) وتجربة المستخدم (UX).
لتعطيل هذا السلوك ومنع التوجيه بناءً على الملفات في pages
، افتح next.config.js
وعطل إعداد useFileSystemPublicRoutes
:
module.exports = {
useFileSystemPublicRoutes: false,
}
ملاحظة:
useFileSystemPublicRoutes
يعطل مسارات أسماء الملفات من SSR؛ قد يظل التوجيه من جانب العميل قادرًا على الوصول إلى تلك المسارات. عند استخدام هذا الخيار، يجب أن تحمي ضد التنقل إلى المسارات التي لا تريدها برمجيًا.
قد ترغب أيضًا في تكوين جهاز التوجيه من جانب العميل لمنع إعادة التوجيه من جانب العميل إلى مسارات أسماء الملفات؛ لذلك راجع
router.beforePopState
.