Environment Variables In An Isomorphic JS App: Webpack Find & Replace?
Solution 1:
Note that using the DefinePlugin
as suggested in the accepted answer is potentially a dangerous action as it completely exposes process.env
. As Tobias commented above there's actually a plugin EnvironmentPlugin
that does exactly this with an added whitelisting ability, using DefinePlugin
internally.
In your webpack.config.js
:
{
plugins: [
new webpack.EnvironmentPlugin([
'NODE_ENV',
'WHITELISTED_ENVIRONMENT_VARIABLE'
])
]
}
Solution 2:
In your webpack.config.js
,
use the following preLoaders
(or postLoaders
),
module: {
preLoaders: [
{ test: /\.js$/, loader: "transform?envify" },
]
}
Another way using the webpack.DefinePlugin
:
plugins: [
new DefinePlugin({
'process.env': Object.keys(process.env).reduce(function(o, k) {
o[k] = JSON.stringify(process.env[k]);
return o;
}, {})
})
]
NOTE: The old method using envify-loader
was deprecated:
DEPRECATED: use transform-loader + envify instead.
Solution 3:
Yeah; looks like envify-loader was the easy solution.
I just added the following to my webpack loaders:
{
test: /config\.js$/, loader: "envify-loader"
}
And the config.js
(and only that file) is modified to include any referenced environment variables statically :)
Solution 4:
I needed a way to use the env variables set on the machine that is running the code, no the env variables of the machine building the app.
I do not see a solution for this yet. This is what I did.
In publicEnv.js
:
// List of the env variables you want to use on the client. Careful on what you put here!
const publicEnv = [
'API_URL',
'FACEBOOK_APP_ID',
'GA_ID'
];
const isBrowser = typeof window !== 'undefined';
const base = (isBrowser ? window.__ENV__ : process.env) || {};
const env = {};
for (const v of publicEnv) {
env[v] = base[v];
}
export default env;
In the HTML template file of the page I have:
import publicEnv from 'publicEnv.js';
...
<script>
window.__ENV__ = ${stringify(publicEnv)};
// Other things you need here...
window.__INITIAL_STATE__ = ${stringify(initialState)};
</script>
So now I can get the value of the env variable on both frontend and backend with:
import publicEnv from 'publicEnv.js';
...
console.log("Google Analytic code is", publicEnv.GA_ID);
I hope it can help.
Post a Comment for "Environment Variables In An Isomorphic JS App: Webpack Find & Replace?"