الفرق بين المراجعتين لصفحة: «Next.js/using mdx»

من موسوعة حسوب
لا ملخص تعديل
طلا ملخص تعديل
 
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:استخدام MDX مع Next.js}}</noinclude>
<noinclude>{{DISPLAYTITLE:دعم صيغة MDX في Next.js}}</noinclude>
= استخدام MDX مع Next.js =
تُعد صيغة MDX صيغة موّسعة التي تُشتق منها تنسيقات ماركداون markdown والتي تتيح لك بدورها كتابة شيفرة JSX في ملفات ماركداون markdown. وهي طريقة سريعة لإضافة تفاعلية ديناميكية ومكوّنات مضمّنة ضمن المحتوى الذي تقدّمه مما يجعل صفحاتك أكثر حيوية.
تُعد MXD المجموعة الموّسعة التي تُشتق منها تنسيقات markdown والتي تتيح لك بدورها كتابة شيفرة JSX في ملفات markdown. وهي طريقة سريعة لإضافة تفاعلية ديناميكية ومكوّنات مضمّنة ضمن المحتوى الذي تقدّمه مما يجعل صفحاتك أكثر حيوية.


تدعم Next.js لغة MDX بطرق مختلفة، وسنرشدك في هذه الصفحة إلى بعض طرق تكامل MDX مع تطبيقات Next.js.
تدعم Next.js صيغة MDX بطرق مختلفة، وسنرشدك في هذه الصفحة إلى بعض طرق تكامل MDX مع تطبيقات Next.js.


== لماذا نستخدم MDX؟ ==
== لماذا نستخدم MDX؟ ==
إن كتابة المحتوى بتنسيق markdown هي طريقة حدسية نظرًا لبساطة قواعد التنسيق التي تمكّنك عندما تألفها من كتابة محتوى سهل القراءة و التعديل. ونظرًا لإمكانية استخدام عناصر <code>HTML</code> في ملفات markdown، ستتمكن من تنسيق هذه الملفات بطريقة إبداعية.
إن كتابة المحتوى بتنسيق ماركداون markdown هي طريقة حدسية نظرًا لبساطة قواعد التنسيق التي تمكّنك -عندما تألفها- من كتابة محتوى سهل القراءة والتعديل. ونظرًا لإمكانية استخدام عناصر <code>HTML</code> في ملفات markdown، ستتمكن من تنسيق هذه الملفات بطريقة إبداعية.


وطالما أن محتويات markdown هي محتويات ساكنة، لا يمكنك إنشاء محتوى ديناميكي يعتمد على تفاعل المستخدم. وتظهر روعة MDX في قدرتها على استخدام مكوّنات React مباشرة في توصيفها، وهذا ما يفتح مجالًا واسعًا من الإمكانيات عند تأليف صفحات ويب مع الأخذ بعين الاعتبار تفاعلية هذه الصفحات.
وطالما أن محتويات ماركداون markdown هي محتويات ساكنة، لا يمكنك إنشاء محتوى ديناميكي يعتمد على تفاعل المستخدم. وتظهر روعة MDX في قدرتها على استخدام مكوّنات React مباشرة في توصيفها، وهذا ما يفتح مجالًا واسعًا من الإمكانيات عند تأليف صفحات ويب مع الأخذ بعين الاعتبار تفاعلية هذه الصفحات.


