يحتوي Next.js على دعم مدمج لتحميل متغيرات البيئة من .env.local إلى process.env.
.env.local
DB_HOST=localhostDB_USER=myuserDB_PASS=mypassword
ملاحظة: يدعم Next.js أيضًا متغيرات متعددة الأسطر داخل ملفات .env*:
# .env.local# يمكنك الكتابة مع فواصل الأسطرPRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----...Kh9NV......-----END DSA PRIVATE KEY-----"# أو مع `\n` داخل علامات الاقتباس المزدوجةPRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END DSA PRIVATE KEY-----\n"
ملاحظة: إذا كنت تستخدم مجلد /src، يرجى ملاحظة أن Next.js سيحمل ملفات .env فقط من المجلد الرئيسي وليس من مجلد /src.
هذا يحمل process.env.DB_HOST، process.env.DB_USER، و process.env.DB_PASS إلى بيئة Node.js تلقائيًا مما يسمح لك باستخدامها في معالجات المسار.
على سبيل المثال:
app/api/route.js
export async function GET() { const db = await myDB.connect({ host: process.env.DB_HOST, username: process.env.DB_USER, password: process.env.DB_PASS, }) // ...}
سيقوم Next.js تلقائيًا بتوسيع المتغيرات التي تستخدم $ للإشارة إلى متغيرات أخرى مثل $VARIABLE داخل ملفات .env*. هذا يسمح لك بالإشارة إلى أسرار أخرى. على سبيل المثال:
متغيرات البيئة غير المبدوءة بـ NEXT_PUBLIC_ متاحة فقط في بيئة Node.js، مما يعني أنها غير متاحة للمتصفح (يعمل العميل في بيئة مختلفة).
لجعل قيمة متغير البيئة متاحة في المتصفح، يمكن لـ Next.js "تضمين" القيمة، في وقت البناء، في حزمة js التي يتم تسليمها إلى العميل، واستبدال جميع الإشارات إلى process.env.[variable] بقيمة ثابتة. لإخباره بفعل ذلك، ما عليك سوى إضافة البادئة NEXT_PUBLIC_ إلى المتغير. على سبيل المثال:
Terminal
NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk
سيخبر هذا Next.js باستبدال جميع الإشارات إلى process.env.NEXT_PUBLIC_ANALYTICS_ID في بيئة Node.js بالقيمة من البيئة التي تقوم فيها بتشغيل next build، مما يسمح لك باستخدامها في أي مكان في الكود الخاص بك. سيتم تضمينها في أي JavaScript يتم إرساله إلى المتصفح.
ملاحظة: بعد البناء، لن يستجيب تطبيقك للتغييرات في متغيرات البيئة هذه. على سبيل المثال، إذا كنت تستخدم خط أنابيب Heroku لترقية slugs المبنية في بيئة واحدة إلى بيئة أخرى، أو إذا قمت ببناء ونشر صورة Docker واحدة في بيئات متعددة، فسيتم تجميد جميع متغيرات NEXT_PUBLIC_ بالقيمة التي تم تقييمها في وقت البناء، لذا يجب تعيين هذه القيم بشكل مناسب عند بناء المشروع. إذا كنت بحاجة إلى الوصول إلى قيم بيئة التشغيل، فسيتعين عليك إعداد API خاص بك لتوفيرها للعميل (إما عند الطلب أو أثناء التهيئة).
pages/index.js
import setupAnalyticsService from '../lib/my-analytics-service'// يمكن استخدام 'NEXT_PUBLIC_ANALYTICS_ID' هنا لأنها مبدوءة بـ 'NEXT_PUBLIC_'.// سيتم تحويلها في وقت البناء إلى `setupAnalyticsService('abcdefghijk')`.setupAnalyticsService(process.env.NEXT_PUBLIC_ANALYTICS_ID)function HomePage() { return <h1>Hello World</h1>}export default HomePage
لاحظ أن عمليات البحث الديناميكية لن يتم تضمينها، مثل:
// هذا لن يتم تضمينه، لأنه يستخدم متغيرًاconst varName = 'NEXT_PUBLIC_ANALYTICS_ID'setupAnalyticsService(process.env[varName])// هذا لن يتم تضمينه، لأنه يستخدم متغيرًاconst env = process.envsetupAnalyticsService(env.NEXT_PUBLIC_ANALYTICS_ID)
يمكن لـ Next.js دعم كل من متغيرات بيئة البناء وبيئة التشغيل.
بشكل افتراضي، متغيرات البيئة متاحة فقط على الخادم. لكشف متغير بيئة للمتصفح، يجب أن يبدأ بـ NEXT_PUBLIC_. ومع ذلك، سيتم تضمين متغيرات البيئة العامة هذه في حزمة JavaScript أثناء next build.
لقراءة متغيرات بيئة التشغيل، نوصي باستخدام getServerSideProps أو اعتماد موجه التطبيق تدريجيًا. مع موجه التطبيق، يمكننا قراءة متغيرات البيئة بأمان على الخادم أثناء التصيير الديناميكي. هذا يسمح لك باستخدام صورة Docker واحدة يمكن ترقيتها عبر بيئات متعددة بقيم مختلفة.
import { unstable_noStore as noStore } from 'next/cache'export default function Component() { noStore() // cookies()، headers()، وغيرها من الدوال الديناميكية // ستختار أيضًا التصيير الديناميكي، مما يعني // أن متغير البيئة هذا يتم تقييمه في وقت التشغيل const value = process.env.MY_VALUE // ...}
معلومة مفيدة:
يمكنك تشغيل الكود عند بدء تشغيل الخادم باستخدام دالة register.
بشكل عام، هناك حاجة إلى ملف .env.local واحد فقط. ومع ذلك، قد ترغب أحيانًا في إضافة بعض الإعدادات الافتراضية لبيئة التطوير (next dev) أو الإنتاج (next start).
يسمح لك Next.js بتعيين الإعدادات الافتراضية في .env (جميع البيئات)، .env.development (بيئة التطوير)، و .env.production (بيئة الإنتاج).
.env.local دائمًا ما يتجاوز الإعدادات الافتراضية.
معلومة مفيدة: يجب تضمين ملفات .env، .env.development، و .env.production في مستودعك لأنها تحدد الإعدادات الافتراضية. يجب إضافة .env*.local إلى .gitignore، لأن هذه الملفات مخصصة لتجاهلها. .env.local هو المكان الذي يمكن تخزين الأسرار فيه.
يجب تكوين جميع أنواع متغيرات البيئة هناك. حتى متغيرات البيئة المستخدمة في التطوير - والتي يمكن تنزيلها على جهازك المحلي لاحقًا.
إذا قمت بتكوين متغيرات بيئة التطوير، يمكنك سحبها إلى .env.local للاستخدام على جهازك المحلي باستخدام الأمر التالي:
Terminal
vercel env pull .env.local
معلومة مفيدة: عند نشر تطبيق Next.js الخاص بك على Vercel، لن تكون متغيرات البيئة في ملفات .env* متاحة لـ Edge Runtime، إلا إذا كانت أسمائها مبدوءة بـ NEXT_PUBLIC_. نوصي بشدة بإدارة متغيرات البيئة في إعدادات المشروع بدلاً من ذلك، حيث تكون جميع متغيرات البيئة متاحة.
بالإضافة إلى بيئتي التطوير والإنتاج، هناك خيار ثالث متاح: الاختبار. بنفس الطريقة التي يمكنك بها تعيين إعدادات افتراضية لبيئات التطوير أو الإنتاج، يمكنك فعل ذلك مع ملف .env.test لبيئة الاختبار (على الرغم من أن هذا ليس شائعًا مثل الخيارين السابقين). لن يقوم Next.js بتحميل متغيرات البيئة من .env.development أو .env.production في بيئة الاختبار.
هذا مفيد عند تشغيل الاختبارات باستخدام أدوات مثل jest أو cypress حيث تحتاج إلى تعيين متغيرات بيئة محددة لأغراض الاختبار فقط. سيتم تحميل القيم الافتراضية للاختبار إذا تم تعيين NODE_ENV إلى test، على الرغم من أنك عادةً لا تحتاج إلى القيام بذلك يدويًا حيث ستقوم أدوات الاختبار بمعالجته نيابة عنك.
هناك فرق صغير بين بيئة الاختبار، وكل من التطوير والإنتاج يجب أن تضع في اعتبارك: لن يتم تحميل .env.local، حيث تتوقع أن تنتج الاختبارات نفس النتائج للجميع. بهذه الطريقة، كل تنفيذ للاختبار سيستخدم نفس إعدادات البيئة الافتراضية عبر عمليات تنفيذ مختلفة عن طريق تجاهل .env.local الخاص بك (والذي يهدف إلى تجاوز الإعدادات الافتراضية).
معلومة مفيدة: على غرار متغيرات البيئة الافتراضية، يجب تضمين ملف .env.test في مستودعك، ولكن لا يجب تضمين .env.test.local، حيث أن .env*.local مخصصة لتجاهلها عبر .gitignore.
أثناء تشغيل اختبارات الوحدة، يمكنك التأكد من تحميل متغيرات البيئة بنفس الطريقة التي يفعلها Next.js عن طريق الاستفادة من دالة loadEnvConfig من حزمة @next/env.
// يمكن استخدام ما يلي في ملف إعداد عام لـ Jest أو ما شابه لإعداد الاختبار الخاص بكimport { loadEnvConfig } from '@next/env'export default async () => { const projectDir = process.cwd() loadEnvConfig(projectDir)}
يتم البحث عن متغيرات البيئة في الأماكن التالية، بالترتيب، والتوقف بمجرد العثور على المتغير.
process.env
.env.$(NODE_ENV).local
.env.local (لا يتم التحقق منه عندما يكون NODE_ENV هو test.)
.env.$(NODE_ENV)
.env
على سبيل المثال، إذا كان NODE_ENV هو development وقمت بتعريف متغير في كل من .env.development.local و .env، فسيتم استخدام القيمة في .env.development.local.
معلومة مفيدة: القيم المسموح بها لـ NODE_ENV هي production، development و test.