Razzle: RFC: process.env.RAZZLE_RUNTIME_XXXX

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

السلوك الحالي

يعاني الأشخاص من كيفية تعامل Razzle مع متغيرات .env (أي تشديدها في _build_ time بواسطة webpack) تمامًا مثل تطبيق create-react-app.

سلوك متوقع

يجب أن يكون لدى Razzle طريقة لتكريم متغيرات وقت التشغيل حتى يتمكن المستخدمون من نشر تطبيقاتهم بسهولة أكبر على Now / Heroku / Azure وما إلى ذلك.

الحل المقترح

اجعل PORT و HOST وأي متغيرات env أخرى مسبوقة بـ RAZZLE_RUNTIME_XXXXXXX متاحة أثناء وقت التشغيل.

قبل

متاح في وقت الترجمة (أي سيتم ترميزه بواسطة webpack)

  • RAZZLE_XXXXXX
  • PORT
  • HOST

بعد، بعدما

متاح في وقت التشغيل

  • PORT
  • HOST
  • RAZZLE_RUNTIME_XXXXXXX

متاح في وقت الترجمة (أي سيتم ترميزه بواسطة webpack)

  • RAZZLE_XXXXXX

مناقشة

هناك بديل آخر وهو _only_ سلاسل متغيرات مسبوقة بـ RAZZLE_XXXX كما يفعل المكون الإضافي razzle-heroku . سيكون هذا أيضًا متوافقًا مع الإصدارات السابقة أيضًا. من ناحية أخرى ، سيسهل هذا العمل مع كيفية تسمية Heroku لمتغيرات بيئة التكوين (على سبيل المثال MONGO_URI ). من ناحية أخرى ، سيكون من السهل جدًا إفساد هذا الخطأ عن طريق الصدفة (على سبيل المثال ، الإشارة إلى متغير وقت التشغيل ضمن رمز مشابه مشترك وهو undefined على العميل ... تفجير التطبيق).

متعلق ب

527 # 526 # 514 # 477 # 356 # 285

discussion

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

jaredpalmer ربما process.env.MY_THING يعمل بشكل جيد ، ولكن لا يزال يتم استبدال process.env.PORT في وقت الإنشاء ولا تتم قراءته في وقت التشغيل. لذا فإن مثال Heroku لا يعمل في الواقع.

لا أرى أي تعامل خاص مع PORT و HOST وما إلى ذلك كما تمت مناقشته في هذا الموضوع.

ال 27 كومينتر

أنا شخصياً لن أقلق كثيرًا بشأن عدم توفر process.env على العميل. يجب أن نعرف بالفعل أن "النافذة" غير متوفرة على الخادم ؛ من المنطقي بالنسبة لي أن يكون لهذه العملية سلوك معاكس. (لا توجد عملية عقدة يجب أن يكون لها حسد ، والمتصفحات لا تكشف متغيرات البيئة التي أعرفها) أعتقد أن process.env كمكان يمكن أن تنتهي فيه أسرار الخادم ، لذلك أفضل أن يكون غير متاح من جانب العميل بشكل افتراضي.

