Razzle: Variabel lingkungan PORT inline build yang dikompilasi

Dibuat pada 21 Sep 2017  ·  13Komentar  ·  Sumber: jaredpalmer/razzle

Karena cara getClientEnvironment ditulis, variabel lingkungan PORT dimasukkan ke dalam build final alih-alih disimpan sebagai process.env.PORT .

Ini akan menyebabkan Razzle gagal diluncurkan di Heroku menggunakan start:prod

stale

Komentar yang paling membantu

Saya menemukan solusi yang cukup sederhana untuk masalah ini, jika orang masih berjuang dengan itu

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

Semua 13 komentar

Saya juga memperhatikan bahwa cara fungsi getClientEnvironment stringified ditulis, seluruh process.env diganti dengan objek sebaris termasuk semua variabel lingkungan:

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

Ini membuat konfigurasi aplikasi server menjadi dinamis tanpa membangunnya kembali setiap saat.

Hai @d4rky-pl,
Anda dapat menggunakan razzle-heroku :) Ini memperluas konfigurasi razzle default untuk membuatnya berfungsi di heroku.
Lihat #340 untuk info lebih lanjut

@xouabita ini bagus, terima kasih :)

Saya merasa bahwa Razzle harus mendukung ini secara default atau memiliki peringatan tentang process.env dan produksi dibangun di tempat yang lebih menonjol.

Ini ternyata lebih bermasalah dari yang saya bayangkan. Mari saya jelaskan:

Saya sedang menulis pelari pengujian sistem (pengujian sistem: pengujian yang berjalan di browser yang sebenarnya) dan saya ingin menambahkan dukungan razzle sejak hari pertama. Masalahnya adalah karena PORT inline dalam build yang dihasilkan, saya juga harus inline ketika mengkompilasi semuanya sebelum pengujian.

Ini dapat menyebabkan kebingungan yang tidak perlu ketika seseorang kemudian mencoba menggunakan build yang sama untuk sesuatu yang lain (ini adalah build produksi, selain PORT tidak ada perubahan) karena PORT sebaris dalam pengujian berbeda dari yang ada selama kompilasi produksi "normal" . Saya juga bisa menjatuhkan build setelah menjalankan tes tetapi itu akan memutus aliran di mana kami melakukan tes sistem sebelum penyebaran produksi dan kemudian menggunakan kembali kode yang dikompilasi yang sama.

@jaredpalmer tolong pertimbangkan kembali keputusan untuk inline PORT dalam pembuatan produksi dan tambahkan pencarian satu kali (seperti const PORT = process.env.PORT di awal server.js) sebagai gantinya. Jika tidak ada kesempatan untuk itu, harap tutup masalah ini dan saya akan menambahkan penafian di alat saya :)

@d4rky-pl mari kita perbaiki ini.

bagaimana jika kita masuk daftar hitam?

  • process.env.RAZZLE_SERVER_ tidak akan dikompilasi
  • dan PORT

Saya yakin Anda mungkin tahu ini, tetapi membaca dari process.env. selama runtime sangat lambat dan sesuatu yang harus dihindari bila memungkinkan. Namun, akan lebih baik jika razzle lebih mudah di-deploy ke heroku dll. jadi ya. mari kita cari tahu ini.

Saya suka ini. Dalam hal PORT kinerja seharusnya tidak menjadi masalah, variabel env ini hanya dibaca selama waktu boot.

Adapun RAZZLE_SERVER_ , terdengar seperti solusi yang baik untuk beberapa kasus tambahan itu, meskipun saya tidak yakin tentang namanya - ini mungkin membingungkan dan menyebabkan penurunan kinerja ketika orang menganggap ini adalah bagaimana Anda harus mengatur semua variabel lingkungan sisi server (bukan hanya yang benar-benar ingin Anda timpa selama boot aplikasi). Saya khawatir saya tidak memiliki pilihan yang lebih baik.

Saya memiliki masalah yang sama, juga terjadi dengan env vars tidak ditentukan saat buildtime. Ini adalah solusinya:

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

Ini adalah solusi saya untuk 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,
  )

Halo! Jadi inilah masalahnya, antara open source dan pekerjaan sehari-hari dan kehidupan saya dan yang tidak, saya memiliki banyak hal untuk dikelola, jadi saya menggunakan bot GitHub untuk mengotomatiskan beberapa hal di sana-sini. Bot GitHub khusus ini akan menandai ini sebagai basi karena tidak memiliki aktivitas baru-baru ini untuk sementara waktu. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi dalam beberapa hari. Jangan menganggap ini pribadi--serius--ini adalah tindakan yang sepenuhnya otomatis. Jika ini kesalahan, cukup beri komentar, DM saya, kirim pidgeon pembawa, atau sinyal asap.

ProBot secara otomatis menutup ini karena tidak aktif. Holler jika ini adalah kesalahan, dan kami akan membukanya kembali.

Saya menemukan solusi yang cukup sederhana untuk masalah ini, jika orang masih berjuang dengan itu

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

Saya memiliki masalah yang sama, juga terjadi dengan env vars tidak ditentukan saat buildtime. Ini adalah solusinya:

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

Saya mencoba ini tetapi ketika saya mencoba 'npm run start:prod ' di lokal saya, saya mendapatkan kesalahan bahwa assets.json tidak ditemukan. Juga, bisakah Anda memberi saran, apakah saya perlu mengunggah node_modules di folder build serta saya juga mendapatkan kesalahan terkait paket npm.

Ini bekerja untuk saya sekarang.

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

`

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

kkarkos picture kkarkos  ·  3Komentar

panbanda picture panbanda  ·  5Komentar

pseudo-su picture pseudo-su  ·  3Komentar

GouthamKD picture GouthamKD  ·  3Komentar

jcblw picture jcblw  ·  4Komentar