Razzle: بناء مجمّع يدمج متغير بيئة PORT

تم إنشاؤها على ٢١ سبتمبر ٢٠١٧  ·  13تعليقات  ·  مصدر: jaredpalmer/razzle

نظرًا لكيفية كتابة getClientEnvironment ، يتم تضمين متغير بيئة PORT في الإنشاء النهائي بدلاً من الاحتفاظ به على أنه process.env.PORT .

سيؤدي هذا إلى فشل تشغيل Razzle على Heroku باستخدام start: prod

stale

التعليق الأكثر فائدة

لقد وجدت حلاً بسيطًا جدًا لهذه المشكلة ، إذا كان الناس لا يزالون يعانون من ذلك

  // This will extract the env during production execution.. PORT will not be inlined during build
  const getEnv = c => process.env[c];
  app.listen(getEnv('PORT'));

ال 13 كومينتر

لقد لاحظت أيضًا أنه بالطريقة التي تتم بها كتابة الدالة getClientEnvironment stringified ، يتم استبدال process.env بالكامل بكائن مضمن بما في ذلك جميع متغيرات البيئة:

// console.log(process.env.PORT) gets compiled to:
console.log(Object({"NODE_ENV":"production","PORT":3000,"VERBOSE":false,"HOST":"localhost","RAZZLE_ASSETS_MANIFEST":"somepath","BUILD_TARGET":"server","RAZZLE_PUBLIC_DIR":"somepath"}).PORT);

هذا يجعل من المستحيل جعل تكوين تطبيق الخادم ديناميكيًا دون إعادة بنائه في كل مرة.

مرحبًا @ d4rky-pl ،
يمكنك استخدام razzle-heroku :) فهو يوسع
انظر # 340 لمزيد من المعلومات

xouabita هذا جميل ، شكرا :)

أشعر أن Razzle يجب أن يدعم هذا بشكل افتراضي أو أن يكون لديه تحذير بشأن process.env وبناء الإنتاج في مكان أكثر بروزًا.

تبين أن هذا يمثل مشكلة أكثر مما كنت أتخيل. دعني أشرح:

أنا أكتب عداء اختبارات النظام (اختبارات النظام: الاختبارات التي يتم تشغيلها في المتصفح الفعلي) وأريد إضافة دعم razzle من اليوم الأول. تكمن المشكلة في أنه نظرًا لأن PORT مضمّن في البناء الناتج ، يجب أن أقوم بتضمينه أيضًا عند تجميع كل شيء قبل الاختبار.

قد يتسبب هذا في حدوث ارتباك لا داعي له عندما يحاول شخص ما بعد ذلك استخدام نفس البنية لشيء آخر (إنه بناء الإنتاج بعد كل شيء ، بخلاف PORT ، لا توجد تغييرات) نظرًا لأن المنفذ المضمن في الاختبارات يختلف عن ذلك أثناء تجميع الإنتاج "العادي" . يمكنني أيضًا إسقاط البنية بعد إجراء الاختبارات ، ولكنها ستؤدي إلى كسر التدفق حيث نجري اختبارات النظام قبل نشر الإنتاج ثم إعادة استخدام نفس الشفرة المجمعة.

jaredpalmer ، يرجى إعادة النظر في قرار const PORT = process.env.PORT في بداية server.js) بدلاً من ذلك. إذا لم تكن هناك فرصة في الجحيم لذلك ، فيرجى إغلاق هذه المشكلة وسأضيف إخلاء مسؤولية في أداتي :)

@ d4rky-pl دعونا نجعل هذا الحق.

ماذا لو وضعنا في القائمة السوداء

  • لن يتم تجميع process.env.RAZZLE_SERVER_
  • و PORT

أنا متأكد من أنك ربما تعرف هذا ، لكن القراءة من process.env. أثناء وقت التشغيل بطيئة للغاية وشيء يجب تجنبه كلما أمكن ذلك. ومع ذلك ، سيكون من الأفضل إذا كان من السهل نشر razzle في heroku وما إلى ذلك ، لذا نعم. دعونا نفهم هذا.

أحب هذا. في حالة PORT ، يجب ألا يكون الأداء مشكلة ، حيث يتم قراءة متغير env هذا فقط أثناء وقت التمهيد.

بالنسبة إلى RAZZLE_SERVER_ ، يبدو وكأنه حل بديل جيد لهاتين الحالتين الإضافيتين ، على الرغم من أنني لست متأكدًا من الاسم - فقد يكون الأمر محيرًا ويؤدي إلى انخفاض الأداء عندما يفترض الناس أن هذه هي الطريقة التي يجب أن تحدد كل شيء متغيرات البيئة من جانب الخادم (بدلاً من تلك التي تريد بالفعل تجاوزها أثناء تمهيد التطبيق). أخشى أنه ليس لدي خيار أفضل رغم ذلك.

