Razzle: Kompilierte Build-Inlines-PORT-Umgebungsvariable

Erstellt am 21. Sept. 2017  ·  13Kommentare  ·  Quelle: jaredpalmer/razzle

Aufgrund der Schreibweise von getClientEnvironment wird die Umgebungsvariable PORT in den endgültigen Build integriert, anstatt als process.env.PORT beibehalten zu werden.

Dies führt dazu, dass Razzle auf Heroku mit start:prod . nicht gestartet werden kann

stale

Hilfreichster Kommentar

Ich habe einen ziemlich einfachen Workaround für dieses Problem gefunden, falls die Leute immer noch damit zu kämpfen haben

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

Alle 13 Kommentare

Mir ist auch aufgefallen, dass die getClientEnvironment stringified Funktion geschrieben wird, das gesamte process.env wird durch ein Inline-Objekt einschließlich aller Umgebungsvariablen ersetzt:

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

Dies macht es unmöglich, die Konfiguration der Server-App dynamisch zu machen, ohne sie jedes Mal neu zu erstellen.

Hallo @d4rky-pl,
Sie können razzle-heroku verwenden :) Es erweitert die Standard-Razzle-Konfiguration, damit es auf Heroku funktioniert.
Siehe #340 für weitere Informationen

@xouabita das ist schön, danke :)

Ich bin der Meinung, dass Razzle dies standardmäßig unterstützen sollte oder einen Vorbehalt in Bezug auf process.env und Produktionsaufbau an einem prominenteren Ort haben sollte.

Das stellt sich als noch problematischer heraus, als ich dachte. Lassen Sie mich erklären:

Ich schreibe einen Systemtest-Runner (Systemtests: Tests, die im aktuellen Browser ausgeführt werden) und möchte vom ersten Tag an Razzle-Unterstützung hinzufügen. Das Problem ist, dass, weil PORT im resultierenden Build inline ist, ich es auch beim Kompilieren vor dem Testen inline muss.

Dies kann zu unnötiger Verwirrung führen, wenn jemand versucht, denselben Build für etwas anderes zu verwenden (es ist schließlich der Produktions-Build, außer PORT gibt es keine Änderungen), da der inlined PORT in Tests anders ist als der während der "normalen" Produktionskompilierung . Ich könnte den Build auch nach dem Ausführen von Tests löschen, aber es wird den Fluss unterbrechen, in dem wir Systemtests vor der Produktionsbereitstellung durchführen und dann denselben kompilierten Code wiederverwenden.

@jaredpalmer bitte überdenken Sie die Entscheidung, PORT in den Produktionsbuild zu integrieren, und fügen Sie stattdessen eine einmalige Suche (etwa const PORT = process.env.PORT am Anfang von server.js) hinzu. Wenn es dafür keine Chance gibt, schließe bitte dieses Problem und ich füge einen Haftungsausschluss in mein Tool ein :)

@d4rky-pl lass uns das richtig machen.

Was wäre, wenn wir auf die schwarze Liste gesetzt würden?

  • process.env.RAZZLE_SERVER_ wird nicht kompiliert
  • und PORT

Ich bin sicher, Sie wissen das wahrscheinlich, aber das Lesen von process.env. während der Laufzeit ist unglaublich langsam und sollte nach Möglichkeit vermieden werden. Es wäre jedoch besser, wenn Razzle leichter auf Heroku usw. einsetzbar wäre, also ja. lass uns das herausfinden.

Ich mag das. Bei PORT die Performance kein Problem sein, diese env-Variable wird nur während der Bootzeit gelesen.

Was RAZZLE_SERVER_ angeht, klingt das nach einer guten Problemumgehung für diese paar zusätzlichen Fälle, obwohl ich mir beim Namen nicht sicher bin - es könnte verwirrend sein und zu einer verringerten Leistung führen, wenn die Leute davon ausgehen, dass Sie alle so einstellen sollten serverseitige Umgebungsvariablen (anstelle nur derer, die Sie während des Anwendungsstarts tatsächlich überschreiben möchten). Ich fürchte aber, ich habe keine bessere Option.

Ich hatte das gleiche Problem, passiert auch mit env vars, die zur Buildzeit nicht definiert sind. Dies ist die Problemumgehung:

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

Dies ist mein Workaround für 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,
  )

Hallo! Hier ist also der Deal, zwischen Open Source und meinem täglichen Job und Leben und was nicht, ich habe viel zu verwalten, also verwende ich einen GitHub-Bot, um hier und da ein paar Dinge zu automatisieren. Dieser spezielle GitHub-Bot wird dies als veraltet markieren, da er seit einiger Zeit keine Aktivität mehr hatte. Es wird geschlossen, wenn in einigen Tagen keine Aktivität mehr stattfindet. Nehmen Sie dies nicht persönlich – ernst – dies ist eine vollständig automatisierte Aktion. Wenn dies ein Fehler ist, machen Sie einfach einen Kommentar, senden Sie mir eine DM, senden Sie eine Brieftaube oder ein Rauchzeichen.

ProBot hat dies aufgrund von Inaktivität automatisch geschlossen. Holler, wenn dies ein Fehler ist, und wir werden es wieder öffnen.

Ich habe einen ziemlich einfachen Workaround für dieses Problem gefunden, falls die Leute immer noch damit zu kämpfen haben

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

Ich hatte das gleiche Problem, passiert auch mit env vars, die zur Buildzeit nicht definiert sind. Dies ist die Problemumgehung:

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

Ich habe dies versucht, aber wenn ich 'npm run start:prod ' auf meinem lokalen versuche, erhalte ich eine Fehlermeldung, dass Assets.json nicht gefunden wurde. Könnten Sie bitte auch sagen, ob ich node_modules in den Build-Ordner hochladen muss, da ich auch npm-Paketfehler bekomme.

Das funktioniert jetzt bei mir.

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

`

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

fivethreeo picture fivethreeo  ·  17Kommentare

zjr picture zjr  ·  15Kommentare

elliottjro picture elliottjro  ·  24Kommentare

jaredpalmer picture jaredpalmer  ·  15Kommentare

jaredpalmer picture jaredpalmer  ·  21Kommentare