-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
150 lines (140 loc) · 5.36 KB
/
webpack.config.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 path = require("path/posix");
const { HotModuleReplacementPlugin,} = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin")
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin")
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const {CleanWebpackPlugin} = require("clean-webpack-plugin");
const { glob } = require("glob");
const setMPA = () => {
const entry = {}
const htmlWebpackPlugins = []
const entryFiles = glob.sync(path.join(__dirname,'./src/*/index.js'))
Object.keys(entryFiles).map(index => {
const entryFile = entryFiles[index]
const match = entryFile.match(/src\/(.*)\/index\.js/)
const pageName = match && match[1]
entry[pageName] = entryFile
htmlWebpackPlugins.push(
new HtmlWebpackPlugin({
title:"webpack-test",
inject:true, // 是否控制在底部加载引入的js
template:path.join(__dirname,`src/${pageName}/index.html`), // 模版html
filename:`${pageName}.html`, // 生成的html文件名
chunk:[pageName],
minify:{
html5:true, // 根据HTML5规范解析输入
collapseWhitespace:true, // 移除换行符
minifyCSS:true, // 压缩html内样式
minifyJS:true, // 压缩js内样式
removeComments:true // 移除注释
}
})
)
})
return {
entry,
htmlWebpackPlugins
}
}
const {entry,htmlWebpackPlugins} = setMPA()
module.exports = {
// entry:'./src/index.js', // 需要打包的单页面入口文件
entry, // 多页面打包
output:{
filename:'[name]_[chunkhash:8].js', // 输出的文件名
path:path.resolve(__dirname,'dist') // 输出的文件夹名
},
watch:true,
module:{
rules:[
// css转换loader
{
test:/.css$/,
use:[
MiniCssExtractPlugin.loader,
{
loader:'css-loader'
}
]
},
// less转换loader
{
test:/.less$/,
use:[
MiniCssExtractPlugin.loader,
{
loader:'css-loader'
},
{
loader:'less-loader'
},
{
// loader:'postcss-loader',
// options:{
// plugins:() => {
// require('autoprefixer')({
// borwsers:['last 2 version','>1%','ios 7'] // webpack5中不支持了
// })
// }
// }
loader:'postcss-loader',
options:{
postcssOptions:{
ident:"postcss",
plugins:[
// require('autoprefixer')()
require('postcss-preset-env')() //自动给css3属性加上前缀 需要在package.json中配置browserslist栏目
]
}
}
}
]
},
// 将es5 es6语法转换的loader
{
test:/.js$/,
use:'babel-loader',
exclude:/node_modules/
},
// 图片资源loader
{
test:/(.jpg|.jpeg|.png)$/,
use:'file-loader'
}
]
},
mode:'development',
plugins:[
new HotModuleReplacementPlugin(), // 热更新插件
new MiniCssExtractPlugin({
filename:'css/common.css'
}), // 分离出一个css的独立文件
// 单页面
// new HtmlWebpackPlugin({ // html生成插件
// title:"webpack-test",
// inject:true, // 是否控制在底部加载引入的js
// template:'./src/index.html', // 模版html
// filename:'index.html', // 生成的html文件名
// chunk:['index'],
// minify:{
// html5:true, // 根据HTML5规范解析输入
// collapseWhitespace:true, // 移除换行符
// minifyCSS:true, // 压缩html内样式
// minifyJS:true, // 压缩js内样式
// removeComments:true // 移除注释
// }
// }),
new CssMinimizerPlugin(),//webpack5中css压缩插件
new CleanWebpackPlugin() //自动清除构建产物
// new OptimizeCssAssetsPlugin({
// assetNameRegExp:/\.css$/g,
// cssProcessor:require('cssnano')
// }) // webpack5已不支持
].concat(htmlWebpackPlugins), // 多页面打包
devServer:{
static:path.join(__dirname,'dist'), // 需要监测的文件夹路径
hot:true, // 是否需要热更新
port:3003 // 打开的网页的端口号
}
}