== إضافات MXD ==
== إضافات MXD ==
تستخدم MDX داخليًا كل من remark و rehype. يُعد Remark معالجًا مدعّمًا بمحيط من الإضافات plugins التي تساعدك على تحليل الشيفرة وتحويل عناصر <code>HTML</code> وتغيير الصياغة واستخلاص بيانات Frontmatter وغير ذلك. بينما يُعد Rehype معالج <code>HTML</code> مدعومًا أيضًا بمحيط من الإضافات التي تساعدك على إجراء التعديلات على البيانات و تنظيفها و تصريفها وتهيئتها.  
تستخدم MDX داخليًا كل من remark و rehype. يُعد Remark معالجًا مدعّمًا بمحيط من الإضافات plugins التي تساعدك على تحليل الشيفرة وتحويل عناصر <code>HTML</code> وتغيير الصياغة واستخلاص بيانات Frontmatter وغير ذلك. بينما يُعد Rehype معالج <code>HTML</code> مدعومًا أيضًا بمحيط من الإضافات التي تساعدك على إجراء التعديلات على البيانات وتنظيفها وتصريفها وتهيئتها، ويعد استخدام [https://mdxjs.com/guides/gfm/ remark-gfm] خيارًا شائعًا.  


ولا بد من الإشارة إلى أية إضافة من إضافات remark أو rehype تريد استخدامها في إعدادات الحزمة MDX.
'''ملاحظة''': عليك أن تشير إلى أية إضافة من إضافات remark أو rehype تريد استخدامها وذلك ضمن إعدادات الحزمة MDX.


== استخدام الحزمة <code>next/mdx@</code> ==
== استخدام الحزمة <code>next/mdx@</code> ==
تثهيّأ الحزمة <code>next/mdx@</code> ضمن الملف <code>next.config.js</code> في مشروعك. تأتي بياناتها المصدرية من ملفاتك، وتسمح لك بإنشاء صفحات لها الإمتداد <code>mdx.</code> مباشرة في المجلد <code>pages/</code>.
تُهيّأ الحزمة <code>next/mdx@</code> ضمن الملف <code>next.config.js</code> في مشروعك. تأتي بياناتها المصدرية من ملفاتك، وتسمح لك بإنشاء صفحات لها الإمتداد <code>mdx.</code> مباشرة في المجلد <code>pages/</code>.


=== إعداد الحزمة <code>@next/mdx</code> في Next.js ===
=== إعداد الحزمة <code>next/mdx@</code> في Next.js ===
تشرح لك الخطوات التالية طريقة إعداد <code>@next/mdx</code> في مشروعك:
تشرح لك الخطوات التالية طريقة إعداد <code>next/mdx@</code> في مشروعك:


أولًا: ثبِّت الحزم اللازمة:<syntaxhighlight lang="bash">
أولًا: ثبِّت الحزم اللازمة:<syntaxhighlight lang="bash">
  npm install @next/mdx @mdx-js/loader
  npm install @next/mdx @mdx-js/loader
</syntaxhighlight>ثانيًا: اطلب هذه الحزم و هيئها لدعم صفحات <code>mdx.</code> ذات المستوى الأعلى. تُضيف الشيفرة التالية الكائن المفتاحي <code>options</code> الذي يتيح لك المرور إلي أية إضافات:<syntaxhighlight lang="javascript">
</syntaxhighlight>ثانيًا: اطلب هذه الحزم وهيئها لدعم صفحات <code>mdx.</code> ذات المستوى الأعلى. تُضيف الشيفرة التالية الكائن المفتاحي <code>options</code> الذي يتيح لك المرور إلي أية إضافات:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js


سطر 39: سطر 38:
   pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
   pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
})
})
</syntaxhighlight>ثالثًا: أنشئ صفحة MDX جديدة ضمن المجلد <code>pages/</code>:<syntaxhighlight lang="md">
</syntaxhighlight>ثالثًا: أنشئ صفحة MDX جديدة ضمن المجلد <code>pages/</code>:<syntaxhighlight lang="md">
   - /pages
   - /pages
     - my-mdx-page.mdx
     - my-mdx-page.mdx
سطر 45: سطر 44:
</syntaxhighlight>
</syntaxhighlight>


== استخدام المكوّنات و التخطيطيات و العناصر المخصصة ==
== استخدام المكوّنات والتخطيطيات والعناصر المخصصة ==
بإمكانك الآن إدراج مكوّنات React مباشرة ضمن صفحة MDX:<syntaxhighlight lang="md">
بإمكانك الآن إدراج مكوّنات React مباشرة ضمن صفحة MDX:<syntaxhighlight lang="md">
import { MyComponent } from 'my-components'
import { MyComponent } from 'my-components'
سطر 63: سطر 62:


