تتبع ملفات الخرج في Next.js

من موسوعة حسوب

تتتبع Next.js تقائيًا كل صفحة واعتمادياتها أثناء بناء التطبيق لتحديد جميع الملفات المطلوبة لنشر نسخة الإنتاج من التطبيق، تتيح ذلك إمكانية تقليل حجم ملفات النشر. فعندما استخدمت Docker سابقًا لنشر تطبيقك، كنت بحاجة إلى تثبيت جميع ملفات الاعتماديات dependencies التي تشير إليها حزمة التطبيق حتى تستطيع تشغيله next start. لكن بإمكانك ابتداءً من النسخة 12 تتبع ملفات الخرج في المجلد /next. كي يضم فقط الملفات الضرورية. تلغي هذه الميزة أيضًا الحاجة إلى الوجهة serverless الملغاة التي قد تسبب مشاكل عدة، وتنشئ نسخًا إضافيةً غير ضرورية.

كيف تعمل ميزة تتبع ملفات الخرج

تستخدم Next.js التوجيه vercel/nft@ أثناء بناء التطبيق next build لتحلل كل من import و require و fs بشكل ساكن لتحديد جميع الملفات التي قد تحمّلها الصفحة. كما يجري التحقق من الملفات التي يحتاجها خادم إنتاج Next.js ووضعها في ملف الخرج next/next-server.js.nft.json. الذي يمكن رفعه في مرحلة الإنتاج.

ولرفع الملفات ذات الامتداد nft.json. المنتقلة إلى مجلد الخرج next.، بإمكانك قراءة قائمة الملفات التي تنتهي بالامتداد nft.json. في كل ملف تتبع ونسخها إلى مكان نشر التطبيق.

النسخ التلقائي للملفات المُتتبعة (ميزة تجريبية)

يمكن أن تُنشئ Next.js مجلد قائم بذاته standalone ينسخ الملفات الضرورية لنشر نسخة الإنتاج فقط بما في ذلك الملفات الموجودة في المجلد node_modules. ولتشغيل النسخ التلقائي، عليك أولًا تفعيل الميزة outputStandalone في الملف next.config.js:

module.exports = {
  experimental: {
    outputStandalone: true,
  },
}

سينتج عن ذلك المجلد next/standalone الذي يمكن نشره بشكل مستقل دون الحاجة إلى تثبيت.

إضافة إلى ذلك، بإمكانك استخدام ملف JavaScript المصغر server.js الذي ينتج عن العملية بدلًا من next start. لا ينسخ الخادم المصغّر السابق (server.js) المجلدين public أو .next/static افتراضيًا لأن من يتعامل معهما عادة هي شبكة توزيع المحتوى CDN. مع ذلك يمكن نسخ محتوى هذين المجلدين إلى standalone/public و standalone/.next/static يدويًا ليخدّمهما الملف server.js تلقائيًا بعد ذلك.

التحفظات على تتبع ملفات الخرج

  • يُستخدم مجلد المشروع افتراضيًا للتتبع في حال كان مهيّأً ضمن مستودع وحيد monorepo. أما عند تنفيذ الأمر next build packages/web-app، سيكون المجلد packages/web-app هو الجذر الذي يستخدم للتتبع ولن تتضمن عملية التتبع أي ملف خارج هذا المجلد. ولإضافة الملفات التي تقع خارجه، لا بد من ضبط قيمة experimental.outputFileTracingRoot في ملف التهيئة next.config.js:
// packages/web-app/next.config.js
module.exports = {
  experimental: {
    // سيضيف ذلك ملفات من قاعدة المستودع الوحيد وصولًا إلى مجلدين أعلى
    outputFileTracingRoot: path.join(__dirname, '../../'),
  },
}
  • قد تخفق Next.js أحيانًا في تضمين بعض الملفات المطلوبة أو قد تضم ملفات غير مستخدمة. بإمكانك في هذه الحالات تصدير خاصيتي تهيئة الصفحة unstable_includeFiles و unstable_excludeFiles بالترتيب. إذ تقبل كل خاصية مصفوفة من تعابير المطابقة minimatch globs المرتبطة بجذر المشروع لتضمين أو إزالة الملفات أثناء التتبع.
  • لا تقدّم Next.js أي شيء حاليًا للملفات nft.json.، وينبغي أن تُقرأ من قبل المنصة التي ستنشر عليها التطبيق (مثل Vercel) كي يجري نشره بأصغر حزمة ممكنة. لكن قد يظهر أمر جديد في النسخات المستقبلة لاستغلال ملفات nft.json..