UNPKG

8.17 kBJavaScriptView Raw
1/*
2 * @Author: Eward
3 * @Date: 2017-08-17 21:24:30
4 * @Last Modified by: Eward
5 * @Last Modified time: 2017-10-23 20:30:29
6 */
7"use strict";
8
9const fs = require("fs"); //eward
10const autoprefixer = require("autoprefixer");
11const path = require("path");
12const webpack = require("webpack");
13const HtmlWebpackPlugin = require("html-webpack-plugin");
14const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
15const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin");
16const WatchMissingNodeModulesPlugin = require("react-dev-utils/WatchMissingNodeModulesPlugin");
17const eslintFormatter = require("react-dev-utils/eslintFormatter");
18const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
19const AutoDllPlugin = require("autodll-webpack-plugin");
20
21const getClientEnvironment = require("./env");
22const paths = require("./paths");
23const publicPath = "/";
24const publicUrl = "";
25const env = getClientEnvironment(publicUrl);
26
27const alias =
28 (fs.existsSync(paths.appConfig) && require(paths.appConfig).alias) || {};
29
30for (let i in alias) {
31 alias[i] = paths.appSrc + alias[i];
32}
33
34/** ---- ---- by Eward */
35const modifyVars =
36 (fs.existsSync(paths.appConfig) && require(paths.appConfig).modifyVars) || {};
37const moreLoaders =
38 (fs.existsSync(paths.appConfig) && require(paths.appConfig).loaders) || [];
39const moredPlugins =
40 (fs.existsSync(paths.appConfig) && require(paths.appConfig).devPlugins) || [];
41/** ---- ---- by Eward */
42
43module.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 //eward
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" // React doesn't support IE8 anyway
159 ],
160 flexbox: "no-2009"
161 })
162 ]
163 }
164 }
165 ]
166 },
167 //新增对module less的支持
168 {
169 //eward
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" // React doesn't support IE8 anyway
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 //新增对less的支持
209 {
210 //eward
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" // React doesn't support IE8 anyway
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) //eward
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};