diff --git a/config/paths.js b/config/paths.js index e85fe385a6e20755b234a4116f01b59658411216..2edd496f6cbff40af74161fc2fddc52583d8994a 100644 --- a/config/paths.js +++ b/config/paths.js @@ -11,6 +11,18 @@ var path = require('path'); +// We support resolving modules according to NODE_PATH. +// This lets you use absolute paths in imports inside large monorepos: +// https://github.com/facebookincubator/create-react-app/issues/253. +// It works just like NODE_PATH in Node: +// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders +// We will export `nodePaths` as an array of absolute paths. +// It will then be used by Webpack (and potentially other tools). +var nodePaths = (process.env.NODE_PATH || '') + .split(process.platform === 'win32' ? ';' : ':') + .filter(Boolean) + .map(p => path.resolve(p)); + function resolveApp(relativePath) { return path.resolve(relativePath); } @@ -22,13 +34,15 @@ module.exports = { appPackageJson: resolveApp('package.json'), appSrc: resolveApp('src'), appNodeModules: resolveApp('node_modules'), - ownNodeModules: resolveApp('node_modules') + ownNodeModules: resolveApp('node_modules'), + nodePaths: nodePaths }; // @remove-on-eject-begin function resolveOwn(relativePath) { return path.resolve(__dirname, relativePath); } + // config before eject: we're in ./node_modules/react-scripts/config/ module.exports = { appBuild: resolveApp('build'), @@ -37,7 +51,8 @@ module.exports = { appSrc: resolveApp('src'), appNodeModules: resolveApp('node_modules'), // this is empty with npm3 but node resolution searches higher anyway: - ownNodeModules: resolveOwn('../node_modules') + ownNodeModules: resolveOwn('../node_modules'), + nodePaths: nodePaths }; // @remove-on-eject-end @@ -48,6 +63,7 @@ module.exports = { appPackageJson: resolveOwn('../package.json'), appSrc: resolveOwn('../template/src'), appNodeModules: resolveOwn('../node_modules'), - ownNodeModules: resolveOwn('../node_modules') + ownNodeModules: resolveOwn('../node_modules'), + nodePaths: nodePaths }; // @remove-on-publish-end diff --git a/config/webpack.config.dev.js b/config/webpack.config.dev.js index dfad61f5ab868c594acab240b746e63dc7ac5acb..b5f848bbde9aa48113f4a3d26aab3f62cfef1de8 100644 --- a/config/webpack.config.dev.js +++ b/config/webpack.config.dev.js @@ -67,9 +67,11 @@ module.exports = { publicPath: '/' }, resolve: { - // This allows you to set a root for where webpack should look for modules. - // This enables you to use absolute imports from the root. - root: path.resolve(process.env.NODE_PATH || ''), + // This allows you to set a root for where Webpack should look for modules. + // It must be an absolute path or an array of absolute paths. + // This lets you use absolute paths in imports inside large monorepos: + // https://github.com/facebookincubator/create-react-app/issues/253. + root: paths.nodePaths, // These are the reasonable defaults supported by the Node ecosystem. extensions: ['.js', '.json', ''], alias: { diff --git a/config/webpack.config.prod.js b/config/webpack.config.prod.js index 7ebe693686f880764cf9c22af2e168ff67bb96f1..95e8c949ce677a4f6e4f0d379636df44ffef2f4a 100644 --- a/config/webpack.config.prod.js +++ b/config/webpack.config.prod.js @@ -62,9 +62,11 @@ module.exports = { publicPath: publicPath }, resolve: { - // This allows you to set a root for where webpack should look for modules. - // This enables you to use absolute imports from the root. - root: path.resolve(process.env.NODE_PATH || ''), + // This allows you to set a root for where Webpack should look for modules. + // It must be an absolute path or an array of absolute paths. + // This lets you use absolute paths in imports inside large monorepos: + // https://github.com/facebookincubator/create-react-app/issues/253. + root: paths.nodePaths, // These are the reasonable defaults supported by the Node ecosystem. extensions: ['.js', '.json', ''], alias: {