Razzle: Variável de ambiente PORT compilada em linhas de construção

Criado em 21 set. 2017  ·  13Comentários  ·  Fonte: jaredpalmer/razzle

Devido à forma como getClientEnvironment é escrito, a variável de ambiente PORT está sendo embutida na compilação final em vez de ser mantida como process.env.PORT .

Isso fará com que o Razzle falhe ao iniciar no Heroku usando start: prod

stale

Comentários muito úteis

Eu encontrei uma solução bem simples para esse problema, se as pessoas ainda estão lutando com isso

  // 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 comentários

Também notei que a maneira getClientEnvironment stringified função é escrita, process.env inteiro é substituído por objeto embutido, incluindo todas as variáveis ​​de ambiente:

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

Isso torna impossível tornar a configuração do aplicativo de servidor dinâmica sem reconstruí-la todas as vezes.

Olá @ d4rky-pl,
Você pode usar o razzle-heroku :) Ele estende a configuração padrão do razzle para fazê-lo funcionar no heroku.
Veja # 340 para mais informações

@xouabita isso é bom, obrigado :)

Acho que a Razzle deve oferecer suporte a isso por padrão ou ter uma ressalva sobre process.env e construir a produção em algum lugar mais proeminente.

Isso acaba sendo ainda mais problemático do que eu imaginava. Deixe-me explicar:

Estou escrevendo um executor de testes de sistema (testes de sistema: testes executados no navegador real) e quero adicionar suporte a razzle desde o primeiro dia. O problema é que, como PORT está embutido na construção resultante, eu também tenho que embuti-lo ao compilar tudo antes de testar.

Isso pode causar confusão desnecessária quando alguém tenta usar a mesma compilação para outra coisa (é a compilação de produção, afinal, além do PORT, não há mudanças), pois o PORT embutido nos testes é diferente daquele durante a compilação de produção "normal" . Eu também poderia descartar a compilação depois de executar os testes, mas isso interromperá o fluxo em que fazemos os testes do sistema antes da implantação da produção e, em seguida, reutilizamos o mesmo código compilado.

@jaredpalmer, por favor, reconsidere a decisão de inline PORT no build de produção e adicione lookup único (algo como const PORT = process.env.PORT no início de server.js). Se não houver nenhuma chance para isso, feche este problema e adicionarei um aviso de isenção de responsabilidade em minha ferramenta :)

@ d4rky-pl vamos consertar isso.

e se nós colocarmos na lista negra

  • process.env.RAZZLE_SERVER_ não será compilado
  • e PORT

Tenho certeza de que você provavelmente sabe disso, mas ler process.env. durante a execução é incrivelmente lento e algo que deve ser evitado sempre que possível. No entanto, seria melhor se o razzle fosse mais facilmente implantado no heroku etc. então sim. vamos descobrir isso.

Eu gosto disso. No caso de PORT o desempenho não deve ser um problema, esta variável env só está sendo lida durante o tempo de inicialização.

Quanto a RAZZLE_SERVER_ , soa como uma boa solução alternativa para alguns casos extras, embora eu não tenha certeza sobre o nome - pode ser confuso e levar à diminuição do desempenho quando as pessoas presumem que é assim que você deve definir todos variáveis ​​de ambiente do lado do servidor (em vez de apenas aquelas que você realmente deseja substituir durante a inicialização do aplicativo). Infelizmente, não tenho uma opção melhor.

Eu tive o mesmo problema, também acontece com env vars não definidos no momento da construção. Esta é a solução 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 é minha solução alternativa para o 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! Então aqui está o acordo, entre código aberto e meu trabalho diário e minha vida e tudo mais, eu tenho muito o que gerenciar, então eu uso um bot do GitHub para automatizar algumas coisas aqui e ali. Este bot GitHub em particular vai marcar isso como obsoleto porque não teve atividade recente por um tempo. Ele será fechado se nenhuma outra atividade ocorrer em alguns dias. Não leve isso para o lado pessoal - sério - esta é uma ação totalmente automatizada. Se isso for um erro, apenas comente, mande uma mensagem, mande um pidgeon transportador ou um sinal de fumaça.

ProBot fechou automaticamente devido à inatividade. Holler se isso for um erro, e vamos reabri-lo.

Eu encontrei uma solução bem simples para esse problema, se as pessoas ainda estão lutando com isso

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

Eu tive o mesmo problema, também acontece com env vars não definidos no momento da construção. Esta é a solução 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;
  }
};

Eu tentei isso, mas quando tento 'npm run start: prod ' no meu local, recebo um erro que assets.json não foi encontrado. Além disso, você poderia aconselhar, eu preciso fazer upload de node_modules na pasta de compilação, assim como também recebo erros relacionados ao pacote npm.

Isso está funcionando para mim agora.

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

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

`

Esta página foi útil?
0 / 5 - 0 avaliações