تحويلات الكود (Codemods)
Codemods هي تحويلات تعمل على قاعدة الكود برمجيًا. هذا يسمح بتطبيق عدد كبير من التغييرات برمجيًا دون الحاجة إلى المرور يدويًا عبر كل ملف.
يوفر Next.js تحويلات Codemod للمساعدة في ترقية قاعدة كود Next.js عند تحديث API أو إهماله.
الاستخدام
في طرفيتك، انتقل (cd
) إلى مجلد مشروعك، ثم قم بتشغيل:
npx @next/codemod <transform> <path>
مع استبدال <transform>
و <path>
بقيم مناسبة.
transform
- اسم التحويلpath
- الملفات أو المجلد المراد تحويله--dry
تشغيل تجريبي، لن يتم تعديل أي كود--print
طباعة المخرجات المتغيرة للمقارنة
Codemods الخاصة بـ Next.js
14.0
نقل استيرادات ImageResponse
next-og-import
npx @next/codemod@latest next-og-import .
هذا الكودمود ينقل استيرادات من next/server
إلى next/og
لاستخدام توليد صور OG ديناميكية.
على سبيل المثال:
import { ImageResponse } from 'next/server'
يتحول إلى:
import { ImageResponse } from 'next/og'
استخدام تصدير viewport
metadata-to-viewport-export
npx @next/codemod@latest metadata-to-viewport-export .
هذا الكودمود ينقل بعض بيانات وصف viewport إلى تصدير viewport
.
على سبيل المثال:
export const metadata = {
title: 'My App',
themeColor: 'dark',
viewport: {
width: 1,
},
}
يتحول إلى:
export const metadata = {
title: 'My App',
}
export const viewport = {
width: 1,
themeColor: 'dark',
}
13.2
استخدام الخط المدمج
built-in-next-font
npx @next/codemod@latest built-in-next-font .
هذا الكودمود يزيل حزمة @next/font
ويحول استيرادات @next/font
إلى next/font
المدمج.
على سبيل المثال:
import { Inter } from '@next/font/google'
يتحول إلى:
import { Inter } from 'next/font/google'
13.0
إعادة تسمية استيرادات صورة Next
next-image-to-legacy-image
npx @next/codemod@latest next-image-to-legacy-image .
يعيد تسمية استيرادات next/image
بأمان في تطبيقات Next.js 10 أو 11 أو 12 الحالية إلى next/legacy/image
في Next.js 13. كما يعيد تسمية next/future/image
إلى next/image
.
على سبيل المثال:
import Image1 from 'next/image'
import Image2 from 'next/future/image'
export default function Home() {
return (
<div>
<Image1 src="/test.jpg" width="200" height="300" />
<Image2 src="/test.png" width="500" height="400" />
</div>
)
}
يتحول إلى:
// 'next/image' تصبح 'next/legacy/image'
import Image1 from 'next/legacy/image'
// 'next/future/image' تصبح 'next/image'
import Image2 from 'next/image'
export default function Home() {
return (
<div>
<Image1 src="/test.jpg" width="200" height="300" />
<Image2 src="/test.png" width="500" height="400" />
</div>
)
}
الانتقال إلى مكون الصورة الجديد
next-image-experimental
npx @next/codemod@latest next-image-experimental .
ينقل بشكل خطير من next/legacy/image
إلى next/image
الجديد عن طريق إضافة أنماط مضمنة وإزالة الخصائص غير المستخدمة.
- يزيل خاصية
layout
ويضيفstyle
. - يزيل خاصية
objectFit
ويضيفstyle
. - يزيل خاصية
objectPosition
ويضيفstyle
. - يزيل خاصية
lazyBoundary
. - يزيل خاصية
lazyRoot
.
إزالة علامات <a>
من مكونات Link
new-link
npx @next/codemod@latest new-link .
قم بإزالة علامات <a>
داخل مكونات Link، أو أضف خاصية legacyBehavior
إلى الروابط التي لا يمكن إصلاحها تلقائيًا.
على سبيل المثال:
<Link href="/about">
<a>About</a>
</Link>
// يتحول إلى
<Link href="/about">
About
</Link>
<Link href="/about">
<a onClick={() => console.log('clicked')}>About</a>
</Link>
// يتحول إلى
<Link href="/about" onClick={() => console.log('clicked')}>
About
</Link>
في الحالات التي لا يمكن فيها تطبيق الإصلاح التلقائي، تتم إضافة خاصية legacyBehavior
. هذا يسمح لتطبيقك بالاستمرار في العمل باستخدام السلوك القديم لهذا الرابط المحدد.
const Component = () => <a>About</a>
<Link href="/about">
<Component />
</Link>
// يصبح
<Link href="/about" legacyBehavior>
<Component />
</Link>
11
الانتقال من CRA
cra-to-next
npx @next/codemod cra-to-next
ينقل مشروع Create React App إلى Next.js؛ بإنشاء Pages Router والإعدادات اللازمة لمطابقة السلوك. يتم استخدام التصيير من جانب العميل فقط في البداية لمنع كسر التوافق بسبب استخدام window
أثناء SSR ويمكن تمكينه بسلاسة للسماح بالتبني التدريجي لميزات Next.js المحددة.
يرجى مشاركة أي ملاحظات متعلقة بهذا التحويل في هذه المناقشة.
10
إضافة استيرادات React
add-missing-react-import
npx @next/codemod add-missing-react-import
يحول الملفات التي لا تستورد React
لتشمل الاستيراد من أجل عمل تحويل JSX الجديد لـ React.
على سبيل المثال:
export default class Home extends React.Component {
render() {
return <div>Hello World</div>
}
}
يتحول إلى:
import React from 'react'
export default class Home extends React.Component {
render() {
return <div>Hello World</div>
}
}
9
تحويل المكونات المجهولة إلى مكونات مسماة
name-default-component
npx @next/codemod name-default-component
النسخ 9 وما فوق.
يحول المكونات المجهولة إلى مكونات مسماة للتأكد من عملها مع Fast Refresh.
على سبيل المثال:
export default function () {
return <div>Hello World</div>
}
يتحول إلى:
export default function MyComponent() {
return <div>Hello World</div>
}
سيكون للمكون اسم بحالة الجمل (camel-case) بناءً على اسم الملف، ويعمل أيضًا مع دوال السهم.
8
تحويل HOC الخاص بـ AMP إلى تكوين صفحة
withamp-to-config
npx @next/codemod withamp-to-config
يحول HOC withAmp
إلى تكوين صفحة Next.js 9.
على سبيل المثال:
// قبل
import { withAmp } from 'next/amp'
function Home() {
return <h1>My AMP Page</h1>
}
export default withAmp(Home)
// بعد
export default function Home() {
return <h1>My AMP Page</h1>
}
export const config = {
amp: true,
}
6
استخدام withRouter
url-to-withrouter
npx @next/codemod url-to-withrouter
يحول خاصية url
المهملة التي يتم حقنها تلقائيًا في الصفحات الرئيسية إلى استخدام withRouter
وخاصية router
التي يحقنها. اقرأ المزيد هنا: https://nextjs.org/docs/messages/url-deprecated
على سبيل المثال:
import React from 'react'
export default class extends React.Component {
render() {
const { pathname } = this.props.url
return <div>Current pathname: {pathname}</div>
}
}
import React from 'react'
import { withRouter } from 'next/router'
export default withRouter(
class extends React.Component {
render() {
const { pathname } = this.props.router
return <div>Current pathname: {pathname}</div>
}
}
)
هذه حالة واحدة. جميع الحالات التي يتم تحويلها (واختبارها) يمكن العثور عليها في دليل __testfixtures__
.