إذا كان الأمر متروكًا لي ، فسيتم تجميع متغيرات process.env.RAZZLE_INLINED_XXXXXX أثناء الإنشاء (ومتاحة على العميل كسلاسل DefinePlugin'd مضمنة) وأي شيء آخر سيكون متاحًا فقط على جانب الخادم.

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

أحب فكرة أن يكون PORT و HOST متغيرًا في وقت التشغيل. قد أقوم بتشغيل نفس أدوات البناء في بيئات مختلفة.

أستطيع أن أؤكد النضال. لم يكن السلوك الحالي هو ما كنت أتوقعه وأوقفني بشكل خاص عند النشر باستخدام up على aws. لقد قمت الآن بتخصيص razzle.config.js بحيث تكون مسبوقة بكل متغيرات razzle المحددة بـ RAZZLE_XXX ويتم ترميزها في وقت الترجمة. الباقي متاح على process.env.XXX . أتفق أيضًا مع gregmartyn حول عدم توفر متغيرات وقت التشغيل من خلال process.env .

أثناء محاولة إعداد Razzle في مشروع React موجود ، واجهنا هذه المشكلة. لا يمكن تجاوز المنفذ في وقت التشغيل ، ولا تتوفر متغيرات process.env الأخرى في الخادم.

السلوك الحالي في وقت البناء:

process.env.PORT
process.env.NODE_ENV;
process.env.ASSETS_MANIFEST;
process.env.HOSTING_SET_VARIABLE;

يصبح على كل من العميل والخادم:

3000;
'development';
'/Users/[...]/build/assets.json';
undefined;

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

إذا كنت تريد أن تكون متوافقًا تمامًا مع الإصدارات السابقة ، فيجب تحويله إلى هذا في وقت الإنشاء (على الخادم ، يمكن للعميل أن يظل كما هو):

process.env.PORT || 3000;
process.env.NODE_ENV || 'development';
process.env.ASSETS_MANIFEST || '/Users/[...]/build/assets.json';
process.env.HOSTING_SET_VARIABLE;

بهذه الطريقة ، يمكنك استخدام process.env.PORT في كل من العميل والخادم. سيكون افتراضيًا إلى 3000.

إذا كان razzle _built_ بـ PORT=80 ، فإن العميل قد تم تحويله process.env.PORT إلى 80 وسيقوم الخادم بتحويله إلى process.env.PORT || 80 . سيؤدي هذا إلى نفس السلوك كما هو الحال الآن.

إذا كان razzle _run_ مع PORT=81 (بينما تم إنشاؤه باستخدام 80 ) ، فسيظل متغير بيئة العملاء 80 بينما سينتج عن متغير الخادم 81 .

يمكن أن يؤدي هذا السلوك بالطبع إلى سلوك غير متوقع ، ولكنه يوفر الاستخدام الأكثر مرونة لـ process.env مع الحفاظ على التوافق الكامل مع الإصدارات السابقة. لا يزال من الممكن الكتابة فوق المنفذ على الخادم في وقت التشغيل ، وستعمل متغيرات البيئة الأخرى التي تم تعيينها بواسطة منصات الاستضافة على الخادم كما هو.

أعتقد أن المشكلة الأساسية هنا هي أن Razzle يحاول حاليًا تجميع وظائف متباينة متعددة في كائن واحد ، وتغيير الوظائف الحالية بشكل أساسي.

إنها تحاول:

  1. حوّل متغيرات process.env إلى ثوابت لأسباب تتعلق بالأداء (انظر مثال التصغير على https://webpack.js.org/plugins/define-plugin/#usage و nodejs البطيء على https://github.com/nodejs/node/issues / 3104)
  2. اجعل هذه الثوابت متاحة لكل من الخادم والعميل بحيث لا تقلق بشأن الكود المتساوي القياس.

مشاكل:

  • process.env هي بيئة _متغيرات_. تحويلها إلى مجموعة ثوابت يغير سلوكها المتوقع.
  • غالبًا ما تحتوي عملية process.env على معلومات حساسة بما في ذلك كلمات المرور ، لذا فهي ليست مصدرًا رائعًا للبيانات لمشاركتها مع العميل. إذا تمت مشاركتها جزئيًا ، ولم تتم مشاركتها جزئيًا ، فيجب أن يعرف المطور أن هذا الشيء الوحيد - process.env - لا يتصرف كما هو محليًا فحسب ، بل أن له أيضًا سلوكًا مختلفًا اعتمادًا على بادئات المفاتيح.
  • يتم تحويلها إلى ثوابت في وقت الإنشاء ، وهو ما يختلف عن سلوك متغيرات البيئة في سياقات أخرى. على سبيل المثال ، يميز Docker بين متغيرات وقت البناء (مفيدة عندما يتطلب البناء نفسه معلومات متغيرة اعتمادًا على مكان تشغيله) ومتغيرات البيئة (مفيدة عند نشر صورة واحدة مسبقة الصنع في بيئات مختلفة). Elastic Beanstalk ، Heroku ، وآخرون. تفعل الشيء نفسه.
  • البادئة المقترحة "RAZZLE_RUNTIME_" لا تشرح نفسها بنفسها. يجب أن يوضح أنه متاح من جانب العميل وأنه ليس متغيرًا. أعتقد أن "INLINED_" تغطي ذلك ، حيث يتم استخدام المضمنة بشكل شائع للإشارة إلى شيء يحدث في وقت الإنشاء. إنها ليست مثالية ("ISOMORPHIC_INLINED_"؟) لكنها تحاول أيضًا أن تكون قصيرة.

أفضّل تقسيم هذه الوظيفة إلى أجزاء مختلفة ، وعدم العبث بـ process.env على الإطلاق.
يمكن لـ DefinePlugin استدعاء ملف مثل razzle.config.js للحصول على ثوابت البناء
نوصي باستخدام نمط مشابه لما يفعله Redux مع configStore (نافذة .__ PRELOADED_STATE__) لتمرير البيانات من الخادم إلى العميل.

للتوافق مع الإصدارات السابقة ، يمكن أن توفر ملاحظات الترقية نموذجًا لـ razzle.config.js يقوم بتعريف الطريقة القديمة.

إضافة واحدة: قلت "لا العبث في process.env إطلاقا". ولكن يمكنني أن أرى وجود استثناء لـ process.env.NODE_ENV لأسباب تتعلق بالأداء من تعليقي أعلاه وأن "NODE_ENV" نفسها قد اتخذت بشكل عام معنى "NODE_ENV = الإنتاج يعني أن هذا بناء محسن"

gregmartyn علينا تعيين NODE_ENV لتحسين الأداء واستخدام الإعداد المسبق بابل لأنه يعمل الآن. كان المنطق الأولي للعبث مع env هو جعل الانتقال من CRA أسهل بكثير حيث يتم إضافة SSR بعد أن بدأ المشروع بالفعل. نستخدم أيضًا CRA في مشاريع أخرى ، لذا فهي تبسط أدوات البناء الخاصة بنا (بشكل طفيف).

نعم؛ وافق على أن NODE_ENV استثناء مفيد. إنه شيء خاص به ومرتبط ارتباطًا وثيقًا بالبناء ، لذلك ليس من المستغرب. لقد تخطيت CRA مباشرة من حل SSR مخصص ، لذا فأنا لست على دراية بكيفية القيام بالأشياء. يبدو أن هذه مشكلة هناك أيضًا: https://github.com/facebook/create-react-app/issues/2353

أعتقد أن هذه مشكلة أكبر لـ Razzle من CRA لأن كود وقت التشغيل في تطبيق CRA لا يعمل على الخادم على الإطلاق. يمكن لـ CRA أن تفعل ما تشاء باستخدام process.env لأنه بقدر ما يتعلق الأمر برمز جانب العميل ، فسيكون فارغًا بخلاف ذلك. من ناحية أخرى ، يبدأ Razzle التعبير عن SSR الخاص به ، ويتوقع هذا الرمز بشكل معقول أن يكون لدى process.env دلالاتها المعتادة مع الوصول إلى مجموعة كاملة من متغيرات بيئة وقت تشغيل العقدة. Process.env له معنى فعلي على الخادم ، لذلك من المؤسف أن CRA استفادته من أجل حالة استخدام مختلفة. كان بإمكانهم استخدام اسم آخر بدلاً من "process.env" مثل "cra.inlines". بدلاً من ذلك ، يتم ضرب الكود المتماثل من خلال قرار تم اتخاذه عند التفكير في جانب العميل فقط.

وتجدر الإشارة باللون الأحمر في كل مكان إلى أن متغيرات البيئة RAZZLE_XXX كلها متاحة للعميل.

كيف يمكنني استخدام متغيرات البيئة الحساسة دون إرسالها إلى العميل؟

لا يتم إرسالها إلى العميل ولا يمكنك الرجوع إليها في رمز متماثل

jaredpalmer ربما هذه المسألة خاصة بـ afterjs إذن؟ أنا أشير إليهم فقط في كود الخادم.

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

لست واضحًا تمامًا بشأن كيفية قيام razzle حاليًا بحقن متغيرات البيئة في العميل والخادم ، ولكنك بالتأكيد لا تريد أشياء خاصة بالخادم على العميل. لسوء الحظ ، هذا نوع من كسر الصفقة بالنسبة لي الآن.

أقوم بإعادة نشر الحل المقترح لتطبيق تفاعل متماثل من https://github.com/jaredpalmer/razzle/issues/477#issuecomment -363538712

المفهوم الرئيسي هو استخدام عنصر نائب في وقت الترجمة يتم إدخاله في وقت التشغيل قبل تنفيذ الخادم مباشرة من أجل تعيين متغيرات بيئة وقت التشغيل بشكل صحيح. هذا الحل مخصص لتشغيل الخادم في حاوية عامل إرساء ولكن يمكن تكييفه على الأرجح مع RFC هذا.

لاحظ أنه في هذا الحل يتم مطابقة متغيرات البيئة RAZZLE_XXXX وحقنها مع HOST و PORT و REDIS_URL.


لقد ناضلت شخصيًا مع هذه المشكلة وقضيت عدة ساعات في اكتشاف حل لهذه المشكلة.

هذا متأصل في تجميع حزم الويب ولا يرتبط بإبهار نفسه.

بعد النظر في كيفية معالجة تطبيق create-react-app لهذا الأمر ، ونقل بعض أكواد جافا سكريبت وياقوت ، عبر مشروعين ، نجحت في نشر تطبيق رد فعل منسق على شكل حرف razzle في حاوية عامل إرساء على heroku باستخدام الحل التالي:

إنف

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

export interface EnvironmentStore {
  NODE_ENV?: string;
  [key: string]: string | undefined;
}

// Capture environment as module variable to allow testing.
let compileTimeEnv: EnvironmentStore;
try {
  compileTimeEnv = process.env as EnvironmentStore;
} catch (error) {
  compileTimeEnv = {};
  // tslint:disable-next-line no-console
  console.log(
    '`process.env` is not defined. ' +
    'Compile-time environment will be empty.'
  );
}

// This template tag should be rendered/replaced with the environment in production.
// Padded to 4KB so that the data can be inserted without offsetting character
// indexes of the bundle (avoids breaking source maps).
/* tslint:disable:max-line-length */
const runtimeEnv = '{{RAZZLE_VARS_AS_BASE64_JSON__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________}}';
/* tslint:enable:max-line-length */

// A function returning the runtime environment, so that
// JSON parsing & errors occur at runtime instead of load time.
export const loadRuntimeEnv = (): EnvironmentStore => {
  let env;
  if (typeof env === 'undefined') {
    if (compileTimeEnv.NODE_ENV === 'production') {
      try {
        env = JSON.parse((Buffer.from(runtimeEnv.trim(), 'base64').toString()));
      } catch (error) {
        env = {};
        const overflowsMessage = runtimeEnv.slice(32, 33) !== null;
        // tslint:disable-next-line no-console
        console.error(
          'Runtime env vars cannot be parsed. Content is `%s`',
          runtimeEnv.slice(0, 31) + (overflowsMessage ? '…' : '')
        );
      }

    } else {
      env = compileTimeEnv;
    }
  }
  return env;
};

export default loadRuntimeEnv;

استعمال:

import { loadRuntimeEnv, EnvironmentStore } from './env';
const env: EnvironmentStore = loadRuntimeEnv();

const serverHost: string =env.RAZZLE_SERVER_HOST || 'localhost';

docker-start.js

يستخدم هذا البرنامج النصي كنقطة إدخال بدلاً من server.js ويستخدم لإدخال {{RAZZLE_VARS_AS_BASE64_JSON ___...}} مع متغيرات بيئة وقت التشغيل الفعلية.

require('newrelic');
const logger = require('heroku-logger');
const path = require('path');
const fs = require('fs');

const PLACEHOLDER = /\{\{RAZZLE_VARS_AS_BASE64_JSON_*?\}\}/;
const MATCHER = /^RAZZLE_/i;

const InjectableEnv = {

    inject: function(file, ...args) {

        const buffer = fs.readFileSync(file, { encoding: 'utf-8' });
        let injectee = buffer.toString();

        const matches = injectee.match(PLACEHOLDER);
        if (!matches) {
            return;
        }

        const placeholderSize = matches[0].length;

        let env = InjectableEnv.create(args);
        const envSize = env.length;
        const newPadding = placeholderSize - envSize;
        if (newPadding < 0) {
            console.log('You need to increase your placeholder size');
            process.exit();
        }
        const padding = Array(newPadding).join(' ');
        env = InjectableEnv.pad(padding, env);

        const injected = injectee.replace(PLACEHOLDER, env);

        fs.writeFileSync(file, injected, { encoding: 'utf-8' });
    },

    create: function() {

        const vars = Object.keys(process.env)
            .filter(key => MATCHER.test(key))
            .reduce((env, key) => {
                env[key] = process.env[key];
                return env;
            }, {});

        vars.NODE_ENV = process.env.NODE_ENV;

        if (typeof process.env.HOST !== 'undefined' && typeof vars.RAZZLE_SERVER_HOST === 'undefined') {
          vars.RAZZLE_SERVER_HOST = process.env.HOST;
        }

        if (typeof process.env.PORT !== 'undefined' && typeof vars.RAZZLE_SERVER_PORT === 'undefined') {
          vars.RAZZLE_SERVER_PORT = process.env.PORT;
        }

        if (typeof process.env.REDIS_URL !== 'undefined' && typeof vars.RAZZLE_REDIS_URL === 'undefined') {
          vars.RAZZLE_REDIS_URL = process.env.REDIS_URL;
        }

        return Buffer.from(JSON.stringify(vars)).toString('base64');
    },

    pad: function(pad, str, padLeft) {
        if (typeof str === 'undefined')
            return pad;
        if (padLeft) {
            return (pad + str).slice(-pad.length);
        } else {
            return (str + pad).substring(0, pad.length);
        }
    }
}

const root = process.cwd();
const serverBundle = path.resolve(path.join(root, '/build/server.js'));

if (fs.existsSync(serverBundle)) {
    logger.info('Injecting runtime env');
    InjectableEnv.inject(serverBundle);
    logger.info('Launching server instance');
    require(serverBundle);
}

ملف Dockerfile

# You should always specify a full version here to ensure all of your developers
# are running the same version of Node.
FROM node:8.9.4

ENV NODE_ENV=production \
    REACT_BUNDLE_PATH=/static/js/vendor.js \
    PATH=/app/node_modules/.bin:$PATH \
    NPM_CONFIG_LOGLEVEL=warn

RUN curl -o- -L https://yarnpkg.com/install.sh | bash

# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json yarn.lock /tmp/
RUN cd /tmp \
  && yarn install --production=false --pure-lockfile \
  && mkdir -p /app \
  && cp -a /tmp/node_modules /app \
  && yarn cache clean \
  && rm -rf *.*

# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /app
ADD . /app

RUN yarn build

EXPOSE 3000

CMD ["node", "docker-start.js"]

يرجى ملاحظة أن معالجة الرسائل الفائضة لم تنته بعد ، لكنني آمل أن يساعد ذلك

مراجع:

Heroku Buildpack لإنشاء التطبيق التفاعلي
الطبقة الداخلية من Heroku Buildpack لإنشاء تطبيق تفاعل

هذا متأصل في تجميع حزم الويب ولا يرتبط بإبهار نفسه.

Razzle هو الذي يقوم بإعداد DefinePlugin. هذا قابل للحل في Razzle.

أعتقد أنني أتابع ما تقوله. أخبرني إذا كنت قد فهمت هذا الخطأ: في وقت الإنشاء ، ضع العناصر النائبة في process.env التي يتم استبدال السلسلة بها عند بدء تشغيل المثيل في بناء الخادم. من المفترض أن تتعامل مع أسرار الخادم. (لا أفهم لماذا لا يمكن تشغيله على بناء العميل أيضًا) المشاكل: لن يعمل مع HMR. إنه اختراق - إنه يقدم حدًا تعسفيًا يصل إلى 4K. في شكله الحالي ، لا يعالج متغيرات البيئة التي يجب مشاركتها مع العميل - تظل هذه ثوابت وقت البناء. إنها خطوة بدء تشغيل إضافية للحاويات.

لإعادة صياغة الكثير مما قلته في https://github.com/jaredpalmer/razzle/issues/528#issuecomment -377058844

أعتقد أن الحل يكمن في إدراك أن Razzle و CRA يحاولان إضافة المزيد من الوظائف إلى process.env أكثر مما ينبغي. لجعله يعمل مع Docker ، نحاول الحصول على كائن واحد به حقول بها واحدة من 4 حالات محتملة: ثابت (وقت البناء) وديناميكي (هنا ، وقت بدء الحاوية) ، أسرار وغير أسرار. يمكننا التوصل إلى بادئات لجميع هذه الحالات الأربع (process.env.STATIC_PRIVATE_X ، process.env.DYNAMIC_PUBLIC_Y ، ...) لكنني أعتقد أننا سنكون أفضل حالًا مع حل أكثر نظافة.

إذا كانت عملية process.env تتصرف بالطريقة التي تعمل بها محليًا - كمخزن لأسرار الخادم - فسيكون فهم الأشياء أسهل كثيرًا. هناك استثناء واحد: NODE_ENV كوقت بناء مضمّن ، لكن هذا جيد لأنه خاصية للبناء. لن يكون من المنطقي تعيين NODE_ENV في وقت التشغيل.

كل ما تبقى هو وسيلة لإيصال البيانات إلى العميل. لا أفهم سبب استخدام هذا process.env على الإطلاق. لماذا لا تستخدم على سبيل المثال razzle.build.X للأشياء الثابتة ، وتمرير الأشياء الديناميكية إلى العميل بنفس طريقة إعادة التشغيل؟

هناك مشكلة أخرى حيث يكون process.env بطيئًا على Node ، ولكن من الأفضل معالجة ذلك باستخدام طبقة ذاكرة التخزين المؤقت التي تقرأ process.env مرة واحدة.

gregmartyn أوافق على أن هذا اختراق ... وهو يقدم حدًا تعسفيًا لـ 4K. تعتمد هذه الفكرة على ما يتم إجراؤه حاليًا مع CRA (انظر المراجع المنشورة) وهي مخصصة لمتغيرات وقت التشغيل في جانب الخادم.

تم فتح ملف علاقات عامة أعتقد أنه يجب أن يساعد في معالجة جذر هذه المشكلة - لا يتوفر env vars على الخادم في وقت التشغيل ، مهتم بمعرفة ما إذا كان هذا يحل بعض المشكلات هنا.

أوافق أيضًا على أن PORT & HOST سيتم أيضًا تركه بمفرده في وقت تجميع الخادم.

تضمين التغريدة هذا تحسن كبير.
بالإضافة إلى PORT و HOST ، سأضيف PUBLIC_PATH إلى قائمة المتغيرات التي لا يجب تجميعها فيها.

ما زلت أجد متغيرات البيئة المخصصة الحساسة يتم تجميعها جميعًا في العميل. أنا أشير إليهم فقط في server.js . هل يعتبر razzle أن هذا متماثل بسبب

مرحبًا بالجميع ، أنا أعالج كل هذا في العمل هذا الأسبوع. ابقوا متابعين. من المرجح أن يتم دمج # 611.

باتباع الدليل الجديد في الملف التمهيدي مع config.js يعمل معي فيما يتعلق بإزالة متغيرات env الحساسة من الحزمة. رائع: د

انظر ملاحظات الإصدار 2

jaredpalmer ربما process.env.MY_THING يعمل بشكل جيد ، ولكن لا يزال يتم استبدال process.env.PORT في وقت الإنشاء ولا تتم قراءته في وقت التشغيل. لذا فإن مثال Heroku لا يعمل في الواقع.

لا أرى أي تعامل خاص مع PORT و HOST وما إلى ذلك كما تمت مناقشته في هذا الموضوع.

لاحظ أن جعل PORT متغيرًا حقيقيًا يتم حظره أيضًا بواسطة # 581. لا بد لي من تصحيح ذلك واستخدام razzle.config.js الذي ينشئ مصفوفة DefinePlugin التي تزيل PORT من أجل تشغيلها. (لكنها تعمل!)

إذا أراد أي شخص استخدام متغيرات .env في وقت التشغيل ، فاستخدم هذه الحزمة الصغيرة.
https://www.npmjs.com/package/razzle-plugin-runtimeenv

هل يمكن لشخص ما أن ينصحك بكيفية نشر تطبيق Razzle على Azure؟ أنا حقا أكافح معها.

إذا أراد أي شخص استخدام متغيرات .env في وقت التشغيل ، فاستخدم هذه الحزمة الصغيرة.
https://www.npmjs.com/package/razzle-plugin-runtimeenv

كيف يعمل؟ هل يمكنك عرض مثال؟

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

أي نهج آخر لا يستخدم متغيرات البيئة حقًا لأنه يحدث فقط أثناء وقت الإنشاء.

كما ذكرت هنا:
https://github.com/HamidTanhaei/razzle-plugin-runtime/issues/1#issuecomment -525731273

يمكنك استخدام ملفات .env و. env.development في وقت التشغيل بمقدار razzle-plugin-runtime . يضيف القدرة على استخدام متغيرات env في تطبيقك في وقت التشغيل.

على سبيل المثال أنا أستخدمه لتكوين axios :
axios.defaults.baseURL = $ {process.env.RAZZLE_APP_API_BASE_PATH} $ {process.env.RAZZLE_APP_API_VERSION} ;
ويمكنك توفير متغيرات إنتاج ENV للإنتاج مثل هذا:
https://github.com/jaredpalmer/razzle#adding - متغيرات بيئة مؤقتة في غلافك

هل يمكن لشخص ما أن ينصحك بكيفية نشر تطبيق Razzle على Azure؟ أنا حقا أكافح معها.

لقد قمت بحل مشكلة Azure Port باستخدام الحل المشترك بواسطة fabianishere على https://github.com/jaredpalmer/razzle/issues/906#issuecomment -467046269

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

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

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

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

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

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

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