人ã
ã¯ãcreate-react-appãšåãããã«ãRazzleã.env
å€æ°ãåŠçããæ¹æ³ïŒã€ãŸããwebpackã«ãã£ãŠ_build_æã«ããããæåååããïŒã«èŠåŽããŠããŸãã
Razzleã«ã¯ãã©ã³ã¿ã€ã å€æ°ãå°éããæ¹æ³ãå¿ èŠã§ããããã«ããããŠãŒã¶ãŒã¯ã¢ããªãNow / Heroku / Azureãªã©ã«ç°¡åã«ãããã€ã§ããŸãã
PORT
ã HOST
ãããã³RAZZLE_RUNTIME_XXXXXXX
å§ãŸããã®ä»ã®ç°å¢å€æ°ãå®è¡æã«äœ¿çšã§ããããã«ããŸãã
ã³ã³ãã€ã«æã«å©çšå¯èœïŒã€ãŸããwebpackã«ãã£ãŠæåååãããŸãïŒ
RAZZLE_XXXXXX
PORT
HOST
å®è¡æã«å©çšå¯èœ
PORT
HOST
RAZZLE_RUNTIME_XXXXXXX
ã³ã³ãã€ã«æã«å©çšå¯èœïŒã€ãŸããwebpackã«ãã£ãŠæåååãããŸãïŒ
RAZZLE_XXXXXX
ãã1ã€ã®æ¹æ³ã¯ã razzle-herokuãã©ã°ã€ã³ã®ããã«ãæ¥é èŸRAZZLE_XXXX
å€æ°ã_only_æåååããããšã§ãã ãããäžäœäºææ§ããããŸãã äžæ¹ã§ã¯ãããã«ãããHerokuãæ§æç°å¢å€æ°ã«ååãä»ããæ¹æ³ïŒ MONGO_URI
ïŒãç°¡åã«æäœã§ããããã«ãªããŸãã äžæ¹ãããã¯å¶ç¶ã«æ··ä¹±ããã®ã¯ç°¡åãããŸãïŒã€ãŸããã¯ã©ã€ã¢ã³ãäžã§undefined
ã§ããå
±æå圢ã³ãŒãå
ã®ã©ã³ã¿ã€ã å€æ°ãåç
§ããŸã...ã¢ããªã±ãŒã·ã§ã³ãççºãããŸãïŒã
ç§ã¯å人çã«ãprocess.envãã¯ã©ã€ã¢ã³ãã§å©çšã§ããªãããšã«ã€ããŠããŸãå¿é ããŸããã 'window'ããµãŒããŒã§äœ¿çšã§ããªãããšããã§ã«ç¥ã£ãŠããå¿ èŠããããŸãã process.envã®åäœãéã«ãªãããšã¯ç§ã«ã¯çã«ããªã£ãŠããŸãã ïŒenvãæã€ããŒãããã»ã¹ã¯ãªãããã©ãŠã¶ãŒã¯ç§ãç¥ã£ãŠããenvå€æ°ãå ¬éããŸããïŒç§ã¯process.envããµãŒããŒã·ãŒã¯ã¬ãããçµããå¯èœæ§ã®ããå Žæã ãšèããŠããã®ã§ããããããã ã£ããšæããŸãããã©ã«ãã§ã¯ãã¯ã©ã€ã¢ã³ãåŽã§ã¯äœ¿çšã§ããŸããã
ãããç§æ¬¡ç¬¬ã ã£ãå Žåãprocess.env.RAZZLE_INLINED_XXXXXXå€æ°ã¯ãã«ãäžã«ã³ã³ãã€ã«ããïŒãããŠã¯ã©ã€ã¢ã³ãã§ã¯ã€ã³ã©ã€ã³DefinePluginã®æååãšããŠå©çšå¯èœïŒããã以å€ã®ãã®ã¯ãµãŒããŒåŽã§ã®ã¿å©çšå¯èœã«ãªããŸãã
NODE_ENVã¯ãã³ãŒããå®è¡ãããŠããç°å¢ã®ãããªå€æ°ã§ã¯ãªãããã«ãã®èª¬æãšããŠäž»ã«äœ¿çšããããããã€ã³ã©ã€ã³åããããšãã§ããŸãããããè¡ãã«ã¯ãããã©ãŒãã³ã¹äžã®çç±ãããã€ããããŸãã
PORTãšHOSTãå®è¡æã«å¯å€ã§ãããšããèãã奜ãã§ãã ç°ãªãç°å¢ã§åããã«ãã¢ãŒãã£ãã¡ã¯ããå®è¡ããŠããå¯èœæ§ããããŸãã
éäºã確èªããããšãã§ããŸãã çŸåšã®åäœã¯ç§ãæåŸ
ãããã®ã§ã¯ãªããç¹ã«awsã«up
ããŠãããã€ãããšãã«ç§ãã€ãŸããããŸããã razzle.config.js
ã«ã¹ã¿ãã€ãºããŠããã¹ãŠã®razzleåºæã®å€æ°ã®åã«RAZZLE_XXX
ãä»ããã³ã³ãã€ã«æã«ããããæåååããããã«ããŸããã æ®ãã¯process.env.XXX
å©çšã§ããŸããã process.env
ä»ããŠã©ã³ã¿ã€ã å€æ°ã䜿çšã§ããªãããšã«ã€ããŠã@gregmartynã«åæããŸãã
æ¢åã®Reactãããžã§ã¯ãã§Razzleãã»ããã¢ããããããšãããšãã«ããã®åé¡ã«çŽé¢ããŸããã ããŒãã¯å®è¡æã«ãªãŒããŒã©ã€ãã§ãããä»ã®process.envå€æ°ã¯ãµãŒããŒã§äœ¿çšã§ããŸããã
ãã«ãæã®çŸåšã®åäœïŒ
process.env.PORT
process.env.NODE_ENV;
process.env.ASSETS_MANIFEST;
process.env.HOSTING_SET_VARIABLE;
ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã«ãªããŸãïŒ
3000;
'development';
'/Users/[...]/build/assets.json';
undefined;
ããã«ãããã¯ã©ã€ã¢ã³ããšãµãŒããŒããŸã£ããåãããã»ã¹ç°å¢ã䜿çšã§ããããã«ãªããŸãããå®è¡æã«ãªãŒããŒã©ã€ãããããä»ã®ç°å¢å€æ°ã䜿çšãããããããšã¯ã§ããªããªããŸãã
å®å šãªäžäœäºææ§ãå¿ èŠãªå Žåã¯ããã«ãæã«ããã«ãã©ã³ã¹ãã€ã«ããå¿ èŠããããŸãïŒãµãŒããŒäžã§ã¯ãã¯ã©ã€ã¢ã³ãã¯åããŸãŸã§ããŸããŸããïŒã
process.env.PORT || 3000;
process.env.NODE_ENV || 'development';
process.env.ASSETS_MANIFEST || '/Users/[...]/build/assets.json';
process.env.HOSTING_SET_VARIABLE;
ãã®ããã«ããŠãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§process.env.PORTã䜿çšã§ããŸãã ããã©ã«ãã¯3000ã«ãªããŸãã
razzleãPORT=80
ã§_built_ã®å Žåãã¯ã©ã€ã¢ã³ãã¯process.env.PORT
ã80
ã«ãã©ã³ã¹ãã€ã«ãããµãŒããŒã¯ãããprocess.env.PORT || 80
ã«ãã©ã³ã¹ãã€ã«ããŸãã ããã«ãããçŸåšãšåãåäœã«ãªããŸãã
razzleãPORT=81
_run_ã®å ŽåïŒ 80
ãã«ããããŠããéïŒãã¯ã©ã€ã¢ã³ãç°å¢å€æ°ã¯80
ãŸãŸã§ããããµãŒããŒå€æ°ã¯81
ãŸãã
ãã¡ããããã®åäœã¯äºæããªãåäœã«ã€ãªããå¯èœæ§ããããŸãããå®å šãªäžäœäºææ§ãç¶æããªãããprocess.envã®æãæè»ãªäœ¿çšæ³ãæäŸããŸãã ããŒãã¯å®è¡æã«ãµãŒããŒäžã§åŒãç¶ãäžæžãã§ãããã¹ãã£ã³ã°ãã©ãããã©ãŒã ã«ãã£ãŠèšå®ãããä»ã®ç°å¢å€æ°ã¯ãµãŒããŒäžã§ãã®ãŸãŸæ©èœããŸãã
ããã§ã®æ ¹æ¬çãªåé¡ã¯ãRazzleãçŸåšãè€æ°ã®ç°ãªãæ©èœã1ã€ã®ãªããžã§ã¯ãã«ããã¯ããæ¢åã®æ©èœãæ ¹æ¬çã«å€æŽããããšããŠããããšã ãšæããŸãã
ããã¯ããããšããŠããïŒ
åé¡ïŒ
ç§ã®å¥œã¿ã¯ããã®æ©èœãããŸããŸãªéšåã«åå²ããprocess.envããŸã£ããæ¹ããããªãããšã§ãã
DefinePluginã¯ãrazzle.config.jsã®ãããªãã¡ã€ã«ãåŒã³åºããŠããã«ãå®æ°ãååŸã§ããŸãã
ReduxãconfigureStoreïŒwindow .__ PRELOADED_STATE__ïŒã§è¡ãã®ãšåæ§ã®ãã¿ãŒã³ã䜿çšããŠããµãŒããŒããã¯ã©ã€ã¢ã³ãã«ããŒã¿ãæž¡ãããšããå§ãããŸãã
äžäœäºææ§ã®ããã«ãã¢ããã°ã¬ãŒãããŒãã¯æãªããã®æ¹æ³ãå®çŸ©ãããµã³ãã«razzle.config.jsãæäŸããããšãã§ããŸãã
è£éºã®1ã€ïŒãprocess.envããŸã£ããæ¹ããããªãããã«ããšèšããŸããã ããããäžèšã®ã³ã¡ã³ããããããã©ãŒãã³ã¹äžã®çç±ããprocess.env.NODE_ENVã«äŸå€ãããããNODE_ENVãèªäœãäžè¬çã«ãNODE_ENV =æ¬çªç°å¢ã¯ãããæé©åããããã«ãã§ããããšãæå³ããããšããæå³ã垯ã³ãŠããããšãããããŸããã
@gregmartynããã©ãŒãã³ã¹ãæé©åããããã«NODE_ENVãèšå®ããçŸåšæ©èœããŠããbabelããªã»ããã䜿çšããå¿ èŠããããŸãã envããããæåã®çç±ã¯ããããžã§ã¯ãããã§ã«éå§ãããåŸã«SSRãè¿œå ãããããšãå€ããããCRAããã®ç§»è¡ãã¯ããã«ç°¡åã«ããããšã§ããã ä»ã®ãããžã§ã¯ãã§ãCRAã䜿çšããŠããããããã«ãããŒã«ãïŒãããã«ïŒç°¡çŽ åãããŸãã
ãã; NODE_ENVãæçšãªäŸå€ã§ããããšã«åæããŸããã ããã¯ããèªäœã®ãã®ã§ããããã«ããšå¯æ¥ã«é¢é£ããŠããã®ã§ãé©ãããšã§ã¯ãããŸããã ã«ã¹ã¿ã SSRãœãªã¥ãŒã·ã§ã³ããCRAãã¹ãããããã®ã§ãCRAãã©ã®ããã«åäœãããã«ã€ããŠã¯ããããããŸããã ããããã¡ãã®åé¡ã®ããã§ãïŒ https ïŒ
CRAã¢ããªã®ã©ã³ã¿ã€ã ã³ãŒãã¯ãµãŒããŒäžã§ãŸã£ããå®è¡ãããªããããããã¯CRAãããRazzleã«ãšã£ãŠå€§ããªåé¡ã ãšæããŸãã CRAã¯ãã¯ã©ã€ã¢ã³ãåŽã®ã³ãŒãã«é¢ããéãããã以å€ã®å Žåã¯ç©ºã«ãªããããprocess.envã䜿çšããŠå¿ èŠãªåŠçãå®è¡ã§ããŸãã äžæ¹ãRazzleã¯SSRã®Expressãéå§ãããã®ã³ãŒãã¯ãprocess.envãããŒãã©ã³ã¿ã€ã ç°å¢å€æ°ã®ãã«ã»ããã«ã¢ã¯ã»ã¹ã§ããéåžžã®ã»ãã³ãã£ã¯ã¹ãæã£ãŠããããšãåççã«æåŸ ããŸãã Process.envã¯ãµãŒããŒäžã§å®éã®æå³ãæã£ãŠãããããCRAãå¥ã®ãŠãŒã¹ã±ãŒã¹ã«ãããæ¡çšããã®ã¯æ®å¿µã§ãã ãcra.inlinesãã®ãããªãprocess.envãã®ä»£ããã«ä»ã®ååã䜿çšããããšãã§ããŸãã 代ããã«ãå圢ã³ãŒãã¯ãã¯ã©ã€ã¢ã³ãåŽã®ã¿ãèæ ®ããå Žåã«è¡ããã決å®ã«èŠèãããŸãã
RAZZLE_XXXç°å¢å€æ°ã¯ãã¹ãŠã¯ã©ã€ã¢ã³ãã§äœ¿çšå¯èœã«ãªã£ãŠããããšã«æ³šæããŠãã ããã
ã¯ã©ã€ã¢ã³ãã«éä¿¡ããã«æ©å¯æ§ã®é«ãç°å¢å€æ°ã䜿çšããã«ã¯ã©ãããã°ããã§ããïŒ
å圢ã³ãŒãã§åç §ããªãéããã¯ã©ã€ã¢ã³ãã«ã¯éä¿¡ãããŸããã
@jaredpalmerããããããã®åé¡ã¯afterjsã«åºæã®ãã®ã§ããïŒ ç§ã¯ãµãŒããŒã³ãŒãã§ããããåç §ããŠããã ãã§ãã
RAZZLE
ãã¬ãã£ãã¯ã¹ãªãã§ç°å¢å€æ°ãå®çŸ©ããæ©èœãžã®æ祚ãè¿œå ããããšæããŸãã å°ãªããšãããµãŒããŒåŽã§process.env
ãæ¶å»ããªãã§ãã ãããããã«ããã dotenv
ã䜿çšããŠãµãŒããŒåŽã®ç°å¢å€æ°ãèªã¿èŸŒãããšãã§ããªããªããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ç°å¢ã«ã€ããŠè¡ãã«ã¯ããŸãã«ãç
©ãããä»®å®ã®ããã§ãã
razzleãçŸåšã©ã®ããã«ç°å¢å€æ°ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã«æ³šå ¥ããŠãããã«ã€ããŠã¯ããããããŸããããã¯ã©ã€ã¢ã³ãã«ãµãŒããŒåºæã®ãã®ã¯å¿ èŠãªãã§ãããã æ®å¿µãªãããããã¯ç§ã«ãšã£ãŠä»ã®ãšããäžçš®ã®ååŒç Žãã§ãã
å圢åå¿ã¢ããªã®ææ¡ããããœãªã¥ãŒã·ã§ã³ãhttps://github.com/jaredpalmer/razzle/issues/477#issuecomment-363538712ããåæçš¿ããŠã
äž»ãªæŠå¿µã¯ãã©ã³ã¿ã€ã ç°å¢å€æ°ãé©åã«èšå®ããããã«ããµãŒããŒå®è¡ã®çŽåã«å®è¡æã«æ¿å ¥ãããã³ã³ãã€ã«æã«ãã¬ãŒã¹ãã«ããŒã䜿çšããããšã§ãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãDockerã³ã³ãããŒã§ãµãŒããŒãå®è¡ããããã®ãã®ã§ããããããããã®RFCã«é©åãããããšãã§ããŸãã
ãã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãRAZZLE_XXXXç°å¢å€æ°ãäžèŽããHOSTãPORTãããã³REDIS_URLãšãšãã«æ¿å ¥ãããããšã«æ³šæããŠãã ããã
ç§ã¯å人çã«ãã®åé¡ã«èŠåŽããŠããããã®åé¡ã®è§£æ±ºçãèŠã€ããããã«æ°æéãè²»ãããŠããŸãã
ããã¯webpackã®ã³ã³ãã€ã«ã«åºæã®ãã®ã§ãããããèªäœãé©ãããããšãšã¯é¢ä¿ãããŸããã
create-react-appããããã©ã®ããã«åŠçãããã調ã¹ã2ã€ã®ãããžã§ã¯ãéã§javascriptãšrubyã³ãŒãã移æ€ããåŸã次ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠãrazzletypescriptåå¿ã¢ããªãherokuã®Dockerã³ã³ãããŒã«æ£åžžã«ãããã€ããŸããã
ãã®ã¹ã¯ãªããã¯ãã©ã³ã¿ã€ã ç°å¢ãåŠçããããã®ã¢ãžã¥ãŒã«ãšããŠäœ¿çšãããŸãã
export interface EnvironmentStore {
NODE_ENV?: string;
[key: string]: string | undefined;
}
// Capture environment as module variable to allow testing.
let compileTimeEnv: EnvironmentStore;
try {
compileTimeEnv = process.env as EnvironmentStore;
} catch (error) {
compileTimeEnv = {};
// tslint:disable-next-line no-console
console.log(
'`process.env` is not defined. ' +
'Compile-time environment will be empty.'
);
}
// This template tag should be rendered/replaced with the environment in production.
// Padded to 4KB so that the data can be inserted without offsetting character
// indexes of the bundle (avoids breaking source maps).
/* tslint:disable:max-line-length */
const runtimeEnv = '{{RAZZLE_VARS_AS_BASE64_JSON__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________}}';
/* tslint:enable:max-line-length */
// A function returning the runtime environment, so that
// JSON parsing & errors occur at runtime instead of load time.
export const loadRuntimeEnv = (): EnvironmentStore => {
let env;
if (typeof env === 'undefined') {
if (compileTimeEnv.NODE_ENV === 'production') {
try {
env = JSON.parse((Buffer.from(runtimeEnv.trim(), 'base64').toString()));
} catch (error) {
env = {};
const overflowsMessage = runtimeEnv.slice(32, 33) !== null;
// tslint:disable-next-line no-console
console.error(
'Runtime env vars cannot be parsed. Content is `%s`',
runtimeEnv.slice(0, 31) + (overflowsMessage ? 'âŠ' : '')
);
}
} else {
env = compileTimeEnv;
}
}
return env;
};
export default loadRuntimeEnv;
å©çšæ¹æ³ïŒ
import { loadRuntimeEnv, EnvironmentStore } from './env';
const env: EnvironmentStore = loadRuntimeEnv();
const serverHost: string =env.RAZZLE_SERVER_HOST || 'localhost';
ãã®ã¹ã¯ãªããã¯ãserver.jsã®ä»£ããã«ãšã³ããªãã€ã³ããšããŠäœ¿çšããã{{RAZZLE_VARS_AS_BASE64_JSON ___...}}ãã¬ãŒã¹ããŒããŒã«å®éã®ã©ã³ã¿ã€ã ç°å¢å€æ°ãæ¿å ¥ããããã«äœ¿çšãããŸãã
require('newrelic');
const logger = require('heroku-logger');
const path = require('path');
const fs = require('fs');
const PLACEHOLDER = /\{\{RAZZLE_VARS_AS_BASE64_JSON_*?\}\}/;
const MATCHER = /^RAZZLE_/i;
const InjectableEnv = {
inject: function(file, ...args) {
const buffer = fs.readFileSync(file, { encoding: 'utf-8' });
let injectee = buffer.toString();
const matches = injectee.match(PLACEHOLDER);
if (!matches) {
return;
}
const placeholderSize = matches[0].length;
let env = InjectableEnv.create(args);
const envSize = env.length;
const newPadding = placeholderSize - envSize;
if (newPadding < 0) {
console.log('You need to increase your placeholder size');
process.exit();
}
const padding = Array(newPadding).join(' ');
env = InjectableEnv.pad(padding, env);
const injected = injectee.replace(PLACEHOLDER, env);
fs.writeFileSync(file, injected, { encoding: 'utf-8' });
},
create: function() {
const vars = Object.keys(process.env)
.filter(key => MATCHER.test(key))
.reduce((env, key) => {
env[key] = process.env[key];
return env;
}, {});
vars.NODE_ENV = process.env.NODE_ENV;
if (typeof process.env.HOST !== 'undefined' && typeof vars.RAZZLE_SERVER_HOST === 'undefined') {
vars.RAZZLE_SERVER_HOST = process.env.HOST;
}
if (typeof process.env.PORT !== 'undefined' && typeof vars.RAZZLE_SERVER_PORT === 'undefined') {
vars.RAZZLE_SERVER_PORT = process.env.PORT;
}
if (typeof process.env.REDIS_URL !== 'undefined' && typeof vars.RAZZLE_REDIS_URL === 'undefined') {
vars.RAZZLE_REDIS_URL = process.env.REDIS_URL;
}
return Buffer.from(JSON.stringify(vars)).toString('base64');
},
pad: function(pad, str, padLeft) {
if (typeof str === 'undefined')
return pad;
if (padLeft) {
return (pad + str).slice(-pad.length);
} else {
return (str + pad).substring(0, pad.length);
}
}
}
const root = process.cwd();
const serverBundle = path.resolve(path.join(root, '/build/server.js'));
if (fs.existsSync(serverBundle)) {
logger.info('Injecting runtime env');
InjectableEnv.inject(serverBundle);
logger.info('Launching server instance');
require(serverBundle);
}
# You should always specify a full version here to ensure all of your developers
# are running the same version of Node.
FROM node:8.9.4
ENV NODE_ENV=production \
REACT_BUNDLE_PATH=/static/js/vendor.js \
PATH=/app/node_modules/.bin:$PATH \
NPM_CONFIG_LOGLEVEL=warn
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json yarn.lock /tmp/
RUN cd /tmp \
&& yarn install --production=false --pure-lockfile \
&& mkdir -p /app \
&& cp -a /tmp/node_modules /app \
&& yarn cache clean \
&& rm -rf *.*
# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /app
ADD . /app
RUN yarn build
EXPOSE 3000
CMD ["node", "docker-start.js"]
ãªãŒããŒãããŒã¡ãã»ãŒãžã®åŠçã¯çµäºããŠããŸãããããããã圹ã«ç«ãŠã°å¹žãã§ãã
create-react-appçšã®Herokuãã«ãããã¯
create-react-appçšã®HerokuBuildpackã®å
éšã¬ã€ã€ãŒ
ããã¯webpackã®ã³ã³ãã€ã«ã«åºæã®ãã®ã§ãããããèªäœãé©ãããããšãšã¯é¢ä¿ãããŸããã
Razzleã¯DefinePluginãèšå®ãããã®ã§ãã ããã¯Razzleã§è§£æ±ºã§ããŸãã
ç§ã¯ããªãã®èšã£ãŠããããšã«åŸããšæããŸãã ãããééã£ãŠãããã©ããæããŠãã ããïŒãã«ãæã«ããµãŒããŒãã«ãã®ã€ã³ã¹ã¿ã³ã¹ã®èµ·åæã«æååã眮ãæãããããã¬ãŒã¹ãã«ããŒãprocess.envã«é 眮ããŸãã ãµãŒããŒã·ãŒã¯ã¬ãããåŠçããããã®ãã®ã§ãã ïŒã¯ã©ã€ã¢ã³ããã«ãã§ãå®è¡ã§ããªãã£ãçç±ã¯ããããŸãããïŒåé¡ïŒHMRã§ã¯æ©èœããŸããã ããã¯ããã¯ã§ã-ä»»æã®4kå¢çãå°å ¥ããŸãã çŸåšã®åœ¢åŒã§ã¯ãã¯ã©ã€ã¢ã³ããšå ±æããå¿ èŠã®ããenvå€æ°ã«ã¯å¯Ÿå¿ããŠããŸããããããã¯ãã«ãæå®æ°ã®ãŸãŸã§ãã ããã¯ãã³ã³ãããŒã®è¿œå ã®èµ·åã¹ãããã§ãã
https://github.com/jaredpalmer/razzle/issues/528#issuecomment-377058844ã§ç§ãèšã£ãããšã®å€ããåããã·ã¥ããã«ã¯
解決çã¯ãRazzleãšCRAãæ¬æ¥ããã¹ããããå€ãã®æ©èœãprocess.envã«è©°ã蟌ãããšããŠããããšãèªèããããšã ãšæããŸãã Dockerã§åäœãããããã«ãéçïŒãã«ãæéïŒãšåçïŒããã§ã¯ãã³ã³ãããŒã®éå§æéïŒãã·ãŒã¯ã¬ãããšéã·ãŒã¯ã¬ããã®4ã€ã®å¯èœãªç¶æ ã®ãããããæã€ãã£ãŒã«ããæã€1ã€ã®ãªããžã§ã¯ããäœæããããšããŠããŸãã ãããã®4ã€ã®ç¶æ ãã¹ãŠïŒprocess.env.STATIC_PRIVATE_Xãprocess.env.DYNAMIC_PUBLIC_Yã...ïŒã®ãã¬ãã£ãã¯ã¹ãæãä»ãããšãã§ããŸãããããã¯ãªãŒã³ãªãœãªã¥ãŒã·ã§ã³ã䜿çšããæ¹ãã¯ããã«è¯ããšæããŸãã
process.envããã€ãã£ãã®ããã«ïŒãµãŒããŒã·ãŒã¯ã¬ããã®ã¹ãã¢ãšããŠïŒåäœããå Žåãç©äºã¯ã¯ããã«ç解ãããããªããŸãã äŸå€ã1ã€ãããŸãããã«ãæã®ã€ã³ã©ã€ã³ãšããŠã®NODE_ENVã§ããããã«ãã®ããããã£ã§ãããããããã§åé¡ãããŸããã å®è¡æã«NODE_ENVãèšå®ããŠãæå³ããããŸããã
æ®ã£ãŠããã®ã¯ãã¯ã©ã€ã¢ã³ãã«ããŒã¿ãååŸããæ¹æ³ã ãã§ãã ãªããããprocess.envã䜿çšããŠããã®ããŸã£ããããããŸããã éçãªãã®ã«ããšãã°razzle.build.Xã䜿çšããŠãreduxãšåãããã«åçãªãã®ãã¯ã©ã€ã¢ã³ãã«æž¡ããŠã¿ãŸãããïŒ
Nodeã§process.envãé ããšããå¥ã®åé¡ããããŸãããããã¯process.envã1åèªã¿åããã£ãã·ã¥ã¬ã€ã€ãŒã§å¯ŸåŠããã®ãæé©ã§ãã
@gregmartynããã¯ããã¯ã§ããããšã«åæããŸã...ãããŠããã¯ä»»æã®4Kå¢çãå°å ¥ããŸãã ãã®ã¢ã€ãã¢ã¯ãçŸåšCRAã§è¡ãããŠããããšïŒæçš¿ããããªãã¡ã¬ã³ã¹ãåç §ïŒã«åºã¥ããŠããããµãŒããŒåŽã®ã©ã³ã¿ã€ã ç°å¢å€æ°ã察象ãšããŠããŸãã
ãã®åé¡ã®ãã®æ ¹æºã«åœ¹ç«ã€ãšç§ãä¿¡ããPRã
ãŸãã PORT
ãšHOST
ãããµãŒããŒã®ã³ã³ãã€ã«æã«ãã®ãŸãŸã«ããŠããã®ãçæ³çã§ããããšã«åæããŸãã
@tgriesserãããïŒ ããã¯å€§ããªæ¹åã§ãã
PORT
ãšHOST
ã«å ããŠãã³ã³ãã€ã«ããªãå€æ°ã®ãªã¹ãã«PUBLIC_PATH
ãè¿œå ããŸãã
ç§ã¯ãŸã ææãªã«ã¹ã¿ã ç°å¢å€æ°ããã¹ãŠã¯ã©ã€ã¢ã³ãã«ã³ã³ãã€ã«ãããŠããã®ãèŠã€ããŠããŸãã server.jsã§ã®ã¿åç §ããŠããããããŒããŒã®ããã«ãã®ååãèæ ®ããŸããïŒ ããããã¯ã©ã€ã¢ã³ãã«å°éããã®ãé²ãã«ã¯ã©ãããã°ããã§ããã
ã¿ãªãããä»é±ã¯ä»äºã§ããããã¹ãŠã«åãçµãã§ããŸãã ä¹ããæåŸ ã ïŒ611ã¯ããŒãžãããå¯èœæ§ããããŸãã
config.jsã䜿çšããreadmeã®æ°ããã¬ã€ãã«åŸãããšã§ããã³ãã«ããæ©å¯æ§ã®é«ãç°å¢å€æ°ãåé€ããããšãã§ããŸããã çŽ æŽãããïŒD
v2ããŒããåç §ããŠãã ãã
@jaredpalmeräœãã足ããªããããããŸããããreadmeã®ããã¥ã¡ã³ãã«ç€ºãããŠããããšã«ãããããããããã¯PORTãªã©ã®åé¡ã§ãã process.env.MY_THING
ã¯æ£åžžã«æ©èœããŸããã process.env.PORT
ã¯ãã«ãæã«çœ®ãæããããå®è¡æã«èªã¿åãããŸããã ãããã£ãŠãHerokuã®äŸã¯å®éã«ã¯æ©èœããŸããã
ãã®ã¹ã¬ããã§èª¬æãããŠããããã«ãPORTãHOSTãªã©ã®ç¹å¥ãªåŠçã¯èŠãããŸããã
PORTãå®å€æ°ã«ããããšãïŒ581ã«ãã£ãŠãããã¯ãããããšã«æ³šæããŠãã ããã ããããããããŠãPORTãæ©èœãããããã«PORTãåé€ããDefinePluginé åãäœæããrazzle.config.jsã䜿çšããå¿ èŠããããŸãã ïŒããããããã¯æ©èœããŸãïŒïŒ
å®è¡æã«.envå€æ°ã䜿çšãããå Žåã¯ããã®å°ããªããã±ãŒãžã䜿çšããŠãã ããã
https://www.npmjs.com/package/razzle-plugin-runtimeenv
誰ããAzureã«Razzleã¢ããªããããã€ããæ¹æ³ãã¢ããã€ã¹ã§ããŸããïŒ æ¬åœã«èŠåŽããŠããŸãã
å®è¡æã«.envå€æ°ã䜿çšãããå Žåã¯ããã®å°ããªããã±ãŒãžã䜿çšããŠãã ããã
https://www.npmjs.com/package/razzle-plugin-runtimeenv
ããã¯ã©ã®ããã«æ©èœããŸããïŒ äŸãæããŠããã ããŸããïŒ
確ãã«ãç°å¢å€æ°ã¯å®è¡æã«æ³šå ¥ããå¿ èŠããããšæããŸãã razzleã¢ããªãã³ã³ãã€ã³åããå Žåã¯ãå®è¡ããç°å¢ãšã¯é¢ä¿ãªãã€ã¡ãŒãžãäœæãããµãŒããŒã®èµ·åæã«ç°å¢å€æ°ãèªã¿åã£ãŠãã¯ã©ã€ã¢ã³ãã¢ããªã«æäŸããŸãã
ä»ã®ã¢ãããŒãã§ã¯ããã«ãæã«ã®ã¿çºçãããããå®éã«ã¯ç°å¢å€æ°ã䜿çšããŠããŸããã
ç§ãããã§è¿°ã¹ãããã«ïŒ
https://github.com/HamidTanhaei/razzle-plugin-runtime/issues/1#issuecomment -525731273
å®è¡æã«.envãã¡ã€ã«ãš.env.developmentãã¡ã€ã«ãrazzle-plugin-runtime
䜿çšã§ããŸãã å®è¡æã«ã¢ããªã§ç°å¢å€æ°ã䜿çšããæ©èœãè¿œå ãããŸãã
ããšãã°ãç§ã¯ããã䜿çšããŠaxios
ãŸãïŒ
axios.defaults.baseURL =
$ {process.env.RAZZLE_APP_API_BASE_PATH} $ {process.env.RAZZLE_APP_API_VERSION} ;
ãããŠã次ã®ããã«æ¬çªçšã®æ¬çªENVå€æ°ãæäŸã§ããŸãã
https://github.com/jaredpalmer/razzle#adding -temporary-environment-variables-in-your-shell
誰ããAzureã«Razzleã¢ããªããããã€ããæ¹æ³ãã¢ããã€ã¹ã§ããŸããïŒ æ¬åœã«èŠåŽããŠããŸãã
ç§ã¯ã§@fabianishereã§å ±æãœãªã¥ãŒã·ã§ã³ã䜿çšããŠAzureã®ããŒãã®åé¡ã解決ãhttps://github.com/jaredpalmer/razzle/issues/906#issuecomment -467046269
æãåèã«ãªãã³ã¡ã³ã
@jaredpalmeräœãã足ããªããããããŸããããreadmeã®ããã¥ã¡ã³ãã«ç€ºãããŠããããšã«ãããããããããã¯PORTãªã©ã®åé¡ã§ãã
process.env.MY_THING
ã¯æ£åžžã«æ©èœããŸãããprocess.env.PORT
ã¯ãã«ãæã«çœ®ãæããããå®è¡æã«èªã¿åãããŸããã ãããã£ãŠãHerokuã®äŸã¯å®éã«ã¯æ©èœããŸããããã®ã¹ã¬ããã§èª¬æãããŠããããã«ãPORTãHOSTãªã©ã®ç¹å¥ãªåŠçã¯èŠãããŸããã