output
أثناء عملية البناء، سيتتبع Next.js تلقائيًا كل صفحة والتبعيات الخاصة بها لتحديد جميع الملفات المطلوبة لنشر نسخة إنتاجية من تطبيقك.
تساعد هذه الميزة في تقليل حجم عمليات النشر بشكل كبير. في السابق، عند النشر باستخدام Docker، كان يتعين عليك تثبيت جميع الملفات من dependencies
الحزمة لتشغيل next start
. بدءًا من Next.js 12، يمكنك الاستفادة من تتبع ملفات الإخراج في دليل .next/
لتضمين الملفات الضرورية فقط.
علاوة على ذلك، يزيل هذا الحاجة إلى الهدف المهمل serverless
الذي يمكن أن يسبب مشاكل متنوعة ويخلق أيضًا تكرارًا غير ضروري.
كيفية العمل
أثناء next build
، سيستخدم Next.js @vercel/nft
لتحليل import
و require
و fs
بشكل ثابت لتحديد جميع الملفات التي قد تحملها الصفحة.
يتم أيضًا تتبع خادم الإنتاج الخاص بـ Next.js لملفاته المطلوبة وإخراجها في .next/next-server.js.nft.json
والتي يمكن الاستفادة منها في الإنتاج.
للاستفادة من ملفات .nft.json
المنبعثة إلى دليل الإخراج .next
، يمكنك قراءة قائمة الملفات في كل تتبع التي تكون مرتبطة بملف .nft.json
ثم نسخها إلى موقع النشر الخاص بك.
النسخ التلقائي للملفات المتتبعة
يمكن لـ Next.js إنشاء مجلد standalone
تلقائيًا الذي ينسخ فقط الملفات الضرورية لنشر الإنتاج بما في ذلك ملفات مختارة في node_modules
.
للاستفادة من هذا النسخ التلقائي، يمكنك تمكينه في next.config.js
:
module.exports = {
output: 'standalone',
}
سيؤدي هذا إلى إنشاء مجلد في .next/standalone
والذي يمكن نشره بمفرده دون تثبيت node_modules
.
بالإضافة إلى ذلك، يتم إخراج ملف server.js
بسيط أيضًا والذي يمكن استخدامه بدلاً من next start
. لا ينسخ هذا الخادم البسيط مجلدات public
أو .next/static
افتراضيًا حيث يُفضل التعامل معها عبر CDN، على الرغم من أنه يمكن نسخ هذه المجلدات يدويًا إلى standalone/public
و standalone/.next/static
، وبعد ذلك سيقدم ملف server.js
هذه الملفات تلقائيًا.
لنسخ هذه يدويًا، يمكنك استخدام أداة سطر الأوامر cp
بعد next build
:
cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/
لبدء تشغيل ملف server.js
البسيط محليًا، قم بتنفيذ الأمر التالي:
node .next/standalone/server.js
معلومة مفيدة:
- يتم قراءة
next.config.js
أثناءnext build
وتسلسلها في ملف الإخراجserver.js
. إذا كانت خياراتserverRuntimeConfig
أوpublicRuntimeConfig
القديمة مستخدمة، فإن القيم ستكون محددة بالقيم في وقت البناء.- إذا كان مشروعك بحاجة إلى الاستماع إلى منفذ أو اسم مضيف محدد، يمكنك تعريف متغيرات البيئة
PORT
أوHOSTNAME
قبل تشغيلserver.js
. على سبيل المثال، قم بتشغيلPORT=8080 HOSTNAME=0.0.0.0 node server.js
لبدء الخادم علىhttp://0.0.0.0:8080
.
محاذير
- أثناء التتبع في إعدادات monorepo، يتم استخدام دليل المشروع للتتبع افتراضيًا. بالنسبة إلى
next build packages/web-app
، سيكونpackages/web-app
هو جذر التتبع ولن يتم تضمين أي ملفات خارج هذا المجلد. لتضمين ملفات خارج هذا المجلد، يمكنك تعيينoutputFileTracingRoot
فيnext.config.js
.
module.exports = {
// هذا يتضمن ملفات من قاعدة monorepo على بعد مجلدين للأعلى
outputFileTracingRoot: path.join(__dirname, '../../'),
}
- هناك بعض الحالات التي قد يفشل فيها Next.js في تضمين الملفات المطلوبة، أو قد يتضمن ملفات غير مستخدمة عن طريق الخطأ. في هذه الحالات، يمكنك الاستفادة من
outputFileTracingExcludes
وoutputFileTracingIncludes
على التوالي فيnext.config.js
. يقبل كل تكوين كائنًا مع minimatch globs للمفتاح لمطابقة صفحات محددة ومصفوفة من globs مرتبطة بجذر المشروع لتضمينها أو استبعادها في التتبع.
module.exports = {
outputFileTracingExcludes: {
'/api/hello': ['./un-necessary-folder/**/*'],
},
outputFileTracingIncludes: {
'/api/another': ['./necessary-folder/**/*'],
'/api/login/\\[\\[\\.\\.\\.slug\\]\\]': [
'./node_modules/aws-crt/dist/bin/**/*',
],
},
}
ملاحظة: مفتاح outputFileTracingIncludes
/outputFileTracingExcludes
هو glob، لذا يجب تهريب الأحرف الخاصة.
turbotrace
التجريبي
يمكن أن يكون تتبع التبعيات بطيئًا لأنه يتطلب حسابات وتحليلات معقدة جدًا. لقد أنشأنا turbotrace
بلغة Rust كبديل أسرع وأذكى للتنفيذ بلغة JavaScript.
لتمكينه، يمكنك إضافة التكوين التالي إلى next.config.js
:
module.exports = {
experimental: {
turbotrace: {
// التحكم في مستوى تسجيل turbotrace، الافتراضي هو `error`
logLevel?:
| 'bug'
| 'fatal'
| 'error'
| 'warning'
| 'hint'
| 'note'
| 'suggestions'
| 'info',
// التحكم فيما إذا كان سجل turbotrace يجب أن يحتوي على تفاصيل التحليل، الافتراضي هو `false`
logDetail?: boolean
// عرض جميع رسائل السجل دون حدود
// يعرض turbotrace رسالة سجل واحدة فقط لكل فئة افتراضيًا
logAll?: boolean
// التحكم في دليل السياق لـ turbotrace
// لن يتم تتبع الملفات خارج دليل السياق
// تعيين `outputFileTracingRoot` له نفس التأثير
// إذا تم تعيين كل من `outputFileTracingRoot` وهذا الخيار، سيتم استخدام `experimental.turbotrace.contextDirectory`
contextDirectory?: string
// إذا كان هناك تعبير `process.cwd()` في الكود الخاص بك، يمكنك تعيين هذا الخيار لإخبار `turbotrace` بقيمة `process.cwd()` أثناء التتبع.
// على سبيل المثال، سيتم تتبع require(process.cwd() + '/package.json') كـ require('/path/to/cwd/package.json')
processCwd?: string
// التحكم في الحد الأقصى لاستخدام الذاكرة لـ `turbotrace`، بوحدة `MB`، الافتراضي هو `6000`.
memoryLimit?: number
},
},
}