webpack - 理论篇

entry

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {String} - String 时 打包为一个文件,默认包名 main.js
* @param {Array} - Array 时 webpack会把数组里所有文件打包成一个js文件
* @param {Object} - Object 时 webpack会把对象里的文件分别打包成多个文件
*
*/
module.exports = {
entry: './index.js',

entry: ['./index.js', './about.js'],

entry: {
app: './index.js',
about: './about.js'
},

entry: {
app: './index.js',
vendors: ['jquery'] // 分离第三方库
}
}

vendors 第三方库

// 待补充

output

指示 webpack 如何去输出、以及在哪里输出、输出的格式等

1
2
3
4
5
6
7
8
9
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'), // 输出文件的目录
filename: 'js/[name].[chunkhash:8].js', // 打包路径及名称
chunkFilename: 'js/[name].[chunkhash:8].js' // 按需加载
// publicPath:文件输出的公共路径,
//...
}
}

resolve

配置模块如何解析

  • extensions:自动解析确定的扩展,省去你引入组件时写后缀的麻烦,
  • alias:非常重要的一个配置,它可以配置一些短路径,
  • modules:webpack 解析模块时应该搜索的目录,
1
2
3
4
5
6
7
8
9
module.exports = {
resolve: {
extensions: ['.js', '.jsx', '.ts', '.tsx', '.scss', '.json', '.css'],
alias: {
'@': path.resolve(__dirname, 'src')
},
modules: [path.resolve(__dirname, 'src'), 'node_modules']
}
}

module.rules

  • rules:也就是之前的 loaders,
  • test : 正则表达式,匹配编译的文件,
  • exclude:排除特定条件,如通常会写 node_modules,即把某些目录/文件过滤掉,
  • include:它正好与 exclude 相反,
  • use -loader :必须要有它,它相当于是一个 test 匹配到的文件对应的解析器,babel-loaderstyle-loadersass-loaderurl-loader 等等,
  • use - options:它与 loader 配合使用,可以是一个字符串或对象,它的配置可以直接简写在 loader 内一起,它下面还有 presetsplugins 等属性;

plugins

// 另一篇文章 webpack - plugins 篇 敬请期待

devtool

  • 控制是否生成,以及如何生成 source map 文件,开发环境下更有利于定位问题,默认 false,
  • 当然它的开启,也会影响编译的速度,所以生产环境一定一定记得关闭;
  • 常用的值:cheap-eval-source-mapeval-source-mapcheap-module-eval-source-mapinline-cheap-module-source-map 等等
1
devtool: 'eval-source-map' // 原始源代码

webpack-dev-server

  • contentBase :告诉服务(dev server)在哪里查找文件,默认不指定会在是当期项目根目录,
  • historyApiFallback:可以是 boolean、 object,默认响应的入口文件,包括 404 都会指向这里,object 见下面示例:
  • compress:启用 gzip 压缩,
  • publicPath:它其实就是 output.publicPath,当你改变了它,即会覆盖了 output 的配置,
  • stats: 可以自定控制要显示的编译细节信息,
  • proxy:它其实就是 http-proxy-middleware,可以进行处理一些代理的请求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const webpack = require('webpack')

module.exports = {
devServer: {
contentBase:'./assets',
port: 1234,
open: true, // 自动打开浏览器
compress: true // 服务器压缩
hot: true // 配合 HotModuleReplacementPlugin 使用
//... proxy、hot
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
}

optimization

  • optimizationwebpack4 新增的,主要是用来让开发者根据需要自定义一些优化构建打包的策略配置,
  • minimize:true/false,告诉 webpack 是否开启代码最小化压缩,
  • minimizer:自定 js 优化配置,会覆盖默认的配置,结合 UglifyJsPlugin 插件使用,
  • removeEmptyChunks: bool 值,它检测并删除空的块。将设置为 false 将禁用此优化,
  • nodeEnv:它并不是 node 里的环境变量,设置后可以在代码里使用 process.env.NODE_ENV === ‘development’来判断一些逻辑,生产环境 UglifyJsPlugin 会自动删除无用代码,
  • splitChunks :取代了 CommonsChunkPlugin,自动分包拆分、代码拆分,详细默认配置:
  • 默认配置,只会作用于异步加载的代码块 —— chunks: ‘async’,它有三个值:all,async,initial
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
module.exports = {
// 优化构建打包的策略配置
optimization: {
minimize: true, // 是否开启代码最小化压缩 默认 false
//splitChunks 默认配置
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
}

配合 UglifyJsPlugin

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
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')

module.exports = {
// 优化构建打包的策略配置
optimization: {
minimizer: [
new UglifyJsPlugin({
cache: true, // 开启缓存
parallel: true, // 开启多线程编译
sourceMap: true, // 是否sourceMap
uglifyOptions: {
// 丑化参数
comments: false,
warnings: false,
compress: {
unused: true,
dead_code: true,
collapse_vars: true,
reduce_vars: true
},
output: {
comments: false
}
}
})
]
}
}

参考