الفرق بين المراجعتين لصفحة: «Next.js/dynamic import»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الإدراج الديناميكي في Next.js}}</noinclude> | |||
تدعم Next.js | تدعم Next.js الإدراج الكسول أو المتأني للمكتبات الخارجية عبر <code>import()</code> وللمكونات [[React]] عبر <code>next/dynamic</code> إذ يساعد التحميل المؤجل أو المتأني على تحسين أداء التطبيق عند تحميله أول مرة وذلك بتقليل شيفرة JavaScript الضروري لعرض الصفحات، أما المكتبات أو المكونات المؤجلة، فستُحمل وتضاف في حزمة [[JavaScript]] المُجمعة عند الحاجة إليها فقط. | ||
المكون <code>next/dynamic</code> هو توسيع للمكون [[React/code splitting#.D8.A7.D9.84.D8.AF.D8.A7.D9.84.D8.A9 React.lazy|<code>React.lazy</code>]] والمكون <code>[[React/react api#.D8.A7.D9.84.D8.AA.D8.B9.D9.84.D9.8A.D9.82 .28Suspense.29|Suspense]]</code>، وتستطيع المكونات تأخير عملية الترطيب حتى ينتهي التعليق <code>Suspense</code>. | |||
</ | |||
== | == مثال == | ||
في المثال التالي، استخدام next/dynamic يمنع من إضافة مكون الرأس header في حزمة JavaScript الأولية المجمعة للصفحة، وستعرض الصفحة التعليق Suspense أولًا ثم ستعرض المكون Header عندما يُحمل ويصبح جاهزًا.<syntaxhighlight lang="javascript"> | |||
import dynamic from 'next/dynamic' | import dynamic from 'next/dynamic' | ||
const | const DynamicHeader = dynamic(() => import('../components/header'), { | ||
loading: () => 'Loading...', | |||
}) | |||
function Home() { | export default function Home() { | ||
return | return <DynamicHeader /> | ||
} | } | ||
</syntaxhighlight><blockquote>'''ملاحظة''': يجب أن يُكتب المسار <code>import('path/to/component')</code> إلى الوحدة البرمجية صراحة، ولا يجوز أن يكون قالب نصي أو متغير. كما ينبغي أن تكون الدالة <code>()import</code> ضمن الاستدعاء <code>()dynamic</code> كي تتمكن من مطابقة معرّفات وحدات أو تجمّعات webpack إلى الاستدعاء <code>()dynamic</code> وإعادة تحميلها قبل التصيير. فمن غير الممكن استخدام <code>()dynamic</code> داخل شيفرة تصيير React، بل ينبغي أن تُذكر في أعلى مستوى للوحدة للبرمجية حتى يعمل التحميل المسبق preloading، كما هو الحال مع <code>React.lazy</code>.</blockquote> | |||
</syntaxhighlight> | |||
== الاستخدام مع الدوال المُصدَّرة المسماة == | == الاستخدام مع الدوال المُصدَّرة المسماة == | ||
يمكنك | لإدراج مكوّن ديناميكيًا من تصدير مسمى named export، يمكنك إعادته من وعد [[JavaScript/Promise|<code>Promise</code>]] تُعيده الدالة <code>[https://github.com/tc39/proposal-dynamic-import#example ()import]</code> كالتالي:<syntaxhighlight lang="javascript"> | ||
// components/hello.js | |||
export function Hello() { | export function Hello() { | ||
return <p>Hello!</p> | return <p>Hello!</p> | ||
} | } | ||
// pages/index.js | |||
import dynamic from 'next/dynamic' | import dynamic from 'next/dynamic' | ||
سطر 60: | سطر 30: | ||
import('../components/hello').then((mod) => mod.Hello) | import('../components/hello').then((mod) => mod.Hello) | ||
) | ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== الاستخدام | == الاستخدام دون تصيير من جانب الخادم SSR == | ||
لتحميل مكون ديناميكيًا من طرف العميل، تستطيع استخدام الخيار <code>ssr</code> لتعطيل التصير من طرف الخادم، وهذا مفيد في الحالات التي يعتمد فيها مكون أو مكتبة على إحدى واجهات المتصفح browser API مثل <code>window</code>:<syntaxhighlight lang="javascript"> | |||
import dynamic from 'next/dynamic' | import dynamic from 'next/dynamic' | ||
const | const DynamicHeader = dynamic(() => import('../components/header'), { | ||
ssr: false, | |||
}) | |||
</syntaxhighlight> | |||
== الاستخدام مع مكتبات خارجية == | |||
يستخدم المثال التالي المكتبة الخارجية fuse.js للبحث، وستُحمل المكتبة فقط في المتصفح عندما يبدأ المُستخدم الكتابة في حقل البحث:<syntaxhighlight lang="javascript"> | |||
import { useState } from 'react' | |||
} | |||
const names = ['Tim', 'Joe', 'Bel', 'Lee'] | |||
export default function Page() { | |||
const [results, setResults] = useState() | |||
return ( | return ( | ||
<div> | <div> | ||
< | <input | ||
type="text" | |||
< | placeholder="Search" | ||
onChange={async (e) => { | |||
const { value } = e.currentTarget | |||
// Dynamically load fuse.js | |||
const Fuse = (await import('fuse.js')).default | |||
const fuse = new Fuse(names) | |||
setResults(fuse.search(value)) | |||
}} | |||
/> | |||
<pre>Results: {JSON.stringify(results, null, 2)}</pre> | |||
</div> | </div> | ||
) | ) | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == أمثلة == | ||
* [https://github.com/vercel/next.js/tree/canary/examples/with-dynamic-import Dynamic Import] | |||
== المصادر == | == المصادر == | ||
* الصفحة [https://nextjs.org/docs/advanced-features/dynamic-import Dynamic Import] من توثيق Next.js الرسمي. | * الصفحة [https://nextjs.org/docs/advanced-features/dynamic-import Dynamic Import] من توثيق Next.js الرسمي. | ||
[[تصنيف:Next.js|{{SUBPAGENAME}}]] | |||
[[تصنيف:Next.js Advanced Features|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 17:06، 3 يناير 2023
تدعم Next.js الإدراج الكسول أو المتأني للمكتبات الخارجية عبر import()
وللمكونات React عبر next/dynamic
إذ يساعد التحميل المؤجل أو المتأني على تحسين أداء التطبيق عند تحميله أول مرة وذلك بتقليل شيفرة JavaScript الضروري لعرض الصفحات، أما المكتبات أو المكونات المؤجلة، فستُحمل وتضاف في حزمة JavaScript المُجمعة عند الحاجة إليها فقط.
المكون next/dynamic
هو توسيع للمكون React.lazy
والمكون Suspense
، وتستطيع المكونات تأخير عملية الترطيب حتى ينتهي التعليق Suspense
.
مثال
في المثال التالي، استخدام next/dynamic يمنع من إضافة مكون الرأس header في حزمة JavaScript الأولية المجمعة للصفحة، وستعرض الصفحة التعليق Suspense أولًا ثم ستعرض المكون Header عندما يُحمل ويصبح جاهزًا.
import dynamic from 'next/dynamic'
const DynamicHeader = dynamic(() => import('../components/header'), {
loading: () => 'Loading...',
})
export default function Home() {
return <DynamicHeader />
}
ملاحظة: يجب أن يُكتب المسار
import('path/to/component')
إلى الوحدة البرمجية صراحة، ولا يجوز أن يكون قالب نصي أو متغير. كما ينبغي أن تكون الدالة()import
ضمن الاستدعاء()dynamic
كي تتمكن من مطابقة معرّفات وحدات أو تجمّعات webpack إلى الاستدعاء()dynamic
وإعادة تحميلها قبل التصيير. فمن غير الممكن استخدام()dynamic
داخل شيفرة تصيير React، بل ينبغي أن تُذكر في أعلى مستوى للوحدة للبرمجية حتى يعمل التحميل المسبق preloading، كما هو الحال معReact.lazy
.
الاستخدام مع الدوال المُصدَّرة المسماة
لإدراج مكوّن ديناميكيًا من تصدير مسمى named export، يمكنك إعادته من وعد Promise
تُعيده الدالة ()import
كالتالي:
// components/hello.js
export function Hello() {
return <p>Hello!</p>
}
// pages/index.js
import dynamic from 'next/dynamic'
const DynamicComponent = dynamic(() =>
import('../components/hello').then((mod) => mod.Hello)
)
الاستخدام دون تصيير من جانب الخادم SSR
لتحميل مكون ديناميكيًا من طرف العميل، تستطيع استخدام الخيار ssr
لتعطيل التصير من طرف الخادم، وهذا مفيد في الحالات التي يعتمد فيها مكون أو مكتبة على إحدى واجهات المتصفح browser API مثل window
:
import dynamic from 'next/dynamic'
const DynamicHeader = dynamic(() => import('../components/header'), {
ssr: false,
})
الاستخدام مع مكتبات خارجية
يستخدم المثال التالي المكتبة الخارجية fuse.js للبحث، وستُحمل المكتبة فقط في المتصفح عندما يبدأ المُستخدم الكتابة في حقل البحث:
import { useState } from 'react'
const names = ['Tim', 'Joe', 'Bel', 'Lee']
export default function Page() {
const [results, setResults] = useState()
return (
<div>
<input
type="text"
placeholder="Search"
onChange={async (e) => {
const { value } = e.currentTarget
// Dynamically load fuse.js
const Fuse = (await import('fuse.js')).default
const fuse = new Fuse(names)
setResults(fuse.search(value))
}}
/>
<pre>Results: {JSON.stringify(results, null, 2)}</pre>
</div>
)
}
أمثلة
المصادر
- الصفحة Dynamic Import من توثيق Next.js الرسمي.