Razzle: Скомпилированная сборка встроена в переменную среды PORT

Созданный на 21 сент. 2017  ·  13Комментарии  ·  Источник: jaredpalmer/razzle

Из-за того, как написано getClientEnvironment , переменная среды PORT встраивается в окончательную сборку, а не сохраняется как process.env.PORT .

Это приведет к тому, что Razzle не запустится на Heroku с помощью start: prod

Самый полезный комментарий

Я нашел довольно простой способ решения этой проблемы, если люди все еще борются с этим.

  // 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 было легче развернуть на героку и т. Д., Так что да. давайте разберемся с этим.

Мне это нравится. В случае PORT производительность не должна быть проблемой, эта переменная env читается только во время загрузки.

Что касается RAZZLE_SERVER_ , звучит как хороший обходной путь для этой пары дополнительных случаев, хотя я не уверен насчет названия - это может сбивать с толку и приводить к снижению производительности, когда люди предполагают, что именно так вы должны установить все переменные среды на стороне сервера (а не только те, которые вы действительно хотите переопределить во время загрузки приложения). Боюсь, у меня нет лучшего варианта.

У меня была такая же проблема, также происходит с переменными env, не определенными во время сборки. Это обходной путь:

/* 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 будет отмечать это как устаревшее, потому что в последнее время в нем не было активности в последнее время. Он будет закрыт, если в течение нескольких дней не будет никакой активности. Не принимайте это на свой счет - серьезно - это полностью автоматизированное действие. Если это ошибка, просто оставьте комментарий, отправьте мне DM, отправьте курьера или дымовой сигнал.

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, не определенными во время сборки. Это обходной путь:

/* 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 на моем локальном компьютере, я получаю сообщение об ошибке, что assets.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 рейтинги

Смежные вопросы

knipferrc picture knipferrc  ·  5Комментарии

alexjoyner picture alexjoyner  ·  3Комментарии

charlie632 picture charlie632  ·  4Комментарии

JacopKane picture JacopKane  ·  3Комментарии

GouthamKD picture GouthamKD  ·  3Комментарии