Razzle: 컴파일된 λΉŒλ“œ 인라인 PORT ν™˜κ²½ λ³€μˆ˜

에 λ§Œλ“  2017λ…„ 09μ›” 21일  Β·  13μ½”λ©˜νŠΈ  Β·  좜처: jaredpalmer/razzle

getClientEnvironment μž‘μ„± λ°©μ‹μœΌλ‘œ 인해 PORT ν™˜κ²½ λ³€μˆ˜λŠ” process.env.PORT 둜 μœ μ§€λ˜λŠ” λŒ€μ‹  μ΅œμ’… λΉŒλ“œμ— μΈλΌμΈλ©λ‹ˆλ‹€.

이둜 인해 Razzle이 start:prodλ₯Ό μ‚¬μš©ν•˜μ—¬ Herokuμ—μ„œ μ‹œμž‘ ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€ .

stale

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ‚¬λžŒλ“€μ΄ μ—¬μ „νžˆ 어렀움을 κ²ͺκ³  μžˆλ‹€λ©΄ 이 λ¬Έμ œμ— λŒ€ν•œ μ•„μ£Ό κ°„λ‹¨ν•œ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

  // 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λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. :) κΈ°λ³Έ razzle ꡬ성을 ν™•μž₯ν•˜μ—¬ herokuμ—μ„œ μž‘λ™ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
μžμ„Έν•œ λ‚΄μš©μ€ #340을 μ°Έμ‘°ν•˜μ„Έμš”.

@xouabita λ©‹μ§€λ„€μš” κ°μ‚¬ν•©λ‹ˆλ‹€ :)

Razzle이 기본적으둜 이것을 μ§€μ›ν•˜κ±°λ‚˜ process.env 에 λŒ€ν•œ κ²½κ³ κ°€ μžˆμ–΄μ•Ό ν•˜κ³  ν”„λ‘œλ•μ…˜ λΉŒλ“œκ°€ 더 λˆˆμ— 잘 띄어야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

이것은 λ‚΄κ°€ μƒμƒν–ˆλ˜ 것보닀 훨씬 더 λ¬Έμ œκ°€ λ˜λŠ” κ²ƒμœΌλ‘œ 판λͺ…λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€:

μ €λŠ” μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈ λŸ¬λ„ˆ(μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈ: μ‹€μ œ λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ˜λŠ” ν…ŒμŠ€νŠΈ)λ₯Ό μž‘μ„± 쀑이며 첫날뢀터 razzle 지원을 μΆ”κ°€ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” PORTκ°€ κ²°κ³Ό λΉŒλ“œμ—μ„œ 인라인되기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈν•˜κΈ° 전에 λͺ¨λ“  것을 μ»΄νŒŒμΌν•  λ•Œλ„ 인라인해야 ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈμ—μ„œ 인라인된 PORTκ°€ "정상" ν”„λ‘œλ•μ…˜ 컴파일 λ™μ•ˆμ˜ ν¬νŠΈμ™€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λˆ„κ΅°κ°€ λ‹€λ₯Έ 것에 λ™μΌν•œ λΉŒλ“œλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ λΆˆν•„μš”ν•œ ν˜Όλž€μ„ μΌμœΌν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€(κ²°κ΅­ ν”„λ‘œλ•μ…˜ λΉŒλ“œμ΄κ³  PORT μ œμ™Έ). . ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•œ ν›„ λΉŒλ“œλ₯Ό μ‚­μ œν•  μˆ˜λ„ μžˆμ§€λ§Œ ν”„λ‘œλ•μ…˜ 배포 전에 μ‹œμŠ€ν…œ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•œ λ‹€μŒ λ™μΌν•œ 컴파일된 μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 흐름이 μ€‘λ‹¨λ©λ‹ˆλ‹€.

@jaredpalmer ν”„λ‘œλ•μ…˜ λΉŒλ“œμ—μ„œ PORTλ₯Ό μΈλΌμΈν•˜κΈ°λ‘œ ν•œ 결정을 μž¬κ³ ν•˜κ³  const PORT = process.env.PORT 와 같은 것)λ₯Ό μΆ”κ°€ν•˜μ‹­μ‹œμ˜€. 지μ˜₯에 그럴 κΈ°νšŒκ°€ μ—†λ‹€λ©΄ 이 문제λ₯Ό λ‹«μ•„μ£Όμ„Έμš”. 그러면 제 도ꡬ에 λ©΄μ±… 쑰항을 μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€. :)

@d4rky-pl μ œλŒ€λ‘œ λ§Œλ“€μž.

