-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwebpack.prod.js
executable file
·150 lines (149 loc) · 6.37 KB
/
webpack.prod.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
const Visualizer = require('webpack-visualizer-plugin');
const FileListPlugin = require('./FileListPlugin.js');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
resolve: {
// 给出别名, 可以import别名, e.g. import 'MVVM', 而不是复杂的路径 e.g. import '../MVVM'
alias: {
MVVM: path.resolve(__dirname, 'src/Vendor/MVVM'),
},
// 可以在js文件中不用加扩展名,会尝试以下扩展名
extensions: ['.js', '.css', '.json'],
},
// mode: 'production',
entry: {
index: path.resolve(__dirname, 'src/index.js'),
},
plugins: [
// 自定义插件,用来在服务端返回的html中注入js和css
new FileListPlugin(),
// 分析工具, 分析生成的文件的大小
new Visualizer({
filename: './statistics.html',
}),
// 定义js文件中可用的全局常量的值。
// 如果不采用JSON.stringify, 直接赋值字符串,该字符串会被当作一个代码片段来使用, 报未定义的错误
// Uncaught ReferenceError: official is not define
new webpack.DefinePlugin({
REQUEST_API: JSON.stringify('official'),
}),
// 它会将所有的 入口chunk (entry chunks) 中的 require("style.css") 移动到分开的 css 文件
// 样式不再内联到 javascript 里面,但会放到一个单独的 css 包文件 (styles.css)当中。
new ExtractTextPlugin({
filename: '[name].[contenthash].css',
allChunks: false,
}),
// 每次webpack重新生成index.html文件, 会自动生成在output path下面
// 多页面应用时配置多个html的做法 https://www.cnblogs.com/wonyun/p/6030090.html
new HtmlWebpackPlugin({
title: 'myapp',
template: path.resolve(__dirname, 'src/index.ejs'),
// 选择在html中所要引入的chunks, 如果不选择,则全部引入
// chunks: ['index'],
// 是否默认在body的闭合标签前注入js, 在head头注入css
inject: true,
// 是否为所有注入的静态资源添加webpack每次编译产生的唯一hash值,
hash: false,
}),
// 在每次构建前移除整个dist文件,再重新build生成dist目录
new CleanWebpackPlugin(['dist']),
// 按顺序依次打包
// 1. 将子chunk的node_modules代码打包进父chunk(入口chunk: index)
new webpack.optimize.CommonsChunkPlugin({
children: true,
async: false,
minChunks(module) {
return /node_modules/.test(module.context);
},
}),
// 2. 将入口chunk的node_modules代码打包成vendor.bundle.js
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks(module) {
return /node_modules/.test(module.context);
},
}),
// 3. 将子chunk的公共代码打包进async-common并且采用异步加载
new webpack.optimize.CommonsChunkPlugin({
chidren: true,
async: 'async-common',
minChunks: 2,
}),
// 4. 新建一个manifest chunk, 不放入任何模块(minChunks:infinity).
// 由于manifest是此时唯一的entry chunk,则runtime代码放入manifest。
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity,
}),
],
output: {
path: path.resolve(__dirname, 'dist'),
// 将hash替换为chunkhash, hash 是 build-specific ,即每次编译都不同——适用于开发阶段。
// chunkhash,即文件内容变化,则文件名变化。这样自动利用浏览器缓存且不会妨碍文件更新。
filename: '[name].[chunkhash].entry.bundle.js',
chunkFilename: '[name].[chunkhash].async.bundle.js',
// html文件中的引用路径
publicPath: '/dist/',
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: ['babel-loader', 'eslint-loader'],
},
{
test: /\.css$/,
exclude: /node_modules/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
{
loader: 'css-loader',
options: {
minimize: true,
modules: true,
localIdentName:
'[name]---[local]---[hash:base64:5]',
camelCase: true,
},
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
autoprefixer({
browsers: [
'>1%',
'last 4 versions',
'Firefox ESR',
'not ie < 9', // React doesn't support IE8 anyway
],
flexbox: 'no-2009',
}),
],
},
},
],
}),
},
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
use: {
loader: 'url-loader',
options: {
limit: 1024,
name: '[name].[hash:8].[ext]', // index.css 中background: url(test.b33efd67.jpg);
},
},
},
],
},
};