Razzle: Variable de entorno PORT compilada de compilación integrada

Creado en 21 sept. 2017  ·  13Comentarios  ·  Fuente: jaredpalmer/razzle

Debido a cómo se escribe getClientEnvironment , la variable de entorno PORT se inserta en la compilación final en lugar de mantenerse como process.env.PORT .

Esto hará que Razzle no se inicie en Heroku usando start: prod

stale

Comentario más útil

Encontré una solución bastante simple para este problema, si la gente todavía está luchando con él

  // 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'));

Todos 13 comentarios

También he notado que la forma en que se escribe la función getClientEnvironment stringified , se reemplaza todo process.env con un objeto en línea que incluye todas las variables de entorno:

// 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);

Esto hace que sea imposible hacer que la configuración de la aplicación del servidor sea dinámica sin reconstruirla cada vez.

Hola @ d4rky-pl,
Puedes usar razzle-heroku :) Extiende la configuración predeterminada de razzle para que funcione en heroku.
Consulte el n. ° 340 para obtener más información.

@xouabita esto es lindo, gracias :)

Creo que Razzle debería admitir esto de forma predeterminada o tener una advertencia sobre process.env y la construcción de producción en algún lugar más prominente.

Esto resulta ser aún más problemático de lo que imaginaba. Dejame explicar:

Estoy escribiendo un corredor de pruebas del sistema (pruebas del sistema: pruebas que se ejecutan en el navegador real) y quiero agregar soporte de razzle desde el primer día. El problema es que debido a que PORT está integrado en la compilación resultante, también tengo que hacerlo al compilar todo antes de realizar la prueba.

Esto puede causar una confusión innecesaria cuando alguien intenta usar la misma compilación para otra cosa (después de todo, es la compilación de producción, aparte de PORT, no hay cambios) ya que el PORT en línea en las pruebas es diferente al de la compilación de producción "normal". . También podría eliminar la compilación después de ejecutar las pruebas, pero interrumpirá el flujo en el que hacemos las pruebas del sistema antes de la implementación de producción y luego reutilizamos el mismo código compilado.

@jaredpalmer , reconsidere la decisión de incorporar PORT en la compilación de producción y agregue una búsqueda única (algo así como const PORT = process.env.PORT al comienzo de server.js) en su lugar. Si no hay ninguna posibilidad en el infierno para eso, cierre este problema y agregaré un descargo de responsabilidad en mi herramienta :)

@ d4rky-pl hagamos esto bien.

¿Y si estuviéramos en la lista negra?

  • process.env.RAZZLE_SERVER_ no se compilará
  • y PORT

Estoy seguro de que probablemente sepa esto, pero leer desde process.env. durante el tiempo de ejecución es increíblemente lento y algo que debe evitarse siempre que sea posible. Sin embargo, sería mejor si razzle fuera más fácil de implementar en heroku, etc., así que sí. vamos a resolver esto.

Me gusta esto. En el caso de PORT el rendimiento no debería ser un problema, esta variable env solo se lee durante el tiempo de arranque.

En cuanto a RAZZLE_SERVER_ , suena como una buena solución para esos dos casos adicionales, aunque no estoy seguro del nombre; puede ser confuso y conducir a una disminución del rendimiento cuando la gente asume que así es como debe configurar todo variables de entorno del lado del servidor (en lugar de solo aquellas que realmente desea anular durante el inicio de la aplicación). Sin embargo, me temo que no tengo una mejor opción.

Tuve el mismo problema, también sucede con las variables env no definidas en el momento de la compilación. Esta es la solución alternativa:

/* 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;
  }
};

Esta es mi solución para 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,
  )

¡Hola! Así que aquí está el trato, entre el código abierto y mi trabajo diario y mi vida y lo que no, tengo mucho que administrar, así que uso un bot de GitHub para automatizar algunas cosas aquí y allá. Este bot de GitHub en particular lo marcará como obsoleto porque no ha tenido actividad reciente durante un tiempo. Se cerrará si no se realizan más actividades en unos días. No se lo tome personalmente, en serio, es una acción completamente automatizada. Si esto es un error, simplemente haga un comentario, envíeme un mensaje de texto, envíe un pidgeon portador o una señal de humo.

ProBot lo cerró automáticamente debido a la inactividad. Grita si esto es un error y lo volveremos a abrir.

Encontré una solución bastante simple para este problema, si la gente todavía está luchando con él

  // 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'));

Tuve el mismo problema, también sucede con las variables env no definidas en el momento de la compilación. Esta es la solución alternativa:

/* 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;
  }
};

Intenté esto, pero cuando intento 'npm run start: prod ' en mi local, aparece un error que no se encuentra assets.json. Además, ¿podría avisarme si necesito cargar node_modules en la carpeta de compilación y también obtengo errores relacionados con el paquete npm?

Esto está funcionando para mí ahora.

'
appConfig.plugins = appConfig.plugins.filter (plugin => plugin.constructor.name! == 'DefinePlugin');
const dotenv = razzleConfigEnv.getClientEnv (objetivo);

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

'

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ewolfe picture ewolfe  ·  4Comentarios

kkarkos picture kkarkos  ·  3Comentarios

howardya picture howardya  ·  5Comentarios

sebmor picture sebmor  ·  4Comentarios

GouthamKD picture GouthamKD  ·  3Comentarios