UNPKG

10.8 kBJavaScriptView Raw
1// @remove-on-eject-begin
2/**
3 * Copyright (c) 2015-present, Facebook, Inc.
4 * All rights reserved.
5 *
6 * This source code is licensed under the BSD-style license found in the
7 * LICENSE file in the root directory of this source tree. An additional grant
8 * of patent rights can be found in the PATENTS file in the same directory.
9 */
10// @remove-on-eject-end
11"use strict";
12
13const autoprefixer = require("autoprefixer");
14const webpack = require("webpack");
15const HtmlWebpackPlugin = require("html-webpack-plugin");
16const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
17const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin");
18const WatchMissingNodeModulesPlugin = require("react-dev-utils/WatchMissingNodeModulesPlugin");
19const getClientEnvironment = require("./env");
20const paths = require("./paths");
21
22// Webpack uses `publicPath` to determine where the app is being served from.
23// In development, we always serve from the root. This makes config easier.
24const publicPath = "/";
25// `publicUrl` is just like `publicPath`, but we will provide it to our app
26// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
27// Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz.
28const publicUrl = "";
29// Get environment variables to inject into our app.
30const env = getClientEnvironment(publicUrl);
31
32// This is the development configuration.
33// It is focused on developer experience and fast rebuilds.
34// The production configuration is different and lives in a separate file.
35module.exports = {
36 target: "electron-renderer",
37 // You may want 'eval' instead if you prefer to see the compiled output in DevTools.
38 // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.
39 devtool: "cheap-module-source-map",
40 // These are the "entry points" to our application.
41 // This means they will be the "root" imports that are included in JS bundle.
42 // The first two entry points enable "hot" CSS and auto-refreshes for JS.
43 entry: [
44 // Include an alternative client for WebpackDevServer. A client's job is to
45 // connect to WebpackDevServer by a socket and get notified about changes.
46 // When you save a file, the client will either apply hot updates (in case
47 // of CSS changes), or refresh the page (in case of JS changes). When you
48 // make a syntax error, this client will display a syntax error overlay.
49 // Note: instead of the default WebpackDevServer client, we use a custom one
50 // to bring better experience for Create React App users. You can replace
51 // the line below with these two lines if you prefer the stock client:
52 // require.resolve('webpack-dev-server/client') + '?/',
53 // require.resolve('webpack/hot/dev-server'),
54 require.resolve("react-dev-utils/webpackHotDevClient"),
55 // We ship a few polyfills by default:
56 require.resolve("./polyfills"),
57 // Errors should be considered fatal in development
58 // Finally, this is your app's code:
59 paths.appIndexJs
60 // We include the app code last so that if there is a runtime error during
61 // initialization, it doesn't blow up the WebpackDevServer client, and
62 // changing JS code would still trigger a refresh.
63 ],
64 output: {
65 // Next line is not used in dev but WebpackDevServer crashes without it:
66 path: paths.appBuild,
67 // Add /* filename */ comments to generated require()s in the output.
68 pathinfo: true,
69 // This does not produce a real file. It's just the virtual path that is
70 // served by WebpackDevServer in development. This is the JS bundle
71 // containing code from all our entry points, and the Webpack runtime.
72 filename: "static/js/bundle.js",
73 // This is the URL that app is served from. We use "/" in development.
74 publicPath: publicPath
75 },
76 resolve: {
77 // This allows you to set a fallback for where Webpack should look for modules.
78 // We read `NODE_PATH` environment variable in `paths.js` and pass paths here.
79 // We placed these paths second because we want `node_modules` to "win"
80 // if there are any conflicts. This matches Node resolution mechanism.
81 // https://github.com/facebookincubator/create-react-app/issues/253
82 modules: ["node_modules", paths.appNodeModules].concat(paths.nodePaths),
83 // These are the reasonable defaults supported by the Node ecosystem.
84 // We also include JSX as a common component filename extension to support
85 // some tools, although we do not recommend using it, see:
86 // https://github.com/facebookincubator/create-react-app/issues/290
87 extensions: [".js", ".json", ".jsx"],
88 alias: {
89 // Support React Native Web
90 // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
91 "react-native": "react-native-web"
92 }
93 },
94 // @remove-on-eject-begin
95 // Resolve loaders (webpack plugins for CSS, images, transpilation) from the
96 // directory of `react-scripts` itself rather than the project directory.
97 resolveLoader: {
98 modules: [
99 paths.ownNodeModules,
100 // Lerna hoists everything, so we need to look in our app directory
101 paths.appNodeModules
102 ]
103 },
104 // @remove-on-eject-end
105 module: {
106 rules: [
107 // Disable require.ensure as it's not a standard language feature.
108 { parser: { requireEnsure: false } },
109 // First, run the linter.
110 // It's important to do this before Babel processes the JS.
111 {
112 test: /\.(js|jsx)$/,
113 enforce: "pre",
114 use: [
115 {
116 // @remove-on-eject-begin
117 // Point ESLint to our predefined config.
118 options: {
119 baseConfig: {
120 extends: ["react-app"]
121 },
122 useEslintrc: false
123 },
124 // @remove-on-eject-end
125 loader: "eslint-loader"
126 }
127 ],
128 include: paths.appSrc
129 },
130 // ** ADDING/UPDATING LOADERS **
131 // The "url" loader handles all assets unless explicitly excluded.
132 // The `exclude` list *must* be updated with every change to loader extensions.
133 // When adding a new loader, you must add its `test`
134 // as a new entry in the `exclude` list for "url" loader.
135
136 // "file" loader makes sure those assets get served by WebpackDevServer.
137 // When you `import` an asset, you get its (virtual) filename.
138 // In production, they would get copied to the `build` folder.
139 {
140 exclude: [
141 /\.html$/,
142 /\.(js|jsx)$/,
143 /\.css$/,
144 /\.json$/,
145 /\.bmp$/,
146 /\.gif$/,
147 /\.jpe?g$/,
148 /\.png$/
149 ],
150 loader: "file-loader",
151 options: {
152 name: "static/media/[name].[hash:8].[ext]"
153 }
154 },
155 // "url" loader works like "file" loader except that it embeds assets
156 // smaller than specified limit in bytes as data URLs to avoid requests.
157 // A missing `test` is equivalent to a match.
158 {
159 test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
160 loader: "url-loader",
161 options: {
162 limit: 10000,
163 name: "static/media/[name].[hash:8].[ext]"
164 }
165 },
166 // Process JS with Babel.
167 {
168 test: /\.(js|jsx)$/,
169 include: paths.appSrc,
170 loader: "babel-loader",
171 options: {
172 // @remove-on-eject-begin
173 babelrc: false,
174 presets: [require.resolve("babel-preset-react-app")],
175 // @remove-on-eject-end
176 // This is a feature of `babel-loader` for webpack (not Babel itself).
177 // It enables caching results in ./node_modules/.cache/babel-loader/
178 // directory for faster rebuilds.
179 cacheDirectory: true
180 }
181 },
182 // "postcss" loader applies autoprefixer to our CSS.
183 // "css" loader resolves paths in CSS and adds assets as dependencies.
184 // "style" loader turns CSS into JS modules that inject <style> tags.
185 // In production, we use a plugin to extract that CSS to a file, but
186 // in development "style" loader enables hot editing of CSS.
187 {
188 test: /\.css$/,
189 use: [
190 "style-loader",
191 {
192 loader: "css-loader",
193 options: {
194 importLoaders: 1
195 }
196 },
197 {
198 loader: "postcss-loader",
199 options: {
200 ident: "postcss", // https://webpack.js.org/guides/migrating/#complex-options
201 plugins: () => [
202 autoprefixer({
203 browsers: [
204 ">1%",
205 "last 4 versions",
206 "Firefox ESR",
207 "not ie < 9" // React doesn't support IE8 anyway
208 ]
209 })
210 ]
211 }
212 }
213 ]
214 }
215 // ** STOP ** Are you adding a new loader?
216 // Remember to add the new extension(s) to the "url" loader exclusion list.
217 ]
218 },
219 plugins: [
220 // Makes some environment variables available in index.html.
221 // The public URL is available as %PUBLIC_URL% in index.html, e.g.:
222 // <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
223 // In development, this will be an empty string.
224 new InterpolateHtmlPlugin(env.raw),
225 // Generates an `index.html` file with the <script> injected.
226 new HtmlWebpackPlugin({
227 inject: true,
228 template: paths.appHtml
229 }),
230 // Makes some environment variables available to the JS code, for example:
231 // if (process.env.NODE_ENV === 'development') { ... }. See `./env.js`.
232 new webpack.DefinePlugin(env.stringified),
233 // This is necessary to emit hot updates (currently CSS only):
234 new webpack.HotModuleReplacementPlugin(),
235 // Watcher doesn't work well if you mistype casing in a path so we use
236 // a plugin that prints an error when you attempt to do this.
237 // See https://github.com/facebookincubator/create-react-app/issues/240
238 new CaseSensitivePathsPlugin(),
239 // If you require a missing module and then `npm install` it, you still have
240 // to restart the development server for Webpack to discover it. This plugin
241 // makes the discovery automatic so you don't have to restart.
242 // See https://github.com/facebookincubator/create-react-app/issues/186
243 new WatchMissingNodeModulesPlugin(paths.appNodeModules)
244 ],
245 // Some libraries import Node modules but don't use them in the browser.
246 // Tell Webpack to provide empty mocks for them so importing them works.
247 node: {
248 fs: "empty",
249 net: "empty",
250 tls: "empty"
251 },
252 // Turn off performance hints during development because we don't do any
253 // splitting or minification in interest of speed. These warnings become
254 // cumbersome.
255 performance: {
256 hints: false
257 }
258};