mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
* Eject CRA from Flight We need to eject because we're going to add a custom Webpack Plugin. We can undo this once the plugin has upstreamed into CRA. * Add Webpack plugin build I call this entry point "webpack-plugin" instead of "plugin" even though this is a webpack specific package. That's because there will also be a Node.js plugin to do the server transform. * Add Flight Webpack plugin to fixture * Rm UMD builds * Transform classes * Rename webpack-plugin to plugin This avoids the double webpack name. We're going to reuse this for both server and client.
94 lines
3.4 KiB
JavaScript
94 lines
3.4 KiB
JavaScript
'use strict';
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
const paths = require('./paths');
|
||
|
||
// Make sure that including paths.js after env.js will read .env variables.
|
||
delete require.cache[require.resolve('./paths')];
|
||
|
||
const NODE_ENV = process.env.NODE_ENV;
|
||
if (!NODE_ENV) {
|
||
throw new Error(
|
||
'The NODE_ENV environment variable is required but was not specified.'
|
||
);
|
||
}
|
||
|
||
// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
|
||
const dotenvFiles = [
|
||
`${paths.dotenv}.${NODE_ENV}.local`,
|
||
`${paths.dotenv}.${NODE_ENV}`,
|
||
// Don't include `.env.local` for `test` environment
|
||
// since normally you expect tests to produce the same
|
||
// results for everyone
|
||
NODE_ENV !== 'test' && `${paths.dotenv}.local`,
|
||
paths.dotenv,
|
||
].filter(Boolean);
|
||
|
||
// Load environment variables from .env* files. Suppress warnings using silent
|
||
// if this file is missing. dotenv will never modify any environment variables
|
||
// that have already been set. Variable expansion is supported in .env files.
|
||
// https://github.com/motdotla/dotenv
|
||
// https://github.com/motdotla/dotenv-expand
|
||
dotenvFiles.forEach(dotenvFile => {
|
||
if (fs.existsSync(dotenvFile)) {
|
||
require('dotenv-expand')(
|
||
require('dotenv').config({
|
||
path: dotenvFile,
|
||
})
|
||
);
|
||
}
|
||
});
|
||
|
||
// We support resolving modules according to `NODE_PATH`.
|
||
// This lets you use absolute paths in imports inside large monorepos:
|
||
// https://github.com/facebook/create-react-app/issues/253.
|
||
// It works similar to `NODE_PATH` in Node itself:
|
||
// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
|
||
// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored.
|
||
// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims.
|
||
// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421
|
||
// We also resolve them to make sure all tools using them work consistently.
|
||
const appDirectory = fs.realpathSync(process.cwd());
|
||
process.env.NODE_PATH = (process.env.NODE_PATH || '')
|
||
.split(path.delimiter)
|
||
.filter(folder => folder && !path.isAbsolute(folder))
|
||
.map(folder => path.resolve(appDirectory, folder))
|
||
.join(path.delimiter);
|
||
|
||
// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
|
||
// injected into the application via DefinePlugin in Webpack configuration.
|
||
const REACT_APP = /^REACT_APP_/i;
|
||
|
||
function getClientEnvironment(publicUrl) {
|
||
const raw = Object.keys(process.env)
|
||
.filter(key => REACT_APP.test(key))
|
||
.reduce(
|
||
(env, key) => {
|
||
env[key] = process.env[key];
|
||
return env;
|
||
},
|
||
{
|
||
// Useful for determining whether we’re running in production mode.
|
||
// Most importantly, it switches React into the correct mode.
|
||
NODE_ENV: process.env.NODE_ENV || 'development',
|
||
// Useful for resolving the correct path to static assets in `public`.
|
||
// For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
|
||
// This should only be used as an escape hatch. Normally you would put
|
||
// images into the `src` and `import` them in code to get their paths.
|
||
PUBLIC_URL: publicUrl,
|
||
}
|
||
);
|
||
// Stringify all values so we can feed into Webpack DefinePlugin
|
||
const stringified = {
|
||
'process.env': Object.keys(raw).reduce((env, key) => {
|
||
env[key] = JSON.stringify(raw[key]);
|
||
return env;
|
||
}, {}),
|
||
};
|
||
|
||
return {raw, stringified};
|
||
}
|
||
|
||
module.exports = getClientEnvironment;
|