الفرق بين المراجعتين لصفحة: «Next.js/output file tracing»
أنشأ الصفحة ب' == تتبع ملفات الخرج في Next.js == تتتبع Next.js تقائيًا كل صفحة واعتمادياتها أثناء بناء التطبيق لتحدي...' |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:تتبع ملفات الخرج في Next.js}}</noinclude> | |||
تتتبع Next.js تقائيًا كل صفحة واعتمادياتها أثناء بناء التطبيق لتحديد جميع الملفات المطلوبة لنشر نسخة الإنتاج من التطبيق، ويتيح ذلك إمكانية تقليل حجم ملفات النشر. فعندما استخدمت Docker سابقًا لنشر تطبيقك، كنت بحاجة إلى تثبيت جميع ملفات الاعتماديات <code>dependencies</code> التي تشير إليها حزمة التطبيق حتى تستطيع تشغيله <code>next start</code>. لكن بإمكانك ابتداءً من النسخة 12 تتبع ملفات الخرج في المجلد <code>/next.</code> كي يضم فقط الملفات الضرورية. | |||
تلغي هذه الميزة أيضًا الحاجة إلى الوجهة <code>serverless</code> الملغاة التي قد تسبب مشاكل عدة، وتنشئ نسخًا إضافيةً غير ضرورية. | |||
== كيف تعمل ميزة تتبع ملفات الخرج == | == كيف تعمل ميزة تتبع ملفات الخرج == | ||
تستخدم Next.js التوجيه <code>[https://github.com/vercel/nft vercel/nft@]</code> أثناء بناء التطبيق <code>next build</code> لتحلل كل من <code>import</code> و <code>require</code> و <code>fs</code> بشكل ساكن لتحديد جميع الملفات التي قد تحمّلها الصفحة.كما يجري التحقق من الملفات التي يحتاجها خادم إنتاج Next.js ووضعها في ملف الخرج <code>next/next-server.js.nft.json.</code> الذي يمكن رفعه في مرحلة الإنتاج. | تستخدم Next.js التوجيه <code>[https://github.com/vercel/nft vercel/nft@]</code> أثناء بناء التطبيق <code>next build</code> لتحلل كل من <code>import</code> و <code>require</code> و <code>fs</code> بشكل ساكن لتحديد جميع الملفات التي قد تحمّلها الصفحة. كما يجري التحقق من الملفات التي يحتاجها خادم إنتاج Next.js ووضعها في ملف الخرج <code>next/next-server.js.nft.json.</code> الذي يمكن رفعه في مرحلة الإنتاج. | ||
ولرفع الملفات ذات الامتداد <code>nft.json.</code> المنتقلة إلى مجلد الخرج <code>next.</code>، بإمكانك قراءة قائمة الملفات التي تنتهي بالامتداد <code>nft.json.</code> في كل ملف تتبع ونسخها إلى مكان نشر التطبيق. | ولرفع الملفات ذات الامتداد <code>nft.json.</code> المنتقلة إلى مجلد الخرج <code>next.</code>، بإمكانك قراءة قائمة الملفات التي تنتهي بالامتداد <code>nft.json.</code> في كل ملف تتبع ونسخها إلى مكان نشر التطبيق. | ||
== النسخ التلقائي للملفات المُتتبعة | == النسخ التلقائي للملفات المُتتبعة == | ||
يمكن أن تُنشئ Next.js | يمكن أن تُنشئ Next.js مجلدًا قائمًا بذاته <code>standalone</code> ينسخ الملفات الضرورية لنشر نسخة الإنتاج فقط بما في ذلك الملفات الموجودة في المجلد <code>node_modules</code>. ولتشغيل النسخ التلقائي، عليك أولًا تفعيل الميزة <code>outputStandalone</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript"> | ||
module.exports = { | module.exports = { | ||
output: 'standalone', | |||
} | } | ||
</syntaxhighlight>سينتج عن ذلك المجلد <code>next/standalone</code> الذي يمكن نشره بشكل مستقل دون الحاجة إلى تثبيت . | </syntaxhighlight>سينتج عن ذلك المجلد <code>next/standalone.</code> الذي يمكن نشره بشكل مستقل دون الحاجة إلى تثبيت وحدات <code>node_modules</code>. | ||
إضافة إلى ذلك، بإمكانك استخدام ملف JavaScript المصغر <code>server.js</code> الذي ينتج عن العملية بدلًا من <code>next start</code>. لا ينسخ الخادم المصغّر السابق <code>server.js</code> المجلدين <code>public</code> أو <code>next/static.</code> افتراضيًا لأن من يتعامل معهما عادة هي شبكة توزيع المحتوى CDN. مع ذلك يمكن نسخ محتوى هذين المجلدين إلى <code>standalone/public</code> و <code>standalone/.next/static</code> يدويًا ليخدّمهما الملف <code>server.js</code> تلقائيًا بعد ذلك. | |||
'''ملاحظة''': يُقرأ الملف <code>next.config.js</code> أثناء عمليةي البناء <code>next build</code> ويحوَّل إلى ملف الخرج <code>server.js</code>، إن كان أحد [[Next.js/next.config.js#.D8.A5.D8.B9.D8.AF.D8.A7.D8.AF .D9.85.D8.B1.D8.AD.D9.84.D8.A9 .D8.A7.D9.84.D8.AA.D8.B4.D8.BA.D9.8A.D9.84|الخيارين القديمين <code>serverRuntimeConfig</code> أو <code>publicRuntimeConfig</code>]] مستخدمين، فستُحدَّد القيم إلى القيم المولدة وقت البناء. | |||
== | إن كان مشروعك يستخدم ميزة [[Next.js/image optimization|تحسين الصور]] مع المُحمِّل الافتراضي <code>loader</code>، فيجب تنزيل الاعتمادية <code>sharp</code>: <syntaxhighlight lang="javascript"> | ||
npm i sharp | |||
// or | |||
yarn add sharp | |||
// or | |||
pnpm add sharp | |||
</syntaxhighlight> | |||
== محاذير == | |||
* يُستخدم مجلد المشروع افتراضيًا للتتبع في حال كان مهيّأً ضمن مستودع وحيد monorepo. أما عند تنفيذ الأمر <code>next build packages/web-app</code>، سيكون المجلد <code>packages/web-app</code> هو الجذر الذي يستخدم للتتبع ولن تتضمن عملية التتبع أي ملف خارج هذا المجلد. ولإضافة الملفات التي تقع خارجه، لا بد من ضبط قيمة <code>experimental.outputFileTracingRoot</code> في ملف التهيئة <code>next.config.js</code>: | * يُستخدم مجلد المشروع افتراضيًا للتتبع في حال كان مهيّأً ضمن مستودع وحيد monorepo. أما عند تنفيذ الأمر <code>next build packages/web-app</code>، سيكون المجلد <code>packages/web-app</code> هو الجذر الذي يستخدم للتتبع ولن تتضمن عملية التتبع أي ملف خارج هذا المجلد. ولإضافة الملفات التي تقع خارجه، لا بد من ضبط قيمة <code>experimental.outputFileTracingRoot</code> في ملف التهيئة <code>next.config.js</code>: | ||
سطر 32: | سطر 41: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* قد تخفق Next.js أحيانًا في تضمين بعض الملفات المطلوبة أو قد تضم ملفات غير مستخدمة. بإمكانك في هذه الحالات تصدير خاصيتي تهيئة الصفحة <code>unstable_includeFiles</code> و <code>unstable_excludeFiles</code> بالترتيب. إذ تقبل كل خاصية مصفوفة من تعابير المطابقة minimatch globs المرتبطة بجذر المشروع لتضمين أو إزالة الملفات أثناء التتبع. | * قد تخفق Next.js أحيانًا في تضمين بعض الملفات المطلوبة أو قد تضم ملفات غير مستخدمة. بإمكانك في هذه الحالات تصدير خاصيتي تهيئة الصفحة <code>unstable_includeFiles</code> و <code>unstable_excludeFiles</code> بالترتيب. إذ تقبل كل خاصية مصفوفة من تعابير المطابقة [https://www.npmjs.com/package/minimatch minimatch globs] المرتبطة بجذر المشروع لتضمين أو إزالة الملفات أثناء التتبع. | ||
* لا تقدّم Next.js أي شيء حاليًا للملفات <code>nft.json.</code>، وينبغي أن تُقرأ من قبل المنصة التي ستنشر عليها التطبيق (مثل | * لا تقدّم Next.js أي شيء حاليًا للملفات <code>nft.json.</code>، وينبغي أن تُقرأ من قبل المنصة التي ستنشر عليها التطبيق (مثل Vercel) كي يجري نشره بأصغر حزمة ممكنة. لكن قد يظهر أمر جديد في النسخات المستقبلة لاستغلال ملفات <code>nft.json.</code>. | ||
== استخدام الميزة <code>turbotrace</code> التجريبية == | |||
قد تكون عملية تتبع الاعتماديات بطيئة بما أنها تستدعي عمليات معالجة وتحليل معقدة، لذا أنشأنا ميزة <code>turbotrace</code> في لغة رست بديلًا سريعًا وذكيًا للعملية المقابلة المنفذة بجافاسكربت، ولتفعيلها، يمكنك إضافة الضبط التالي في ملف <code>next.config.js</code>:<syntaxhighlight lang="javascript"> | |||
// next.config.js | |||
module.exports = { | |||
experimental: { | |||
turbotrace: { | |||
// control the log level of the turbotrace, default is `error` | |||
logLevel?: | |||
| 'bug' | |||
| 'fatal' | |||
| 'error' | |||
| 'warning' | |||
| 'hint' | |||
| 'note' | |||
| 'suggestions' | |||
| 'info', | |||
// control if the log of turbotrace should contain the details of the analysis, default is `false` | |||
logDetail?: boolean | |||
// show all log messages without limit | |||
// turbotrace only show 1 log message for each categories by default | |||
logAll?: boolean | |||
// control the context directory of the turbotrace | |||
// files outside of the context directory will not be traced | |||
// set the `experimental.outputFileTracingRoot` has the same effect | |||
// if the `experimental.outputFileTracingRoot` and this option are both set, the `experimental.turbotrace.contextDirectory` will be used | |||
contextDirectory?: string | |||
// if there is `process.cwd()` expression in your code, you can set this option to tell `turbotrace` the value of `process.cwd()` while tracing. | |||
// for example the require(process.cwd() + '/package.json') will be traced as require('/path/to/cwd/package.json') | |||
processCwd?: string, | |||
// control the maximum number of files that are passed to the `turbotrace` | |||
// default is 128 | |||
maxFiles?: number; | |||
}, | |||
}, | |||
} | |||
</syntaxhighlight> | |||
== المصادر == | |||
* الصفحة [https://nextjs.org/docs/advanced-features/output-file-tracing Output File Tracing] من توثيق Next.js الرسمي. | |||
[[تصنيف:Next.js|{{SUBPAGENAME}}]] | |||
[[تصنيف:Next.js Advanced Features|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 17:06، 3 يناير 2023
تتتبع 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 = {
output: 'standalone',
}
سينتج عن ذلك المجلد next/standalone.
الذي يمكن نشره بشكل مستقل دون الحاجة إلى تثبيت وحدات node_modules
.
إضافة إلى ذلك، بإمكانك استخدام ملف JavaScript المصغر server.js
الذي ينتج عن العملية بدلًا من next start
. لا ينسخ الخادم المصغّر السابق server.js
المجلدين public
أو next/static.
افتراضيًا لأن من يتعامل معهما عادة هي شبكة توزيع المحتوى CDN. مع ذلك يمكن نسخ محتوى هذين المجلدين إلى standalone/public
و standalone/.next/static
يدويًا ليخدّمهما الملف server.js
تلقائيًا بعد ذلك.
ملاحظة: يُقرأ الملف next.config.js
أثناء عمليةي البناء next build
ويحوَّل إلى ملف الخرج server.js
، إن كان أحد الخيارين القديمين serverRuntimeConfig
أو publicRuntimeConfig
مستخدمين، فستُحدَّد القيم إلى القيم المولدة وقت البناء.
إن كان مشروعك يستخدم ميزة تحسين الصور مع المُحمِّل الافتراضي loader
، فيجب تنزيل الاعتمادية sharp
:
npm i sharp
// or
yarn add sharp
// or
pnpm add sharp
محاذير
- يُستخدم مجلد المشروع افتراضيًا للتتبع في حال كان مهيّأً ضمن مستودع وحيد 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.
.
استخدام الميزة turbotrace
التجريبية
قد تكون عملية تتبع الاعتماديات بطيئة بما أنها تستدعي عمليات معالجة وتحليل معقدة، لذا أنشأنا ميزة turbotrace
في لغة رست بديلًا سريعًا وذكيًا للعملية المقابلة المنفذة بجافاسكربت، ولتفعيلها، يمكنك إضافة الضبط التالي في ملف next.config.js
:
// next.config.js
module.exports = {
experimental: {
turbotrace: {
// control the log level of the turbotrace, default is `error`
logLevel?:
| 'bug'
| 'fatal'
| 'error'
| 'warning'
| 'hint'
| 'note'
| 'suggestions'
| 'info',
// control if the log of turbotrace should contain the details of the analysis, default is `false`
logDetail?: boolean
// show all log messages without limit
// turbotrace only show 1 log message for each categories by default
logAll?: boolean
// control the context directory of the turbotrace
// files outside of the context directory will not be traced
// set the `experimental.outputFileTracingRoot` has the same effect
// if the `experimental.outputFileTracingRoot` and this option are both set, the `experimental.turbotrace.contextDirectory` will be used
contextDirectory?: string
// if there is `process.cwd()` expression in your code, you can set this option to tell `turbotrace` the value of `process.cwd()` while tracing.
// for example the require(process.cwd() + '/package.json') will be traced as require('/path/to/cwd/package.json')
processCwd?: string,
// control the maximum number of files that are passed to the `turbotrace`
// default is 128
maxFiles?: number;
},
},
}
المصادر
- الصفحة Output File Tracing من توثيق Next.js الرسمي.