前言
馋webpack
已经很久了,今天就来学学吧。😜。
(第一版其实是2月份的文章了,但是最近这个月决定重新学webpack,所以决定把日期改成最近的时间)
概念
Webpack是一个前端资源加载/打包工具,也是前端工程化的体现。
Webpack基础配置
mode
mode
用来告知webpack
需要采用对应模式的内置优化。可以在webpack.config.js
里设置,也可以在npm
命令里添加 --mode
参数来设置。有以下两种:
- development
1
2
3
4
5
6
7
8// webpack.development.config.js
module.exports = {
mode: 'development'
plugins: [
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }),
]
} - production
1
2
3
4
5
6
7
8
9
10// webpack.production.config.js
module.exports = {
mode: 'production',
plugins: [
new UglifyJsPlugin(/* ... */),
new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }),
new webpack.optimize.ModuleConcatenationPlugin(),
new webpack.NoEmitOnErrorsPlugin()
]
}
设置mode时同时会把 process.env.NODE_ENV设置为当前环境的值
entry
entry
其实就是指定webpack
读取项目的起始点,配置方式有以下这些:
1 | const config = { |
loader
首先,webpack
本身的打包只是对js文件的打包,那么非js文件怎么打包进来呢?这个时候loader
的作用就体现出来了。loader
就是一个转译器,它可以把非js文件进行处理,然后使得非js文件可以进入构建包内。
那么如何使用loader
呢?
1 | const config = { |
其实还可以在cli
命令里加入以下--module bind 'css=style-loader!css-loader'
以及在源码中直接导入 loader
的东西,但是这两种方式都不太好,容易导致意外的错误且不易调试。
所以还是推荐写在modules.rules
。
这里就简单列举一些常用的loader
css-loader
: 解析css
文件style-loader
: 把解析好的css
用style
标签显示出来babel-loader
: 把es6
及之后的语法解析成es5
语法,最大的作用就是兼容浏览器。url-loader
,file-loader
:webpack
加载图片,url-loader
更像是file-loader
的增强版。当设置limit
时,超出此范围则用file-loader
解析,小于则返回base64
格式。raw-loader
: 读取文件内的内容,并作为字符串返回sass-loader
,less-loader
: css预编译文件解析。vue-loader
: 解析.vue
文件
1 | const config = { |
plugins
首先,plugin
的机制来说我个人觉得和浏览器内的交互事件其实比较类似。因为webpack
在运行周期时同样会有很多的事件,所以plugins
的作用可以类比于我们在浏览器中对元素的事件监听处理。其实就是我们调用webpack
的底层api
来编写具体功能的实现。它可以是一个构建时的处理,也可以是对输出结果的优化(其实就是打包优化),还可以对引入资源进行管理。从这里来看,plugins
的功能范围对比起loader
来说是更加广泛的。
那么如何使用plugins
呢? 其实只需要在webpack.config.js
里的plugins
参数里设置就可以了。
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
以下列举一些常用的插件:
mini-css-extract-plugin
&extract-text-webpack-plugin
- 作用:抽离
css
到单独的文件中并以link
引入到html
中使用。 - 使用:
webpack >= 4.0 ? mini-css-extract-plugin : extract-text-webpack-plugin
- 作用:抽离
html-webpack-plugin
1
2
3
4
5
6plugins:[
new HtmlWebpackPlugin({
template: './index.html', // 模板html,
filename: 'index.html', // 目标html
})
]mini-css-extract-plugin
- 打包的时候提取
css
到单独的文件,并且支持按需加载和sourceMap
- 打包的时候提取
progress-bar-webpack-plugin
vue-cli 3
打包的时候无法显示出打包所花费的时间,加这个可以显示出来
purge-css-webpack-plugin
- 删除未使用的
css
- 删除未使用的
DLLPlugin和DLLReferencePlugin
DLLPlugin
主要作用是把一些不经常变化的第三方库单独打包出来,然后会生成一个manifest.json
,然后通过DLLReferencePlugin
去引用。可以提升构建速度
add-asset-html-webpack-plugin
- 页面打包后,插入我们特定
script
的引用,来达到全局变量的效果(暴露在Window
下)
- 页面打包后,插入我们特定
commons-chunk-plugin
&split-chunk-plugin
- 两者主要是用来提取第三方库和公共模块代码,避免首屏加载的bundle文件或者按需加载的bundle文件体积过大,从而导致加载时间过长。
- 后者是前者的升级版,解决了前者在提取公共代码的重复问题。且webpack4中已经删除了
commons-chunk-plugin
改用了split-chunk-plugin
。
1
2
3
4
5
6
7
8
9
10
11
12// commons和split的对比
// commons-chunk-plugin
chunk-a: react, react-dom, a-comp
chunk-b: react, react-dom, b-comp
// 会出现重复代码
// split-chunk-plugin
chunk-a ~ chunk-b : react, react-dom,
chunk-a: a-comp
chunk-b: b-comp
// 不会出现重复代码
resolve
resolve
的作用是设置模块怎么被解析,数据结构是Object
。接下来列举一些比较常用的属性。
alias
alias
作用是设置别名,可以使得引入模块变得更加简单。举个栗子:
1 | // 配置 |
extensions
extensions
作用是自动扩展,可以自动解析确定的扩展。举个栗子:
1 | // 配置 |
modules
modules
作用是告诉webpack解析时应该搜索的目录。举个栗子:
1 | // 配置 |
devServer
devServer
是开发中用来启动本地服务,方便开发。下面举个栗子来说明各属性作用😂
1 | // 配置 |
externals
按照webpack
官网里的解释,如果我们想引用一个库,但是又不想把webpack
把它打进包里且我们希望可以正常引用这个库。这个时候就可以使用externals
配置。例如官网中的栗子:
1 | // index.html |
相关文章
总结
其实看了这些配置,基础的webpack配置已经没有啥大问题了。还有一些比较小的点就没写了,之后有疑问也可以去webpack中文网查看对应部分配置。