عانيت من نفس المشكلة ، يحدث أيضًا مع env vars غير محدد في وقت البناء. هذا هو الحل:

/* eslint-disable no-param-reassign */
const razzleConfigEnv = require('razzle/config/env');

module.exports = {
  modify: (config, { target, dev }, webpack) => {
    // Fix process.env
    if (target === 'node') {
      config.plugins = config.plugins.filter(plugin => plugin.constructor.name !== 'DefinePlugin');
      const dotenv = razzleConfigEnv.getClientEnv(target, {
        clearConsole: true,
        host: 'localhost',
        port: 3000
      });
      config.plugins.push(
        new webpack.DefinePlugin({
          'process.env': `Object.assign(${JSON.stringify(dotenv.raw)}, process.env)`
        })
      );
    }
    return config;
  }
};

هذا هو الحل الخاص بي لـ Heroku:

// getPorts.js

// bypass webpack.DefinePlugin
const { env } = require('process')

export const port = () =>
  parseInt(
    env.RAZZLE_PORT ||
      env.PORT ||
      process.env.RAZZLE_PORT ||
      process.env.PORT ||
      3000,
    10,
  )

أولا! إذن ، هذه هي الصفقة ، بين المصدر المفتوح وعملي اليومي وحياتي وما هو غير ذلك ، لدي الكثير لأديره ، لذلك أستخدم روبوت GitHub لأتمتة بعض الأشياء هنا وهناك. سيقوم برنامج GitHub هذا بتحديد هذا على أنه قديم لأنه لم يكن لديه نشاط حديث لفترة من الوقت. سيتم إغلاقه إذا لم يحدث أي نشاط آخر في غضون أيام قليلة. لا تأخذ هذا على محمل الجد - فهذا إجراء آلي بالكامل. إذا كان هذا خطأ ، فما عليك سوى تقديم تعليق أو إرسال رسالة مباشرة إليّ أو إرسال حامل ناقل أو إشارة دخان.

أغلق ProBot هذا تلقائيًا بسبب عدم النشاط. الصرخة إذا كان هذا خطأ وسنقوم بإعادة فتحه.

لقد وجدت حلاً بسيطًا جدًا لهذه المشكلة ، إذا كان الناس لا يزالون يعانون من ذلك

  // This will extract the env during production execution.. PORT will not be inlined during build
  const getEnv = c => process.env[c];
  app.listen(getEnv('PORT'));

عانيت من نفس المشكلة ، يحدث أيضًا مع env vars غير محدد في وقت البناء. هذا هو الحل:

/* eslint-disable no-param-reassign */
const razzleConfigEnv = require('razzle/config/env');

module.exports = {
  modify: (config, { target, dev }, webpack) => {
    // Fix process.env
    if (target === 'node') {
      config.plugins = config.plugins.filter(plugin => plugin.constructor.name !== 'DefinePlugin');
      const dotenv = razzleConfigEnv.getClientEnv(target, {
        clearConsole: true,
        host: 'localhost',
        port: 3000
      });
      config.plugins.push(
        new webpack.DefinePlugin({
          'process.env': `Object.assign(${JSON.stringify(dotenv.raw)}, process.env)`
        })
      );
    }
    return config;
  }
};

لقد جربت هذا ولكن عندما أحاول "npm run start: prod " على بلدي المحلي ، يظهر لي خطأ يفيد بعدم العثور على أصول .json. أيضًا ، هل يمكن أن تنصحني ، هل أحتاج إلى تحميل node_modules في مجلد الإنشاء وكذلك أحصل على أخطاء متعلقة بحزمة npm أيضًا.

هذا يعمل معي الآن.

"
appConfig.plugins = appConfig.plugins.filter (plugin => plugin.constructor.name! == 'DefinePlugin') ؛
const dotenv = razzleConfigEnv.getClientEnv (الهدف) ،

  delete dotenv.raw.PORT;
  config.plugins.push(
    new webpack.EnvironmentPlugin(dotenv.raw)
  );

"

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

corydeppen picture corydeppen  ·  3تعليقات

howardya picture howardya  ·  5تعليقات

jcblw picture jcblw  ·  4تعليقات

gabimor picture gabimor  ·  3تعليقات

pseudo-su picture pseudo-su  ·  3تعليقات