"use strict" var autoprefixer = require("autoprefixer") var webpack = require("webpack") var HtmlWebpackPlugin = require("html-webpack-plugin") var ExtractTextPlugin = require("extract-text-webpack-plugin") var ManifestPlugin = require("webpack-manifest-plugin") var InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin") var paths = require("./paths") var getClientEnvironment = require("./env") // Webpack uses `publicPath` to determine where the app is being served from. // It requires a trailing slash, or the file assets will get an incorrect path. var publicPath = paths.servedPath // Some apps do not use client-side routing with pushState. // For these, "homepage" can be set to "." to enable relative asset paths. var shouldUseRelativeAssetPaths = publicPath === "./" // `publicUrl` is just like `publicPath`, but we will provide it to our app // as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript. // Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz. var publicUrl = publicPath.slice(0, -1) // Get environment variables to inject into our app. var env = getClientEnvironment(publicUrl) // Assert this just to be safe. // Development builds of React are slow and not intended for production. if (env.stringified["process.env"].NODE_ENV !== '"production"') { throw new Error("Production builds must have NODE_ENV=production.") } // Note: defined here because it will be used more than once. const cssFilename = "_static/css/[name].[contenthash:8].css" // ExtractTextPlugin expects the build output to be flat. // (See https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/27) // However, our output is structured with css, js and media folders. // To have this structure working with relative paths, we have to use custom options. const extractTextPluginOptions = shouldUseRelativeAssetPaths ? // Making sure that the publicPath goes back to to build folder. { publicPath: Array(cssFilename.split("/").length).join("../") } : undefined // This is the production configuration. // It compiles slowly and is focused on producing a fast and minimal bundle. // The development configuration is different and lives in a separate file. module.exports = { // Don't attempt to continue if there are any errors. bail: true, // We generate sourcemaps in production. This is slow but gives good results. // You can exclude the *.map files from the build during deployment. devtool: "source-map", // In production, we only want to load the polyfills and the app code. entry: [require.resolve("./polyfills"), paths.appIndexJs], output: { // The build folder. path: paths.appBuild, // Generated JS file names (with nested folders). // There will be one main bundle, and one file per asynchronous chunk. // We don't currently advertise code splitting but Webpack supports it. filename: "_static/js/[name].[chunkhash:8].js", chunkFilename: "_static/js/[name].[chunkhash:8].chunk.js", // We inferred the "public path" (such as / or /my-project) from homepage. publicPath: publicPath }, resolve: { // This allows you to set a fallback for where Webpack should look for modules. // We read `NODE_PATH` environment variable in `paths.js` and pass paths here. // We use `fallback` instead of `root` because we want `node_modules` to "win" // if there any conflicts. This matches Node resolution mechanism. // https://github.com/facebookincubator/create-react-app/issues/253 fallback: paths.nodePaths, // These are the reasonable defaults supported by the Node ecosystem. // We also include JSX as a common component filename extension to support // some tools, although we do not recommend using it, see: // https://github.com/facebookincubator/create-react-app/issues/290 extensions: [".js", ".json", ".jsx", ""], alias: { // Support React Native Web // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ "react-native": "react-native-web" } }, module: { // First, run the linter. // It's important to do this before Babel processes the JS. preLoaders: [ { test: /\.(js|jsx)$/, loader: "eslint", include: paths.appSrc } ], loaders: [ // ** ADDING/UPDATING LOADERS ** // The "url" loader handles all assets unless explicitly excluded. // The `exclude` list *must* be updated with every change to loader extensions. // When adding a new loader, you must add its `test` // as a new entry in the `exclude` list in the "url" loader. // "url" loader embeds assets smaller than specified size as data URLs to avoid requests. // Otherwise, it acts like the "file" loader. { exclude: [/\.html$/, /\.(js|jsx)$/, /\.css$/, /\.json$/, /\.svg$/, /\.md$/], loader: "url", query: { limit: 10000, name: "_static/media/[name].[hash:8].[ext]" } }, // Process JS with Babel. { test: /\.(js|jsx)$/, include: paths.appSrc, loader: "babel" }, // The notation here is somewhat confusing. // "postcss" loader applies autoprefixer to our CSS. // "css" loader resolves paths in CSS and adds assets as dependencies. // "style" loader normally turns CSS into JS modules injecting