Webpack将所有的静态资源都视为模块,比如JavaScript,scss,图片等,从而引入对应的loader去
加载相应的资源,并且处理成相应的模块。和大多数包管理器不一样的是,Webpack的加载器之间可以进行串联,一个加载器的输出可以成为另一个加载器的输入。
如下图,Less资源首先通过
less-loader
模块加载器加载为css资源,然后通过css-loader
模块加载器转化为css模块,最后再更加style-loader
编译转化为适合特定浏览器的最终可适用样式资源。

常见loader
一般我们项目中,常用的一些模块加载器包括。
1 | npm install file-loader css-loader style-loader sass-loader html-loader babel-loader url-loader --save-dev |
在webpack中添加相关的配置:
1 | { |
随后,使用webpack打包,再看输出的文件,只有一个js文件以及几个图片大小超过10kb的图片,并没有打包出独立的css文件,所以:
- webpack 会把所有的资源都糅合打包成一个js文件,图片如果小于一定大小,会转化为base64的url
- 如果内容比较多,打包出来的js文件可能会非常大。
当遇到大型项目的时候,这样做显然对性能会有一定的影响,那么如何优化呢?
mini-css-extract-plugin 分离css静态资源
在webpack < 4
版本中,使用extract-text-webpack-plugin
, 4以上的版本,已经不推荐使用此插件处理css了。
Since webpack v4 the extract-text-webpack-plugin should not be used for css. Use mini-css-extract-plugin instead.
安装
1 | npm install --save-dev mini-css-extract-plugin |
配置webpack, 最简单的例子:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
需要区别是开发或者生产环境:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
在生产环境,对css文件进行压缩和乱化:
1 | minimizer: [ |
当我们需要把所有的css都在一个文件时, 利用webpack splitChunks功能:
1 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); |
再次打包,会发现:
- css单独抽离,打包成单独的css文件
- html自动引用css文件
- 小于10k的图片,转成base64 格式的 dataUrl
extract-text-webpack-plugin 分离css静态资源
现阶段,很多项目,还是使用的是webpack@3 的版本,所以要完成上面的步骤,还是使用extract-text-webpack-plugin
插件的。
安装插件:
1 | npm install extract-text-webpack-plugin --save-dev |
修改相关配置:
1 | var ExtractTextPlugin = require('extract-text-webpack-plugin'); |
有写的不当之处,欢迎指正,谢谢~