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

من موسوعة حسوب
أنشأ الصفحة ب'= مُصرِّف Next.js = يسمح مُصرِّف Next.js (الذي كتب بلغة Rust باستخدام [http://swc.rs/ SWC]) بتحويل وتصغير شيفرة Ja...'
 
طلا ملخص تعديل
 
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
= مُصرِّف Next.js =
<noinclude>{{DISPLAYTITLE:مُصرِّف Next.js}}</noinclude>
يسمح مُصرِّف Next.js (الذي كتب بلغة Rust باستخدام [http://swc.rs/ SWC]) بتحويل وتصغير شيفرة JavaScript لتصبح مناسبة لمرحلة الإنتاج. وبالتالي سيحل مكان Babel بالنسبة للملفات المستقلة و Terser لتجميعات الخرج المُصغّرة.
يسمح مُصرِّف Next.js الذي كتب بلغة Rust باستخدام [http://swc.rs/ SWC] بتحويل وتصغير شيفرة JavaScript لتصبح مناسبة لمرحلة الإنتاج. وبالتالي حل مكان Babel بالنسبة للملفات المستقلة و Terser لتصغير الحزم الناتجة.
 
إن التصريف باستخدام مصرّف Next.js أسرع بحوالي 17 مرة من استخدام Babel، وهو المصرِّف الافتراضي ابتداءً من النسخة 12. لكن إن كنت تستخدم إعدادات مهيئة مسبقًا لمحلل Babel أو كنت تستخدم ميزات غير مدعومة، سيتجاوز تطبيقك مصرّف Next.js ذاك ويستخدم Babel.
 
== سجل التغييرات ==
{| class="wikitable"
{| class="wikitable"
|+
!النسخة
!النسخة
!التغييرات
!التغييرات
|-
|v13.1.0
|دعم إدراج الوحدات بصورة مجزأة Modularize Imports أصبح مستقرًا.
|-
|v13.0.0
|تفعيل مُصغِّر SWC افتراضيًا.
|-
|v12.3.0
|مُصغِّر SWC أصبح مستقرًا.
|-
|v12.2.0
|إضافة دعم تجريبي لإضافات SWC.
|-
|-
|v12.1.0
|v12.1.0
سطر 12: سطر 27:
|ظهور مصرِّف Next.js للمرة الأولى.
|ظهور مصرِّف Next.js للمرة الأولى.
|}
|}
إن التصريف باستخدام مصرّف Next.js أسرع بحوالي 17 مرة من استخدام Babel، وهو المصرِّف الافتراضي ابتداءً من النسخة 12. لكن إن كنت تستخدم إعدادات مهيئة مسبقًا لمحلل Babel أو كنت تستخدم ميزات غير مدعومة، سيتجاوز تطبيقك مصرّف Next.js ويستخدم Babel.
== لماذا استخدم SWC؟ ==
== لماذا استخدم SWC؟ ==
SWC هي منصة مبنية على مُعدّة لأدوات التطوير من الجيل الجديد، وبالإمكان استخدامها للتصرف وتصغير الشيفرة وتجميعها وغيرها الكثير، وقد صممت لكي تكون قابلة للتوسعة. فهي أداة يمكن استخدامها لتنفيذ تحويلات على الشيفرة (سواء مدمجة أو مخصصة)، ويجري تنفيذ هذه التحويلات من خلال أدوات عالية المستوى مثل Next.js.
SWC هي منصة مبنية على [https://academy.hsoub.com/programming/rust/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%B1%D8%B3%D8%AA-rust-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A7%D8%AA-r1764/ لغة رست Rust] مُعدّة لأدوات التطوير من الجيل الجديد، وبالإمكان استخدامها للتصريف وتصغير الشيفرة وتجميعها وغيرها الكثير، وقد صممت لكي تكون قابلة للتوسعة. فهي أداة يمكن استخدامها لتنفيذ تحويلات على الشيفرة (سواء مدمجة أو مخصصة)، ويجري تنفيذ هذه التحويلات ضمن بيئات عالية المستوى مثل Next.js.


لقد اخترنا بناء التطبيقات باستخدام SWC لأسباب عدة منها:
لقد اخترنا بناء التطبيقات باستخدام SWC لأسباب عدة منها:


* قابلية التوسع: يمكن استخدام SWC كصندوق داخل Next.js دون الحاجة إلى اشتقاق المكتبة fork أو الإلتفاف حول تقييدات التصميم.
* '''قابلية التوسع''': يمكن استخدام SWC كصندوق Crate داخل Next.js دون الحاجة إلى اشتقاق fork المكتبة أو الإلتفاف حول تقييدات التصميم.
* الأداء: أمكننا تحقيق معدل [[Next.js/fast refresh|تحديث سريع]] أعلى بثلاث مرات ومعدل بناء أعلى بخمس مرات في Next.js عندما تحوّلنا لاستخدام SWC مع وجود مساحات أوسع للتحسينات التي لا تزال قيد التطوير.
* '''الأداء''': أمكننا تحقيق معدل [[Next.js/fast refresh|تحديث سريع]] أعلى بثلاث مرات ومعدل بناء أعلى بخمس مرات في Next.js عندما تحوّلنا لاستخدام SWC مع وجود مساحات أوسع للتحسينات التي لا تزال قيد التطوير.
* دعم WebAssembly: إن دعم Rust لتجميعة WASM أمر حيوي لدعم كل منصات العمل وبالتالي تطوير تطبيقات Next.js في كل مكان.
* '''دعم WebAssembly''': إن دعم لغة رست Rust لتجميعة WASM أمر حيوي لدعم مختلف منصات العمل، وبالتالي تطوير تطبيقات Next.js في كل مكان.
* مجتمع المطورين: إن مجتمع Rust ومناخ التعامل ضمنه رائع وينمو باستمرار.
* '''مجتمع المطورين''': إن مجتمع لغة رست Rust ومناخ التعامل ضمنه رائع وينمو باستمرار.


== الميزات المدعومة ==
== الميزات المدعومة في مصرِّف Next.js ==
إليك بعض الميزات التي يدعمها مُصرِّف Next.js
إليك بعض الميزات التي يدعمها مُصرِّف Next.js


=== المكوِّنات المُنسّقة ===
=== المكوِّنات المُنسّقة Styled Components ===
يجري العمل حاليًا على لربط <code>babel-plugin-styled-components</code> مع مصرّف Next.js ويمكنك تجريب ذلك. حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code> كالتالي:<syntaxhighlight lang="javascript">
يجري العمل حاليًا على ربط <code>babel-plugin-styled-components</code> مع مصرّف Next.js ويمكنك تجريب ذلك. حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code>:<syntaxhighlight lang="javascript">
// next.config.js
 
module.exports = {
module.exports = {
   compiler: {
   compiler: {
     //يهيئان افتراضيًا ssr و displayName
     // see https://styled-components.com/docs/tooling#babel-plugin for more info on the options.
     styledComponents: true,
    styledComponents: boolean | {
      // مُفعل في بيئة التطوير ومعطل في بيئة الإنتاج لتقليل حجم الملف
      // ضبط الخيار هنا سيُعدل سلوك كل البيئات ويعطل السلوك الافتراضي
      displayName?: boolean,
      // مُفعل افتراضيًا
      ssr?: boolean,
      // مُفعل افتراضيًا
      fileName?: boolean,
      // فارغ افتراضيًا
      topLevelImportPaths?: string[],
      // ["index"] القيمة الافتراضية هي
      meaninglessFileNames?: string[],
      // مُفعل افتراضيًا
      cssProp?: boolean,
      // فارغ افتراضيًا
      namespace?: string,
      // غير مدعوم بعد
      minify?: boolean,
      // غير مدعوم بعد
      transpileTemplateLiterals?: boolean,
      // غير مدعوم بعد
      pure?: boolean,
     },
   },
   },
}
}
</syntaxhighlight>أنجز حتى اللحظة التحويلان <code>ssr</code> و <code>displayName</code> فقط، وهما التحويلان الرئيسيان المطلوبان لاستخدام المكوّنات المُنسّقة <code>styled-components</code> في Next.js.


== مكتبة الاختبارت Jest ==
</syntaxhighlight>لم يضاف تنفيذ ودعم إلى التحويلات <code>minify</code> و <code>transpileTemplateLiterals</code> و <code>pure</code> ويمكنك تتبع نسبة الإنجاز [https://github.com/vercel/next.js/issues/30802 هنا]، إذ <code>ssr</code> و <code>displayName</code> هما التحويلان الرئيسيان المطلوبان لاستخدام المكوّنات المُنسّقة <code>styled-components</code> في Next.js.
لا تدعم Jest فقط التحويلات السابقة التي يؤمنها Babel لكنها تُبسِّط أيضًا تهيئة Jest مع Next.js بما في ذلك:
 
=== مكتبة الاختبارت Jest ===
لا تدعم Jest التحويلات السابقة التي يؤمنها Babel فقط، لكنها تُبسِّط أيضًا تهيئة Jest مع Next.js بما في ذلك:


* التقليد التلقائي لملفات <code>css.</code> و <code>module.css.</code> (بما في ذلك تنسيقات <code>scss.</code>) ولعملية إدراج الصور.
* التقليد التلقائي أو المحاكاة لملفات <code>css.</code> و <code>module.css.</code> (بما في ذلك تنسيقات <code>scss.</code>) ولعملية إدراج الصور.
* ضبط التحويلات <code>transform</code> تلقائيًا باستخدام SWC.
* ضبط التحويلات <code>transform</code> تلقائيًا باستخدام SWC.
* تحميل ملفات <code>env.</code> (وشبيهاتها) ضمن الملف <code>process.env</code>.
* تحميل ملفات <code>env.</code> (وشبيهاتها) ضمن الملف <code>process.env</code>.
* تجاهل <code>node_modules</code> خلال عملية تحليل وإنجاز الاختبارات والتحويل.
* تجاهل <code>node_modules</code> خلال عملية تحليل وإنجاز الاختبارات والتحويل.
* تجاهل <code>next.</code> خلال عملية تحليل وإنجاز الاختبارات.
* تجاهل <code>next.</code> خلال عملية تحليل وإنجاز الاختبارات.
* تحميل الملف <code>next.config.js</code> لتفعيل رايات SWC تحويلات التجريبية.
* تحميل الملف <code>next.config.js</code> لتفعيل رايات تحويلات SWC التجريبية.


حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code> :<syntaxhighlight lang="javascript">
حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code>:<syntaxhighlight lang="javascript">
// jest.config.js
// jest.config.js
const nextJest = require('next/jest')
const nextJest = require('next/jest')
// next.config.js  تحديد مسار التطبيق والذي سيمكِّن من تحميل الملف  
// next.config.js  تحديد مسار التطبيق والذي سيمكِّن من تحميل الملف  
// .env وملفات  
// .env وملفات  
const createJestConfig = nextJest({ dir })
const createJestConfig = nextJest({ dir: './' })


// jest أية تهيئة إضافية تريد تمريرها إلى  
// jest أية تهيئة إضافية تريد تمريرها إلى  
سطر 61: سطر 95:
}
}


//على تحميل next/jest بهذا الشكل للتأكد من قدرة createJestConfig ثصدَّر  
//على تحميل next/jest بهذا الشكل للتأكد من قدرة createJestConfig ثصدَّر  
//الغير متزامنة Next.js إعدادات  
//الغير متزامنة Next.js إعدادات  
module.exports = createJestConfig(customJestConfig)
module.exports = createJestConfig(customJestConfig)
سطر 67: سطر 101:


=== دعم مكتبة Relay ===
=== دعم مكتبة Relay ===
لدعم Relay نفِّذ التالي:<syntaxhighlight lang="javascript">
لدعم [https://relay.dev/ Relay] نفِّذ التالي:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js
module.exports = {
module.exports = {
   compiler: {
   compiler: {
     relay: {
     relay: {
       // This should match relay.config.js
       // relay.config.js ينبغي أن يطابق
       src: './',
       src: './',
       artifactDirectory: './__generated__',
       artifactDirectory: './__generated__',
سطر 79: سطر 113:
   },
   },
}
}
</syntaxhighlight>'''ملاحظة''': تُعد جميع ملفات JavaScript الموجودة في المجلد <code>pages</code> بمثابة وجهات routes. ولكي تستخدم <code>relay-compiler</code> ستضطر إلى تضبط إعدادات <code>artifactDirectory</code> خارج المجلد <code>pages</code> وإلا سيوّلد <code>relay-compiler</code> ملفات إلى جوار الملف المصدري في المجلد <code>__generated__</code> وسيُعد هذا الملف وجهة، مما يعطل نسخ الإنتاج في تطبيقك.
</syntaxhighlight>'''ملاحظة''': تُعد جميع ملفات [[JavaScript]] الموجودة في المجلد <code>pages</code> بمثابة وجهات routes. ولكي تستخدم <code>relay-compiler</code> ستضطر إلى تضبط إعدادات <code>artifactDirectory</code> خارج المجلد <code>pages</code> وإلا سيوّلد المُصرِّف <code>relay-compiler</code> ملفات إلى جوار الملف المصدري في المجلد <code>__generated__</code> وسيُعدُّ هذا الملف وجهة، مما يعطل نسخ الإنتاج في تطبيقك.


=== إزالة خاصيات React ===
=== إزالة خاصيات React ===
وذلك لإزالة خاصيات JSX لأغراض الاختبار غالبًا، وبشكل مشابه للخاصية <code>babel-plugin-react-remove-properties</code>.  
يسمح بإزالة خاصيات JSX لأغراض الاختبار غالبًا، وبشكل مشابه للخاصية <code>babel-plugin-react-remove-properties</code>.  


لإزالة الخاصيات التي تتطابق مع التعبير النمطي <code>^data-test</code>:<syntaxhighlight lang="javascript">
لإزالة الخاصيات التي تتطابق مع التعبير النمطي <code>^data-test</code>:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js
module.exports = {
module.exports = {
سطر 95: سطر 129:
module.exports = {
module.exports = {
   compiler: {
   compiler: {
     //لذا تختلف صياغة التعبير عن Rust يعالج التعبي النمطي من قبل  
     //لذا تختلف صياغة التعبير عن Rust يعالج التعبير النمطي من قبل  
     //JavaScript تعبير  
     //JavaScript تعبير  
     reactRemoveProperties: { properties: ['^data-custom$'] },
     reactRemoveProperties: { properties: ['^data-custom$'] },
سطر 102: سطر 136:
</syntaxhighlight>
</syntaxhighlight>


=== إزالة استدعاءات السجل Console ===
=== إزالة استدعاءات Console ===
يتيح لك هذا التحويل إزالة كل الاستدعاءات <code>*.console</code> من شيفرة التطبيق (وليس من <code>node_modules</code>)، وبشكل مشابه للخاصية <code>babel-plugin-transform-remove-console</code>.
يتيح لك هذا التحويل إزالة كل الاستدعاءات <code>*.console</code> من شيفرة التطبيق (وليس من <code>node_modules</code>)، وبشكل مشابه للخاصية <code>babel-plugin-transform-remove-console</code>.


سطر 112: سطر 146:
   },
   },
}
}
</syntaxhighlight>لإزالة كل الاستدعاءات <code>*.console</code> ما عدا <code>console.error</code>:<syntaxhighlight lang="javascript">
</syntaxhighlight>لإزالة كل الاستدعاءات <code>*.console</code> ما عدا <code>console.error</code>:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js
module.exports = {
module.exports = {
سطر 123: سطر 157:
</syntaxhighlight>
</syntaxhighlight>


=== دعم المبدلات الديناميكية القديمة ===
=== دعم المزخرفات القديمة Legacy Decorators ===
تكتشف Next.js تلقائيًا الراية <code>experimentalDecorators</code> في ملفات التهيئة <code>jsconfig.json</code> أو <code>tsconfig.json</code>. تُستخدم المبدلات الديناميكية Legacy decorators مع النسخ الأقدم من مكتبات مثل<code>mobx</code>، وتُدعم هذه الراية لأغراض التوافق فقط مع التطبيقات الموجودة، ولا ننصح باستخدامها في التطبيقات الجديدة.
تكتشف Next.js تلقائيًا الراية <code>experimentalDecorators</code> في ملفات التهيئة <code>jsconfig.json</code> أو <code>tsconfig.json</code>. إذ تُستخدم المزخرفات القديمة Legacy decorators مع النسخ الأقدم من مكتبات مثل<code>mobx</code>، وتُدعم هذه الراية لأغراض التوافق فقط مع التطبيقات الموجودة، ولا ننصح باستخدامها في التطبيقات الجديدة.


حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code> أو الملف <code>jsconfig.json</code>:<syntaxhighlight lang="json">
حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code> أو الملف <code>jsconfig.json</code>:<syntaxhighlight lang="json">
{
{
   "compilerOptions": {
   "compilerOptions": {
سطر 135: سطر 169:


=== دعم الخاصية importSource ===
=== دعم الخاصية importSource ===
تكتشف تلقائيًا الخاصية <code>jsxImportSource</code> في الملفين <code>jsconfig.json</code> و <code>tsconfig.json</code> وتطبقها، وتستخدم هذه الخاصية عادة مع مكتبات مثل "Theme UI".
تكتشف Next.js تلقائيًا الخاصية <code>jsxImportSource</code> في الملفين <code>jsconfig.json</code> و <code>tsconfig.json</code> وتطبقها، وتُستخدم هذه الخاصية عادة مع مكتبات مثل "Theme UI".


حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code> أو الملف <code>jsconfig.json</code>:<syntaxhighlight lang="javascript">
حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code> أو الملف <code>jsconfig.json</code>:<syntaxhighlight lang="javascript">
{
{
   "compilerOptions": {
   "compilerOptions": {
سطر 145: سطر 179:
</syntaxhighlight>
</syntaxhighlight>


== الميزات التجريبية لمصرِّف Next.js ==
=== دعم المكتبة Emotion ===


=== دعم المكتبة Emotion ===
يجري العمل حاليًا على ربط <code>emotion/babel-plugin@</code> مع مصرّف Next.js. لتجريب ذلك، حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code>:<syntaxhighlight lang="javascript">
يجري العمل حاليًا على ربط <code>emotion/babel-plugin@</code> مع مصرّف Next.js. لتجريب ذلك، حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر <code>npm install next@latest</code> ثم حدّث ملف التهيئة <code>next.config.js</code>:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js


module.exports = {
module.exports = {
   experimental: {
   compiler: {
     emotion: boolean | {
     emotion: boolean | {
       // مفعلة افتراضيًا، وتُعطّل في نسخ الإنتاج
       // مفعلة افتراضيًا، وتُعطّل في نسخ الإنتاج
سطر 160: سطر 193:
       autoLabel?: 'never' | 'dev-only' | 'always',
       autoLabel?: 'never' | 'dev-only' | 'always',
       // '[local]':القيمة الافتراضية هي  
       // '[local]':القيمة الافتراضية هي  
       // `[local]` `[filename]` and `[dirname]`:القيمة المسموحة هي  
       // `[local]` و `[filename]` و `[dirname]`:القيمة المسموحة هي  
       //على إحدى القيمتين autoLabel يعمل هذا الخيار عندما يُضبط
       // على إحدى القيمتين autoLabel يعمل هذا الخيار عندما يُضبط
       // 'dev-only' أو 'always'.
       // 'dev-only' أو 'always'.
       // تتيح لك تحديد تنسيق العنوان الناتج
       // تتيح لك تحديد تنسيق العنوان الناتج
سطر 168: سطر 201:
       // "my-classname--[local]" مثال على ذلك   
       // "my-classname--[local]" مثال على ذلك   
       //ويُستبدل باسم المتغير [local] المتغير هو  
       //ويُستبدل باسم المتغير [local] المتغير هو  
     
      labelFormat?: string,
      // القيمة الافتراضية غير مُعرفة
      // يسمح لك هذا الخيار بإخبار المُصرف ما هي الإدراجات التي يجب أن ينظر فيها
      // Emotion ليُحدد ما هي التحويلات، فإذا كنت تعيد تصدير تصديرات
      // فلا يزال بوسعك الاستفادة من التحويلات
      importMap?: {
        [packageName: string]: {
          [exportName: string]: {
            canonicalImport?: [string, string],
            styledBaseImport?: [string, string],
          }
        }
      },
     },
     },
   },
   },
}
}
</syntaxhighlight>تُدعم حتى اللحظة الخاصية <code>importMap</code> فقط من خاصيات <code>emotion/babel-plugin@</code>.
</syntaxhighlight>
 
=== التصغير Minification ===
=== التصغير ===
بإمكانك الاستفادة من مصرِّف Next.js في تصغير الشيفرة minification الذي أصبح افتراضيًا مع النسخة 13، وهذا أسرع بسبع مرات من استخدام Terser، وإن كنت لا تزال بحاجة إلى استعمال Terser لأي سبب كان، فيمكنك تغيير الضبط كالتالي:<syntaxhighlight lang="javascript">
بإمكانك الاستفادة من مصرِّف Next.js في تصغير الشيفرة minification، وهذا أسرع بسبع مرات من استخدام Terser.<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js


سطر 183: سطر 227:
</syntaxhighlight>
</syntaxhighlight>


=== دعم إدراج الوحدات البرمجية ===
=== دعم إدراج الوحدات البرمجية بصورة مجزأة ===
تمامًا كما في [https://www.npmjs.com/package/babel-plugin-transform-imports babel-plugin-transform-imports].  
تمامًا كما في [https://www.npmjs.com/package/babel-plugin-transform-imports babel-plugin-transform-imports].  


يحوّل نمط الإدراج التالي:<syntaxhighlight lang="javascript">
يُحوَّل نمط الإدراج التالي:<syntaxhighlight lang="javascript">
import { Row, Grid as MyGrid } from 'react-bootstrap'
import { Row, Grid as MyGrid } from 'react-bootstrap'
import { merge } from 'lodash'
import { merge } from 'lodash'
سطر 196: سطر 240:
// next.config.js
// next.config.js
module.exports = {
module.exports = {
   experimental: {
   modularizeImports: {
     modularizeImports: {
     'react-bootstrap': {
      'react-bootstrap': {
      transform: 'react-bootstrap/lib/{{member}}',
        transform: 'react-bootstrap/lib/{{member}}',
    },
      },
    lodash: {
      lodash: {
      transform: 'lodash/{{member}}',
        transform: 'lodash/{{member}}',
      },
     },
     },
   },
   },
}
}
</syntaxhighlight>تحويلات متقدمة:
</syntaxhighlight>


* استخدام التعابير النطية: يماثل لكن التحويل يقولب باستخدام handlebars، و ستكون التعابير النمطية وفق صياغة Rust.
==== تحويلات متقدمة ====
* استخدام التعابير النطية regular expressions: يماثل <code>babel-plugin-transform-imports</code> لكن التحويل يقولب باستخدام [https://docs.rs/handlebars handlebars]، وستكون التعابير النمطية وفق [https://docs.rs/regex/latest/regex/ صياغة Rust].


تجعل الإعدادات التالية:<syntaxhighlight lang="javascript">
تجعل الإعدادات التالية:<syntaxhighlight lang="javascript">
// next.config.js
// next.config.js
module.exports = {
module.exports = {
   experimental: {
   modularizeImports: {
     modularizeImports: {
     'my-library/?(((\\w*)?/?)*)': {
      'my-library/?(((\\w*)?/?)*)': {
      transform: 'my-library/{{ matches.[1] }}/{{member}}',
        transform: 'my-library/{{ matches.[1] }}/{{member}}',
      },
     },
     },
   },
   },
سطر 233: سطر 274:
</syntaxhighlight>
</syntaxhighlight>


* القولبة باستخدام لغة handlebars: يستخدم هذا التحويل اللغة لقولبة مسار المكتبة أو الوحدة التي نريد إدراجها في الحقل <code>transform</code>. يمكنك استخدام الدوال المساعدة و المتغيرات التالية:
* القولبة باستخدام Handlebars: يستخدم هذا التحويل [https://docs.rs/handlebars/latest/handlebars/ صياغة handlebars] لقولبة مسار المكتبة أو الوحدة التي نريد إدراجها في الحقل <code>transform</code>. يمكنك استخدام الدوال المساعدة والمتغيرات التالية:


# <code>matches</code>: يمتلك النوع <code>[]string</code>. ويضم كل المجموعات التي تتطابق مع التعبير النمطي. يعيد <code>matches.[0]</code> التطابق كاملًا.
# <code>matches</code>: يمتلك النوع <code>[]string</code>، ويضم كل المجموعات التي تتطابق مع التعبير النمطي. يعيد <code>matches.[0]</code> التطابق كاملًا.
# <code>member</code>: من النوع ويمثل اسم العضو المُدرج.
# <code>member</code>: من النوع <code>[]string</code>، ويمثل اسم العضو المُدرج.
# <code>lowerCase</code> و <code>upperCase</code> و <code>camelCase</code>: وهي دوال مساعدة لتحويل النص إلى حروف كبيرة أو صغيرة أو طريقة سنام الجمل.
# <code>lowerCase</code> و <code>upperCase</code> و <code>camelCase</code>: وهي دوال مساعدة لتحويل النص إلى حروف كبيرة أو صغيرة أو طريقة سنام الجمل.
== الميزات التجريبية لمصرِّف Next.js ==
=== خيارات تنقيح عمل المُصغِّر ===
ما زال عمل المُصغِّر minifier في طور التجريب والاختبار، لذا وفرنا الخيارات التالية لأغراض التنقيح والبحث عن المشاكل، ولن تكون الخيارات متاحة متى ما استقر عمل المُصغِّر.<syntaxhighlight lang="javascript">
// next.config.js
module.exports = {
  experimental: {
    swcMinifyDebugOptions: {
      compress: {
        defaults: true,
        side_effects: false,
      },
    },
  },
}
</syntaxhighlight>ارجع إلى [https://swc.rs/docs/configuration/minification#jscminifycompress توثيق SWC] لمزيد من التفاصيل.
=== تتبع أداء SWC ===
يمكنك توليد تعقبات التحويل الداخلية التي يجريها SWC بشكل مشابه لصيغة [https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview?mode=html#%21= أحداث التعقب في متصفح كروميوم chromium].<syntaxhighlight lang="javascript">
// next.config.js
module.exports = {
  experimental: {
    swcTraceProfiling: true,
  },
}
</syntaxhighlight>بمجرد تفعيلها، سيولد SWC تعقيبات باسم <code>swc-trace-profile-${timestamp}.json</code> داخل المجلد <code>/next.</code>، ويمكنك استعمال أي عارض تعقبات trace viewer مناسب لتحميلها وعرضها مثل: chrome://tracing أو https://ui.perfetto.dev أو https://www.speedscope.app.
=== إضافات SWC ===
يمكنك ضبط تحويلات SWC لاستخدام دعم إضافات SWC التجريبي المكتوب باستخدام WebAssembly وذلك لتخصيص سلوك تحويل ما.<syntaxhighlight lang="javascript">
// next.config.js
module.exports = {
  experimental: {
    swcPlugins: [
      [
        'plugin',
        {
          ...pluginOptions,
        },
      ],
    ],
  },
}
</syntaxhighlight>تقبل <code>swcPlugins</code> مصفوفة من الصفوف لكل إضافة مع ضبطها، إذ يحوي كل صف مسار الإضافة وكائن لحواية ضبطها، وبالنسبة للمسار، يمكن أن يكون اسم وحدة npm أو مسار مطلق إلى ملف <code>wasm.</code>.


== ميزات غير مدعومة في مصرِّف Next.js ==
== ميزات غير مدعومة في مصرِّف Next.js ==
سطر 245: سطر 333:


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

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

يسمح مُصرِّف Next.js الذي كتب بلغة Rust باستخدام SWC بتحويل وتصغير شيفرة JavaScript لتصبح مناسبة لمرحلة الإنتاج. وبالتالي حل مكان Babel بالنسبة للملفات المستقلة و Terser لتصغير الحزم الناتجة.

إن التصريف باستخدام مصرّف Next.js أسرع بحوالي 17 مرة من استخدام Babel، وهو المصرِّف الافتراضي ابتداءً من النسخة 12. لكن إن كنت تستخدم إعدادات مهيئة مسبقًا لمحلل Babel أو كنت تستخدم ميزات غير مدعومة، سيتجاوز تطبيقك مصرّف Next.js ذاك ويستخدم Babel.

سجل التغييرات

النسخة التغييرات
v13.1.0 دعم إدراج الوحدات بصورة مجزأة Modularize Imports أصبح مستقرًا.
v13.0.0 تفعيل مُصغِّر SWC افتراضيًا.
v12.3.0 مُصغِّر SWC أصبح مستقرًا.
v12.2.0 إضافة دعم تجريبي لإضافات SWC.
v12.1.0 دعم المكوّنات المنسَّقة ومكتبة Jest وإزالة خاصيات React ودعم المبدلات الديناميكية القديمة وإزالة تعليمات السجل Console ودعم الخاصية jsxImportSource.
v12.0.0 ظهور مصرِّف Next.js للمرة الأولى.

لماذا استخدم SWC؟

SWC هي منصة مبنية على لغة رست Rust مُعدّة لأدوات التطوير من الجيل الجديد، وبالإمكان استخدامها للتصريف وتصغير الشيفرة وتجميعها وغيرها الكثير، وقد صممت لكي تكون قابلة للتوسعة. فهي أداة يمكن استخدامها لتنفيذ تحويلات على الشيفرة (سواء مدمجة أو مخصصة)، ويجري تنفيذ هذه التحويلات ضمن بيئات عالية المستوى مثل Next.js.

لقد اخترنا بناء التطبيقات باستخدام SWC لأسباب عدة منها:

  • قابلية التوسع: يمكن استخدام SWC كصندوق Crate داخل Next.js دون الحاجة إلى اشتقاق fork المكتبة أو الإلتفاف حول تقييدات التصميم.
  • الأداء: أمكننا تحقيق معدل تحديث سريع أعلى بثلاث مرات ومعدل بناء أعلى بخمس مرات في Next.js عندما تحوّلنا لاستخدام SWC مع وجود مساحات أوسع للتحسينات التي لا تزال قيد التطوير.
  • دعم WebAssembly: إن دعم لغة رست Rust لتجميعة WASM أمر حيوي لدعم مختلف منصات العمل، وبالتالي تطوير تطبيقات Next.js في كل مكان.
  • مجتمع المطورين: إن مجتمع لغة رست Rust ومناخ التعامل ضمنه رائع وينمو باستمرار.

الميزات المدعومة في مصرِّف Next.js

إليك بعض الميزات التي يدعمها مُصرِّف Next.js

المكوِّنات المُنسّقة Styled Components

يجري العمل حاليًا على ربط babel-plugin-styled-components مع مصرّف Next.js ويمكنك تجريب ذلك. حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر npm install next@latest ثم حدّث ملف التهيئة next.config.js:

module.exports = {
  compiler: {
    // see https://styled-components.com/docs/tooling#babel-plugin for more info on the options.
    styledComponents: boolean | {
      // مُفعل في بيئة التطوير ومعطل في بيئة الإنتاج لتقليل حجم الملف
      // ضبط الخيار هنا سيُعدل سلوك كل البيئات ويعطل السلوك الافتراضي
      displayName?: boolean,
      // مُفعل افتراضيًا
      ssr?: boolean,
      // مُفعل افتراضيًا
      fileName?: boolean,
      // فارغ افتراضيًا
      topLevelImportPaths?: string[],
      // ["index"] القيمة الافتراضية هي
      meaninglessFileNames?: string[],
      // مُفعل افتراضيًا
      cssProp?: boolean,
      // فارغ افتراضيًا
      namespace?: string,
      // غير مدعوم بعد
      minify?: boolean,
      // غير مدعوم بعد
      transpileTemplateLiterals?: boolean,
      // غير مدعوم بعد
      pure?: boolean,
    },
  },
}

لم يضاف تنفيذ ودعم إلى التحويلات minify و transpileTemplateLiterals و pure ويمكنك تتبع نسبة الإنجاز هنا، إذ ssr و displayName هما التحويلان الرئيسيان المطلوبان لاستخدام المكوّنات المُنسّقة styled-components في Next.js.

مكتبة الاختبارت Jest

لا تدعم Jest التحويلات السابقة التي يؤمنها Babel فقط، لكنها تُبسِّط أيضًا تهيئة Jest مع Next.js بما في ذلك:

  • التقليد التلقائي أو المحاكاة لملفات css. و module.css. (بما في ذلك تنسيقات scss.) ولعملية إدراج الصور.
  • ضبط التحويلات transform تلقائيًا باستخدام SWC.
  • تحميل ملفات env. (وشبيهاتها) ضمن الملف process.env.
  • تجاهل node_modules خلال عملية تحليل وإنجاز الاختبارات والتحويل.
  • تجاهل next. خلال عملية تحليل وإنجاز الاختبارات.
  • تحميل الملف next.config.js لتفعيل رايات تحويلات SWC التجريبية.

حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر npm install next@latest ثم حدّث ملف التهيئة next.config.js:

// jest.config.js
const nextJest = require('next/jest')
// next.config.js  تحديد مسار التطبيق والذي سيمكِّن من تحميل الملف 
// .env وملفات 
const createJestConfig = nextJest({ dir: './' })

// jest أية تهيئة إضافية تريد تمريرها إلى 
const customJestConfig = {
  setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
}

//على تحميل next/jest بهذا الشكل للتأكد من قدرة createJestConfig ثصدَّر 
//الغير متزامنة Next.js إعدادات 
module.exports = createJestConfig(customJestConfig)

دعم مكتبة Relay

لدعم Relay نفِّذ التالي:

// next.config.js
module.exports = {
  compiler: {
    relay: {
      // relay.config.js ينبغي أن يطابق
      src: './',
      artifactDirectory: './__generated__',
      language: 'typescript',
    },
  },
}

ملاحظة: تُعد جميع ملفات JavaScript الموجودة في المجلد pages بمثابة وجهات routes. ولكي تستخدم relay-compiler ستضطر إلى تضبط إعدادات artifactDirectory خارج المجلد pages وإلا سيوّلد المُصرِّف relay-compiler ملفات إلى جوار الملف المصدري في المجلد __generated__ وسيُعدُّ هذا الملف وجهة، مما يعطل نسخ الإنتاج في تطبيقك.

إزالة خاصيات React

يسمح بإزالة خاصيات JSX لأغراض الاختبار غالبًا، وبشكل مشابه للخاصية babel-plugin-react-remove-properties.

لإزالة الخاصيات التي تتطابق مع التعبير النمطي ‎^data-test:

// next.config.js
module.exports = {
  compiler: {
    reactRemoveProperties: true,
  },
}

لإزالة خاصية محددة:

// next.config.js
module.exports = {
  compiler: {
    //لذا تختلف صياغة التعبير عن Rust يعالج التعبير النمطي من قبل 
    //JavaScript تعبير 
    reactRemoveProperties: { properties: ['^data-custom$'] },
  },
}

إزالة استدعاءات Console

يتيح لك هذا التحويل إزالة كل الاستدعاءات *.console من شيفرة التطبيق (وليس من node_modules)، وبشكل مشابه للخاصية babel-plugin-transform-remove-console.

تُزال كل الاستدعاءات *.console كالتالي:

// next.config.js
module.exports = {
  compiler: {
    removeConsole: true,
  },
}

لإزالة كل الاستدعاءات *.console ما عدا console.error:

// next.config.js
module.exports = {
  compiler: {
    removeConsole: {
      exclude: ['error'],
    },
  },
}

دعم المزخرفات القديمة Legacy Decorators

تكتشف Next.js تلقائيًا الراية experimentalDecorators في ملفات التهيئة jsconfig.json أو tsconfig.json. إذ تُستخدم المزخرفات القديمة Legacy decorators مع النسخ الأقدم من مكتبات مثلmobx، وتُدعم هذه الراية لأغراض التوافق فقط مع التطبيقات الموجودة، ولا ننصح باستخدامها في التطبيقات الجديدة.

حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر npm install next@latest ثم حدّث ملف التهيئة next.config.js أو الملف jsconfig.json:

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

دعم الخاصية importSource

تكتشف Next.js تلقائيًا الخاصية jsxImportSource في الملفين jsconfig.json و tsconfig.json وتطبقها، وتُستخدم هذه الخاصية عادة مع مكتبات مثل "Theme UI".

حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر npm install next@latest ثم حدّث ملف التهيئة next.config.js أو الملف jsconfig.json:

{
  "compilerOptions": {
    "jsxImportSource": 'preact'
  }
}

دعم المكتبة Emotion

يجري العمل حاليًا على ربط emotion/babel-plugin@ مع مصرّف Next.js. لتجريب ذلك، حدّث أولًا نسخة Next.js إلى النسخة الأخيرة بتنفيذ الأمر npm install next@latest ثم حدّث ملف التهيئة next.config.js:

// next.config.js

module.exports = {
  compiler: {
    emotion: boolean | {
      // مفعلة افتراضيًا، وتُعطّل في نسخ الإنتاج
     
      sourceMap?: boolean,
      // 'dev-only' :القيمة الافتراضية هي 
      autoLabel?: 'never' | 'dev-only' | 'always',
      // '[local]':القيمة الافتراضية هي 
      // `[local]` و `[filename]` و `[dirname]`:القيمة المسموحة هي 
      // على إحدى القيمتين autoLabel يعمل هذا الخيار عندما يُضبط
      // 'dev-only' أو 'always'.
      // تتيح لك تحديد تنسيق العنوان الناتج
      // يٌعرّف التنسيق من خلال سلسلة نصية توضع فيها الأجزاء المتغيرة
      //[] بين قوسين مربعين 
      // "my-classname--[local]" مثال على ذلك  
      //ويُستبدل باسم المتغير [local] المتغير هو 
      labelFormat?: string,
      // القيمة الافتراضية غير مُعرفة
      // يسمح لك هذا الخيار بإخبار المُصرف ما هي الإدراجات التي يجب أن ينظر فيها
      // Emotion ليُحدد ما هي التحويلات، فإذا كنت تعيد تصدير تصديرات
      // فلا يزال بوسعك الاستفادة من التحويلات
      importMap?: {
        [packageName: string]: {
          [exportName: string]: {
            canonicalImport?: [string, string],
            styledBaseImport?: [string, string],
          }
        }
      },
    },
  },
}

التصغير Minification

بإمكانك الاستفادة من مصرِّف Next.js في تصغير الشيفرة minification الذي أصبح افتراضيًا مع النسخة 13، وهذا أسرع بسبع مرات من استخدام Terser، وإن كنت لا تزال بحاجة إلى استعمال Terser لأي سبب كان، فيمكنك تغيير الضبط كالتالي:

// next.config.js

module.exports = {
  swcMinify: true,
}

دعم إدراج الوحدات البرمجية بصورة مجزأة

تمامًا كما في babel-plugin-transform-imports.

يُحوَّل نمط الإدراج التالي:

import { Row, Grid as MyGrid } from 'react-bootstrap'
import { merge } from 'lodash'

إلى النمط الافتراضي للإدراج:

import Row from 'react-bootstrap/lib/Row'
import MyGrid from 'react-bootstrap/lib/Grid'
import merge from 'lodash/merge'

تُضبط إعدادات التحويل السابق كالتالي:

// next.config.js
module.exports = {
  modularizeImports: {
    'react-bootstrap': {
      transform: 'react-bootstrap/lib/{{member}}',
    },
    lodash: {
      transform: 'lodash/{{member}}',
    },
  },
}

تحويلات متقدمة

  • استخدام التعابير النطية regular expressions: يماثل babel-plugin-transform-imports لكن التحويل يقولب باستخدام handlebars، وستكون التعابير النمطية وفق صياغة Rust.

تجعل الإعدادات التالية:

// next.config.js
module.exports = {
  modularizeImports: {
    'my-library/?(((\\w*)?/?)*)': {
      transform: 'my-library/{{ matches.[1] }}/{{member}}',
    },
  },
}

الشيفرة:

import { MyModule } from 'my-library'
import { App } from 'my-library/components'
import { Header, Footer } from 'my-library/components/App'

على الشكل:

import MyModule from 'my-library/MyModule'
import App from 'my-library/components/App'
import Header from 'my-library/components/App/Header'
import Footer from 'my-library/components/App/Footer'
  • القولبة باستخدام Handlebars: يستخدم هذا التحويل صياغة handlebars لقولبة مسار المكتبة أو الوحدة التي نريد إدراجها في الحقل transform. يمكنك استخدام الدوال المساعدة والمتغيرات التالية:
  1. matches: يمتلك النوع []string، ويضم كل المجموعات التي تتطابق مع التعبير النمطي. يعيد matches.[0] التطابق كاملًا.
  2. member: من النوع []string، ويمثل اسم العضو المُدرج.
  3. lowerCase و upperCase و camelCase: وهي دوال مساعدة لتحويل النص إلى حروف كبيرة أو صغيرة أو طريقة سنام الجمل.

الميزات التجريبية لمصرِّف Next.js

خيارات تنقيح عمل المُصغِّر

ما زال عمل المُصغِّر minifier في طور التجريب والاختبار، لذا وفرنا الخيارات التالية لأغراض التنقيح والبحث عن المشاكل، ولن تكون الخيارات متاحة متى ما استقر عمل المُصغِّر.

// next.config.js

module.exports = {
  experimental: {
    swcMinifyDebugOptions: {
      compress: {
        defaults: true,
        side_effects: false,
      },
    },
  },
}

ارجع إلى توثيق SWC لمزيد من التفاصيل.

تتبع أداء SWC

يمكنك توليد تعقبات التحويل الداخلية التي يجريها SWC بشكل مشابه لصيغة أحداث التعقب في متصفح كروميوم chromium.

// next.config.js

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

بمجرد تفعيلها، سيولد SWC تعقيبات باسم swc-trace-profile-${timestamp}.json داخل المجلد /next.، ويمكنك استعمال أي عارض تعقبات trace viewer مناسب لتحميلها وعرضها مثل: chrome://tracing أو https://ui.perfetto.dev أو https://www.speedscope.app.

إضافات SWC

يمكنك ضبط تحويلات SWC لاستخدام دعم إضافات SWC التجريبي المكتوب باستخدام WebAssembly وذلك لتخصيص سلوك تحويل ما.

// next.config.js

module.exports = {
  experimental: {
    swcPlugins: [
      [
        'plugin',
        {
          ...pluginOptions,
        },
      ],
    ],
  },
}

تقبل swcPlugins مصفوفة من الصفوف لكل إضافة مع ضبطها، إذ يحوي كل صف مسار الإضافة وكائن لحواية ضبطها، وبالنسبة للمسار، يمكن أن يكون اسم وحدة npm أو مسار مطلق إلى ملف wasm..

ميزات غير مدعومة في مصرِّف Next.js

عندما يحتوي تطبيقك على الملف babelrc.، ستتراجع Next.js تلقائيًا لاستخدام Babel في تحويل الملفات المستقلة. يضمن ذلك التوافقية الرجعية مع التطبيقات الموجودة التي تستخدم إضافات Babel مخصصة.

المصادر

  • الصفحة Compiler من توثيق Next.js الرسمي.