=== استخلاص بيانات Frontmatter ===
=== استخلاص بيانات Frontmatter ===
يُعد Frontmatter تنسيق بيانات على شكل أزواج مفتاح/قيمة يشبه تنسيق YAML يُستخدم لتخزين بيانات وصفية عن الصفحة. لا يدعم <code>next/mdx@</code> تنسيق frontmatter افتراضيًا لكن هناك حلول عديدة لإضافته إلى محتوى MDX مثل الإضافة [https://github.com/jonschlinkert/gray-matter gray-matter].
يُعد Frontmatter تنسيق بيانات على شكل أزواج مفتاح/قيمة يشبه تنسيق YAML، ويُستخدم لتخزين بيانات وصفية عن الصفحة. لا يدعم <code>next/mdx@</code> تنسيق frontmatter افتراضيًا لكن هناك حلول عديدة لإضافته إلى محتوى MDX مثل الإضافة [https://github.com/jonschlinkert/gray-matter gray-matter].


للوصول إلى البيانات الوصفية للصفحة من خلال <code>next/mdx@</code>، يمكنك تصدير كائن بيانات وصفية ضمن الملف <code>.mdx</code> :<syntaxhighlight lang="md">
للوصول إلى البيانات الوصفية للصفحة من خلال <code>next/mdx@</code>، يمكنك تصدير كائن بيانات وصفية ضمن الملف <code>mdx.</code>:<syntaxhighlight lang="md">
export const meta = {
export const meta = {
author: 'Rich Haines'
author: 'Rich Haines'
سطر 73: سطر 72:
</syntaxhighlight>
</syntaxhighlight>


=== استخدام التخطيطات ===
=== استخدام التخطيطات Layouts ===
إن أردت إضافة تخطيط إلى صفحة MDX، أنشئ مكوّنًا جديدًا وأدرجه ضمن الصفحة، ومن ثم غلّف الصفحة ضمن مكوّن تخطيط :<syntaxhighlight lang="md">
إن أردت إضافة تخطيط إلى صفحة MDX، أنشئ مكوّنًا جديدًا وأدرجه ضمن الصفحة، ومن ثم غلّف الصفحة ضمن مكوّن تخطيط :<syntaxhighlight lang="md">
import { MyComponent, MyLayoutComponent } from 'my-components'
import { MyComponent, MyLayoutComponent } from 'my-components'
سطر 97: سطر 96:


=== العناصر المخصصة ===
=== العناصر المخصصة ===
من الميزات الرائعة لتنسيق markdown هو إمكانية ربط التنسيقات بعناصر <code>HTML</code> المقابلة مما يُسرع الإنجاز:<syntaxhighlight lang="md">
من الميزات الرائعة لتنسيق markdown هو إمكانية ربط التنسيقات بعناصر <code>HTML</code> المقابلة مما يُسرّع الإنجاز:<syntaxhighlight lang="md">
# H1 heading
# H1 heading


سطر 119: سطر 118:
   <li>Three</li>
   <li>Three</li>
</ul>
</ul>
</syntaxhighlight>وإن أردت تنسيق عناصرك الخاصة لإضفاء لمستك على التطبيق، يمكنك تمرير شيفرة مختصرة shortcodes، وهي مكوّناتك الخاصة التي تقترن بعناصر <code>HTML</code>. ولتنفيذ الأمر، استخدم المزوّد <code>MDXProvider</code> لتمرير كائن مكوّنات على شكل خاصية. يرتبط كل كائن من هذه الكائنات باسم عنصر <code>HTML</code>.
</syntaxhighlight>وإن أردت تنسيق عناصرك الخاصة لإضفاء لمستك على التطبيق، يمكنك تمرير شيفرة مختصرة shortcodes، وهي مكوّناتك الخاصة التي تقترن بعناصر <code>HTML</code>. ولتنفيذ الأمر، استخدم المزوّد <code>MDXProvider</code> لتمرير كائن مكوّنات على شكل خاصية. يرتبط كل كائن من هذه الكائنات باسم عنصر <code>HTML</code>. ولكي تفعّل الميزة، لا بد من تحديد الخيار <code>"providerImportSource: "@mdx-js/react</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
 
لكي تفعّل الميزة، لا بد من تحديد الخيار <code>"providerImportSource: "@mdx-js/react</code> في الملف <code>next.config.js</code>:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js


سطر 158: سطر 155:
}
}
</syntaxhighlight>إن أردت توسيع استخدام العنصر ليشمل كامل الموقع، أضف المزوّد إلى الملف <code>app.js_</code> لكي تتعرف كل صفحات MDX على تهيئة العنصر المخصص.
</syntaxhighlight>إن أردت توسيع استخدام العنصر ليشمل كامل الموقع، أضف المزوّد إلى الملف <code>app.js_</code> لكي تتعرف كل صفحات MDX على تهيئة العنصر المخصص.
== استخدام مصرف MDX يعتمد على لغة Rust (تجريبي) ==
تدعم Next.js مصرف MDX جديد مكتوبة بلغة Rust ولكنه قيد التجربة والتطوير حاليًا ولا يُنصح باستعماله في بيئة إنتاجية.
لاستعمال هذا المصرف، تحتاج إلى التصريح عن ذلك في ملف next.config.js بالشكل التالي:<syntaxhighlight lang="javascript">
// next.config.js
module.exports = withMDX({
  experimental: {
    mdxRs: true,
  },
})
</syntaxhighlight>
== روابط مفيدة ==
* [https://mdxjs.com/4 MDX]
* <code>[https://www.npmjs.com/package/@next/mdx next/mdx@]</code>
* [https://github.com/remarkjs/remark remark]
* [https://github.com/rehypejs/rehype rehype]


== المصادر ==
== المصادر ==


* الصفحة [https://nextjs.org/docs/advanced-features/using-mdx Using MDX with Next.js] من توثيق Next.js الرسمي.
* الصفحة [https://nextjs.org/docs/advanced-features/using-mdx Using MDX with Next.js] من توثيق Next.js الرسمي.
[[تصنيف:Next.js|{{SUBPAGENAME}}]]
[[تصنيف:Next.js Advanced Features|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 17:09، 3 يناير 2023

تُعد صيغة MDX صيغة موّسعة التي تُشتق منها تنسيقات ماركداون markdown والتي تتيح لك بدورها كتابة شيفرة JSX في ملفات ماركداون markdown. وهي طريقة سريعة لإضافة تفاعلية ديناميكية ومكوّنات مضمّنة ضمن المحتوى الذي تقدّمه مما يجعل صفحاتك أكثر حيوية.

تدعم Next.js صيغة MDX بطرق مختلفة، وسنرشدك في هذه الصفحة إلى بعض طرق تكامل MDX مع تطبيقات Next.js.

لماذا نستخدم MDX؟

إن كتابة المحتوى بتنسيق ماركداون markdown هي طريقة حدسية نظرًا لبساطة قواعد التنسيق التي تمكّنك -عندما تألفها- من كتابة محتوى سهل القراءة والتعديل. ونظرًا لإمكانية استخدام عناصر HTML في ملفات markdown، ستتمكن من تنسيق هذه الملفات بطريقة إبداعية.

وطالما أن محتويات ماركداون markdown هي محتويات ساكنة، لا يمكنك إنشاء محتوى ديناميكي يعتمد على تفاعل المستخدم. وتظهر روعة MDX في قدرتها على استخدام مكوّنات React مباشرة في توصيفها، وهذا ما يفتح مجالًا واسعًا من الإمكانيات عند تأليف صفحات ويب مع الأخذ بعين الاعتبار تفاعلية هذه الصفحات.

إضافات MXD

تستخدم MDX داخليًا كل من remark و rehype. يُعد Remark معالجًا مدعّمًا بمحيط من الإضافات plugins التي تساعدك على تحليل الشيفرة وتحويل عناصر HTML وتغيير الصياغة واستخلاص بيانات Frontmatter وغير ذلك. بينما يُعد Rehype معالج HTML مدعومًا أيضًا بمحيط من الإضافات التي تساعدك على إجراء التعديلات على البيانات وتنظيفها وتصريفها وتهيئتها، ويعد استخدام remark-gfm خيارًا شائعًا.

ملاحظة: عليك أن تشير إلى أية إضافة من إضافات remark أو rehype تريد استخدامها وذلك ضمن إعدادات الحزمة MDX.

استخدام الحزمة next/mdx@

تُهيّأ الحزمة next/mdx@ ضمن الملف next.config.js في مشروعك. تأتي بياناتها المصدرية من ملفاتك، وتسمح لك بإنشاء صفحات لها الإمتداد mdx. مباشرة في المجلد pages/.

إعداد الحزمة next/mdx@ في Next.js

تشرح لك الخطوات التالية طريقة إعداد next/mdx@ في مشروعك:

أولًا: ثبِّت الحزم اللازمة:

 npm install @next/mdx @mdx-js/loader

ثانيًا: اطلب هذه الحزم وهيئها لدعم صفحات mdx. ذات المستوى الأعلى. تُضيف الشيفرة التالية الكائن المفتاحي options الذي يتيح لك المرور إلي أية إضافات:

// next.config.js

const withMDX = require('@next/mdx')({
  extension: /\.mdx?$/,
  options: {
    remarkPlugins: [],
    rehypePlugins: [],
    //أزل التعليق عن السطر التالي `MDXProvider` إن كنت تستخدم 
    // providerImportSource: "@mdx-js/react",
  },
})
module.exports = withMDX({
  //MXD ربط القيمة الافتراضية بامتدادات 
  pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
})

ثالثًا: أنشئ صفحة MDX جديدة ضمن المجلد pages/:

  - /pages
    - my-mdx-page.mdx
  - package.json

استخدام المكوّنات والتخطيطيات والعناصر المخصصة

بإمكانك الآن إدراج مكوّنات React مباشرة ضمن صفحة MDX:

import { MyComponent } from 'my-components'

# My MDX page

This is a list in markdown:

- One
- Two
- Three

Checkout my React component:

<MyComponent/>

استخلاص بيانات Frontmatter

يُعد Frontmatter تنسيق بيانات على شكل أزواج مفتاح/قيمة يشبه تنسيق YAML، ويُستخدم لتخزين بيانات وصفية عن الصفحة. لا يدعم next/mdx@ تنسيق frontmatter افتراضيًا لكن هناك حلول عديدة لإضافته إلى محتوى MDX مثل الإضافة gray-matter.

للوصول إلى البيانات الوصفية للصفحة من خلال next/mdx@، يمكنك تصدير كائن بيانات وصفية ضمن الملف mdx.:

export const meta = {
author: 'Rich Haines'
}

# My MDX page

استخدام التخطيطات Layouts

إن أردت إضافة تخطيط إلى صفحة MDX، أنشئ مكوّنًا جديدًا وأدرجه ضمن الصفحة، ومن ثم غلّف الصفحة ضمن مكوّن تخطيط :

import { MyComponent, MyLayoutComponent } from 'my-components'

export const meta = {
author: 'Rich Haines'
}

# My MDX Page with a Layout

This is a list in markdown:

- One
- Two
- Three

Checkout my React component:

<MyComponent/>

export default ({ children }) => <MyLayoutComponent meta={meta}>{children}</MyLayoutComponent>

العناصر المخصصة

من الميزات الرائعة لتنسيق markdown هو إمكانية ربط التنسيقات بعناصر HTML المقابلة مما يُسرّع الإنجاز:

# H1 heading

## H2 heading

This is a list in markdown:

- One
- Two
- Three

ستوّلد التنسيقات السابقة عناصر HTML التالية:

<h1>H1 heading</h1>

<h2>H2 heading</h2>

<p>This is a list in markdown:</p>

<ul>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
</ul>

وإن أردت تنسيق عناصرك الخاصة لإضفاء لمستك على التطبيق، يمكنك تمرير شيفرة مختصرة shortcodes، وهي مكوّناتك الخاصة التي تقترن بعناصر HTML. ولتنفيذ الأمر، استخدم المزوّد MDXProvider لتمرير كائن مكوّنات على شكل خاصية. يرتبط كل كائن من هذه الكائنات باسم عنصر HTML. ولكي تفعّل الميزة، لا بد من تحديد الخيار "providerImportSource: "@mdx-js/react في الملف next.config.js:

// next.config.js

const withMDX = require('@next/mdx')({
  // ...
  options: {
    providerImportSource: '@mdx-js/react',
  },
})

هيئ بعد ذلك المزوّد في صفحتك:

// pages/index.js

import { MDXProvider } from '@mdx-js/react'
import Image from 'next/image'
import { Heading, InlineCode, Pre, Table, Text } from 'my-components'

const ResponsiveImage = (props) => (
  <Image alt={props.alt} layout="responsive" {...props} />
)

const components = {
  img: ResponsiveImage,
  h1: Heading.H1,
  h2: Heading.H2,
  p: Text,
  pre: Pre,
  code: InlineCode,
}

export default function Post(props) {
  return (
    <MDXProvider components={components}>
      <main {...props} />
    </MDXProvider>
  )
}

إن أردت توسيع استخدام العنصر ليشمل كامل الموقع، أضف المزوّد إلى الملف app.js_ لكي تتعرف كل صفحات MDX على تهيئة العنصر المخصص.

استخدام مصرف MDX يعتمد على لغة Rust (تجريبي)

تدعم Next.js مصرف MDX جديد مكتوبة بلغة Rust ولكنه قيد التجربة والتطوير حاليًا ولا يُنصح باستعماله في بيئة إنتاجية.

لاستعمال هذا المصرف، تحتاج إلى التصريح عن ذلك في ملف next.config.js بالشكل التالي:

// next.config.js
module.exports = withMDX({
  experimental: {
    mdxRs: true,
  },
})

روابط مفيدة

المصادر