1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | "use strict";
|
8 |
|
9 | const fs = require("fs");
|
10 | const autoprefixer = require("autoprefixer");
|
11 | const path = require("path");
|
12 | const webpack = require("webpack");
|
13 | const HtmlWebpackPlugin = require("html-webpack-plugin");
|
14 | const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
|
15 | const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin");
|
16 | const WatchMissingNodeModulesPlugin = require("react-dev-utils/WatchMissingNodeModulesPlugin");
|
17 | const eslintFormatter = require("react-dev-utils/eslintFormatter");
|
18 | const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
|
19 | const AutoDllPlugin = require("autodll-webpack-plugin");
|
20 |
|
21 | const getClientEnvironment = require("./env");
|
22 | const paths = require("./paths");
|
23 | const publicPath = "/";
|
24 | const publicUrl = "";
|
25 | const env = getClientEnvironment(publicUrl);
|
26 |
|
27 | const alias =
|
28 | (fs.existsSync(paths.appConfig) && require(paths.appConfig).alias) || {};
|
29 |
|
30 | for (let i in alias) {
|
31 | alias[i] = paths.appSrc + alias[i];
|
32 | }
|
33 |
|
34 |
|
35 | const modifyVars =
|
36 | (fs.existsSync(paths.appConfig) && require(paths.appConfig).modifyVars) || {};
|
37 | const moreLoaders =
|
38 | (fs.existsSync(paths.appConfig) && require(paths.appConfig).loaders) || [];
|
39 | const moredPlugins =
|
40 | (fs.existsSync(paths.appConfig) && require(paths.appConfig).devPlugins) || [];
|
41 |
|
42 |
|
43 | module.exports = {
|
44 | cache: true,
|
45 | devtool: "cheap-module-source-map",
|
46 | entry: [
|
47 | require.resolve("./polyfills"),
|
48 | require.resolve("react-dev-utils/webpackHotDevClient"),
|
49 | paths.appIndexJs
|
50 | ],
|
51 | output: {
|
52 | path: paths.appBuild,
|
53 | pathinfo: true,
|
54 | filename: "static/js/bundle.js",
|
55 | chunkFilename: "static/js/[name].chunk.js",
|
56 | publicPath: publicPath,
|
57 | devtoolModuleFilenameTemplate: info =>
|
58 | path.resolve(info.absoluteResourcePath).replace(/\\/g, "/")
|
59 | },
|
60 | resolve: {
|
61 | modules: ["node_modules", paths.appNodeModules].concat(
|
62 | process.env.NODE_PATH.split(path.delimiter).filter(Boolean)
|
63 | ),
|
64 | extensions: [
|
65 | ".web.js",
|
66 | ".js",
|
67 | ".json",
|
68 | ".web.jsx",
|
69 | ".jsx",
|
70 | "web.ts",
|
71 | ".ts",
|
72 | "web.tsx",
|
73 | ".tsx"
|
74 | ],
|
75 | alias: Object.assign(
|
76 |
|
77 | {},
|
78 | {
|
79 | "babel-runtime": path.dirname(
|
80 | require.resolve("babel-runtime/package.json")
|
81 | ),
|
82 | "react-native": "react-native-web"
|
83 | },
|
84 | alias
|
85 | ),
|
86 | plugins: [new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson])]
|
87 | },
|
88 | module: {
|
89 | strictExportPresence: true,
|
90 | rules: [
|
91 | {
|
92 | test: /\.(js|jsx)$/,
|
93 | enforce: "pre",
|
94 | use: [
|
95 | {
|
96 | options: {
|
97 | formatter: eslintFormatter,
|
98 | eslintPath: require.resolve("eslint")
|
99 | },
|
100 | loader: require.resolve("eslint-loader")
|
101 | }
|
102 | ],
|
103 | include: paths.appSrc
|
104 | },
|
105 | {
|
106 | test: /\.(ts|tsx)$/,
|
107 | loader: require.resolve('tslint-loader'),
|
108 | enforce: 'pre',
|
109 | include: paths.appSrc,
|
110 | },
|
111 | {
|
112 | oneOf: [
|
113 | {
|
114 | test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
|
115 | loader: require.resolve("url-loader"),
|
116 | options: {
|
117 | limit: 10000,
|
118 | name: "static/media/[name].[hash:8].[ext]"
|
119 | }
|
120 | },
|
121 | {
|
122 | test: /\.(js|jsx)$/,
|
123 | include: paths.appSrc,
|
124 | loader: require.resolve("babel-loader"),
|
125 | options: {
|
126 | cacheDirectory: true
|
127 | }
|
128 | },
|
129 | {
|
130 | test: /\.(ts|tsx)$/,
|
131 | include: paths.appSrc,
|
132 | loader: [
|
133 | require.resolve("babel-loader"),
|
134 | require.resolve("ts-loader")
|
135 | ]
|
136 | },
|
137 | {
|
138 | test: /\.css$/,
|
139 | use: [
|
140 | require.resolve("style-loader"),
|
141 | {
|
142 | loader: require.resolve("css-loader"),
|
143 | options: {
|
144 | importLoaders: 1
|
145 | }
|
146 | },
|
147 | {
|
148 | loader: require.resolve("postcss-loader"),
|
149 | options: {
|
150 | ident: "postcss",
|
151 | plugins: () => [
|
152 | require("postcss-flexbugs-fixes"),
|
153 | autoprefixer({
|
154 | browsers: [
|
155 | ">1%",
|
156 | "last 4 versions",
|
157 | "Firefox ESR",
|
158 | "not ie < 9"
|
159 | ],
|
160 | flexbox: "no-2009"
|
161 | })
|
162 | ]
|
163 | }
|
164 | }
|
165 | ]
|
166 | },
|
167 |
|
168 | {
|
169 |
|
170 | test: /\.module\.less$/,
|
171 | use: [
|
172 | require.resolve("style-loader"),
|
173 | {
|
174 | loader: require.resolve("css-loader"),
|
175 | options: {
|
176 | importLoaders: 1,
|
177 | modules: true,
|
178 | sourceMap: false,
|
179 | localIdentName: "[local]___[hash:base64:5]"
|
180 | }
|
181 | },
|
182 | {
|
183 | loader: require.resolve("postcss-loader"),
|
184 | options: {
|
185 | ident: "postcss",
|
186 | plugins: () => [
|
187 | require("postcss-flexbugs-fixes"),
|
188 | autoprefixer({
|
189 | browsers: [
|
190 | ">1%",
|
191 | "last 4 versions",
|
192 | "Firefox ESR",
|
193 | "not ie < 9"
|
194 | ],
|
195 | flexbox: "no-2009"
|
196 | })
|
197 | ]
|
198 | }
|
199 | },
|
200 | {
|
201 | loader: require.resolve("less-loader"),
|
202 | options: {
|
203 | modifyVars: modifyVars
|
204 | }
|
205 | }
|
206 | ]
|
207 | },
|
208 |
|
209 | {
|
210 |
|
211 | test: /\.less$/,
|
212 | use: [
|
213 | require.resolve("style-loader"),
|
214 | {
|
215 | loader: require.resolve("css-loader"),
|
216 | options: {
|
217 | importLoaders: 1
|
218 | }
|
219 | },
|
220 | {
|
221 | loader: require.resolve("postcss-loader"),
|
222 | options: {
|
223 | ident: "postcss",
|
224 | plugins: () => [
|
225 | require("postcss-flexbugs-fixes"),
|
226 | autoprefixer({
|
227 | browsers: [
|
228 | ">1%",
|
229 | "last 4 versions",
|
230 | "Firefox ESR",
|
231 | "not ie < 9"
|
232 | ],
|
233 | flexbox: "no-2009"
|
234 | })
|
235 | ]
|
236 | }
|
237 | },
|
238 | {
|
239 | loader: require.resolve("less-loader"),
|
240 | options: {
|
241 | modifyVars: modifyVars
|
242 | }
|
243 | }
|
244 | ]
|
245 | },
|
246 | {
|
247 | exclude: [/\.js$/, /\.html$/, /\.json$/],
|
248 | loader: require.resolve("file-loader"),
|
249 | options: {
|
250 | name: "static/media/[name].[hash:8].[ext]"
|
251 | }
|
252 | }
|
253 | ].concat(moreLoaders)
|
254 | }
|
255 | ]
|
256 | },
|
257 | plugins: [
|
258 | new InterpolateHtmlPlugin(env.raw),
|
259 | new HtmlWebpackPlugin({
|
260 | inject: true,
|
261 | template: paths.appHtml
|
262 | }),
|
263 | new webpack.NamedModulesPlugin(),
|
264 | new webpack.DefinePlugin(env.stringified),
|
265 | new webpack.HotModuleReplacementPlugin(),
|
266 | new CaseSensitivePathsPlugin(),
|
267 | new WatchMissingNodeModulesPlugin(paths.appNodeModules),
|
268 | new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
|
269 | ].concat(moredPlugins),
|
270 | node: {
|
271 | dgram: "empty",
|
272 | fs: "empty",
|
273 | net: "empty",
|
274 | tls: "empty",
|
275 | child_process: "empty"
|
276 | },
|
277 | performance: {
|
278 | hints: false
|
279 | }
|
280 | };
|