diff --git a/config/webpack.config.dev.js b/config/webpack.config.dev.js index b93abcdad20..95babd1c526 100644 --- a/config/webpack.config.dev.js +++ b/config/webpack.config.dev.js @@ -12,196 +12,209 @@ var autoprefixer = require('autoprefixer'); var webpack = require('webpack'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin'); var WatchMissingNodeModulesPlugin = require('../scripts/utils/WatchMissingNodeModulesPlugin'); var paths = require('./paths'); var env = require('./env'); +var chalk = require('chalk'); // This is the development configuration. // It is focused on developer experience and fast rebuilds. // The production configuration is different and lives in a separate file. -module.exports = { - // This makes the bundle appear split into separate modules in the devtools. - // We don't use source maps here because they can be confusing: - // https://github.com/facebookincubator/create-react-app/issues/343#issuecomment-237241875 - // You may want 'cheap-module-source-map' instead if you prefer source maps. - devtool: 'eval', - // These are the "entry points" to our application. - // This means they will be the "root" imports that are included in JS bundle. - // The first two entry points enable "hot" CSS and auto-refreshes for JS. - entry: [ - // Include WebpackDevServer client. It connects to WebpackDevServer via - // sockets and waits for recompile notifications. When WebpackDevServer - // recompiles, it sends a message to the client by socket. If only CSS - // was changed, the app reload just the CSS. Otherwise, it will refresh. - // The "?/" bit at the end tells the client to look for the socket at - // the root path, i.e. /sockjs-node/. Otherwise visiting a client-side - // route like /todos/42 would make it wrongly request /todos/42/sockjs-node. - // The socket server is a part of WebpackDevServer which we are using. - // The /sockjs-node/ path I'm referring to is hardcoded in WebpackDevServer. - require.resolve('webpack-dev-server/client') + '?/', - // Include Webpack hot module replacement runtime. Webpack is pretty - // low-level so we need to put all the pieces together. The runtime listens - // to the events received by the client above, and applies updates (such as - // new CSS) to the running application. - require.resolve('webpack/hot/dev-server'), - // We ship a few polyfills by default. - require.resolve('./polyfills'), - // Finally, this is your app's code: - path.join(paths.appSrc, 'index') - // We include the app code last so that if there is a runtime error during - // initialization, it doesn't blow up the WebpackDevServer client, and - // changing JS code would still trigger a refresh. - ], - output: { - // Next line is not used in dev but WebpackDevServer crashes without it: - path: paths.appBuild, - // Add /* filename */ comments to generated require()s in the output. - pathinfo: true, - // This does not produce a real file. It's just the virtual path that is - // served by WebpackDevServer in development. This is the JS bundle - // containing code from all our entry points, and the Webpack runtime. - filename: 'static/js/bundle.js', - // In development, we always serve from the root. This makes config easier. - publicPath: '/' - }, - resolve: { - // These are the reasonable defaults supported by the Node ecosystem. - extensions: ['.js', '.json', ''], - alias: { - // This `alias` section can be safely removed after ejection. - // We do this because `babel-runtime` may be inside `react-scripts`, - // so when `babel-plugin-transform-runtime` imports it, it will not be - // available to the app directly. This is a temporary solution that lets - // us ship support for generators. However it is far from ideal, and - // if we don't have a good solution, we should just make `babel-runtime` - // a dependency in generated projects. - // See https://github.com/facebookincubator/create-react-app/issues/255 - 'babel-runtime/regenerator': require.resolve('babel-runtime/regenerator'), - 'react-native': 'react-native-web' - } - }, - // Resolve loaders (webpack plugins for CSS, images, transpilation) from the - // directory of `react-scripts` itself rather than the project directory. - // You can remove this after ejecting. - resolveLoader: { - root: paths.ownNodeModules, - moduleTemplates: ['*-loader'] - }, - module: { - // First, run the linter. - // It's important to do this before Babel processes the JS. - preLoaders: [ - { - test: /\.js$/, - loader: 'eslint', - include: paths.appSrc, - } +module.exports = function(serverPort) { + return { + // This makes the bundle appear split into separate modules in the devtools. + // We don't use source maps here because they can be confusing: + // https://github.com/facebookincubator/create-react-app/issues/343#issuecomment-237241875 + // You may want 'cheap-module-source-map' instead if you prefer source maps. + devtool: 'eval', + // These are the "entry points" to our application. + // This means they will be the "root" imports that are included in JS bundle. + // The first two entry points enable "hot" CSS and auto-refreshes for JS. + entry: [ + // Include WebpackDevServer client. It connects to WebpackDevServer via + // sockets and waits for recompile notifications. When WebpackDevServer + // recompiles, it sends a message to the client by socket. If only CSS + // was changed, the app reload just the CSS. Otherwise, it will refresh. + // The "?/" bit at the end tells the client to look for the socket at + // the root path, i.e. /sockjs-node/. Otherwise visiting a client-side + // route like /todos/42 would make it wrongly request /todos/42/sockjs-node. + // The socket server is a part of WebpackDevServer which we are using. + // The /sockjs-node/ path I'm referring to is hardcoded in WebpackDevServer. + require.resolve('webpack-dev-server/client') + '?/', + // Include Webpack hot module replacement runtime. Webpack is pretty + // low-level so we need to put all the pieces together. The runtime listens + // to the events received by the client above, and applies updates (such as + // new CSS) to the running application. + require.resolve('webpack/hot/dev-server'), + // We ship a few polyfills by default. + require.resolve('./polyfills'), + // Finally, this is your app's code: + path.join(paths.appSrc, 'index') + // We include the app code last so that if there is a runtime error during + // initialization, it doesn't blow up the WebpackDevServer client, and + // changing JS code would still trigger a refresh. ], - loaders: [ - // Process JS with Babel. - { - test: /\.js$/, - include: paths.appSrc, - loader: 'babel', - query: require('./babel.dev') - }, - // "postcss" loader applies autoprefixer to our CSS. - // "css" loader resolves paths in CSS and adds assets as dependencies. - // "style" loader turns CSS into JS modules that inject