μš°λ¦¬κ°€ λΈ”λž™λ¦¬μŠ€νŠΈμ— 였λ₯΄λŠ” 경우

  • process.env.RAZZLE_SERVER_ λŠ” μ»΄νŒŒμΌλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 및 PORT

당신이 이것을 μ•Œκ³  μžˆλ‹€κ³  ν™•μ‹ ν•˜μ§€λ§Œ λŸ°νƒ€μž„ 쀑에 process.env. μ—μ„œ μ½λŠ” 것은 μ—„μ²­λ‚˜κ²Œ 느리고 κ°€λŠ₯ν•œ ν•œ ν”Όν•΄μ•Ό ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ razzle이 heroku 등에 더 μ‰½κ²Œ 배포 될 수 μžˆλ‹€λ©΄ 더 쒋을 κ²ƒμž…λ‹ˆλ‹€. 이것을 μ•Œμ•„λ‚΄μž.

λ‚˜λŠ” 이것을 μ’‹μ•„ν•œλ‹€. PORT 경우 μ„±λŠ₯에 λ¬Έμ œκ°€ μ—†μ–΄μ•Ό ν•˜λ©° 이 ν™˜κ²½ λ³€μˆ˜λŠ” λΆ€νŒ… μ‹œμ—λ§Œ μ½ν˜€μ§‘λ‹ˆλ‹€.

RAZZLE_SERVER_ 에 κ΄€ν•΄μ„œλŠ” 이름이 ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ λͺ‡ 가지 μΆ”κ°€ κ²½μš°μ— λŒ€ν•œ 쒋은 ν•΄κ²° λ°©λ²•μ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€. μ‚¬λžŒλ“€μ΄ 이것이 λͺ¨λ“  것을 μ„€μ •ν•΄μ•Ό ν•˜λŠ” 방법이라고 κ°€μ •ν•˜λ©΄ ν˜Όλž€μŠ€λŸ½κ³  μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ„œλ²„ μΈ‘ ν™˜κ²½ λ³€μˆ˜(μ‘μš© ν”„λ‘œκ·Έλž¨ λΆ€νŒ… 쀑에 μ‹€μ œλ‘œ μž¬μ •μ˜ν•˜λ €λŠ” λ³€μˆ˜ λŒ€μ‹ ). κ·Έλž˜λ„ 더 λ‚˜μ€ 선택지가 μ—†λŠ” 것 κ°™μ•„ λ‘λ ΅μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆκ³  λΉŒλ“œ νƒ€μž„μ— μ •μ˜λ˜μ§€ μ•Šμ€ env varsμ—μ„œλ„ λ°œμƒν•©λ‹ˆλ‹€. ν•΄κ²° 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

/* 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이 이λ₯Ό μžλ™μœΌλ‘œ λ‹«μ•˜μŠ΅λ‹ˆλ‹€. 이것이 μ‹€μˆ˜λΌλ©΄ Holler, 그리고 μš°λ¦¬λŠ” 그것을 λ‹€μ‹œ μ—΄ κ²ƒμž…λ‹ˆλ‹€.

μ‚¬λžŒλ“€μ΄ μ—¬μ „νžˆ 어렀움을 κ²ͺκ³  μžˆλ‹€λ©΄ 이 λ¬Έμ œμ— λŒ€ν•œ μ•„μ£Ό κ°„λ‹¨ν•œ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

  // 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 varsμ—μ„œλ„ λ°œμƒν•©λ‹ˆλ‹€. ν•΄κ²° 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

/* 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을 찾을 수 μ—†λ‹€λŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ˜ν•œ npm νŒ¨ν‚€μ§€ κ΄€λ ¨ 였λ₯˜λ„ λ°œμƒν•˜κ³  λΉŒλ“œ 폴더에 node_modulesλ₯Ό μ—…λ‘œλ“œν•΄μ•Ό ν•˜λŠ”μ§€ μ‘°μ–Έν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

이것은 μ§€κΈˆ λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

`
appConfig.plugins = appConfig.plugins.filter(ν”ŒλŸ¬κ·ΈμΈ => plugin.constructor.name !== 'DefinePlugin');
const dotenv = razzleConfigEnv.getClientEnv(λŒ€μƒ);

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

`

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

pseudo-su picture pseudo-su  Β·  3μ½”λ©˜νŠΈ

charlie632 picture charlie632  Β·  4μ½”λ©˜νŠΈ

mhuggins picture mhuggins  Β·  3μ½”λ©˜νŠΈ

gabimor picture gabimor  Β·  3μ½”λ©˜νŠΈ

ewolfe picture ewolfe  Β·  4μ½”λ©˜νŠΈ