前言
(ps: 本篇内容基于上一篇继续)
Webpack中必须掌握的配置
loader主要用于把模块原内容按照需求转换成新内容,可以加载非 JS 模块!
通过使用不同的Loader,Webpack可以把不同的文件都转成JS文件,比如CSS、ES6/7、JSX等。
我们来看看这些我们必须掌握的loader!
1.loader的编写
1.1 loader的使用
- test:匹配处理文件的扩展名的正则表达式
- use:loader名称,就是你要使用模块的名称
- include/exclude:手动指定必须处理的文件夹或屏蔽不需要处理的文件夹
- options:为loaders提供额外的设置选项
默认loader
的顺序是从下到上、从右向左执行,当然执行顺序也可以手动定义的,接下来我们依次介绍常见的loader,来感受loader
的魅力!
2.处理CSS文件
2.1 解析css样式
新建 /src/index.css
1 | body{ |
我们在inde.js
文件中引入css样式!
1 | import './index.css'; |
再次执行打包时,会提示css无法解析
1 | ERROR in ./src/index.css 1:4 |
安装loader
- 解析css 需要两个loader css-loader style-loader
- css-loader 会解析css语法,将解析出来的结果传递给style-loader, style-loader 会将解析的css 变成style标签插入到页面中
1 | npm install style-loader css-loader --save-dev |
1 | module:{ |
2.2 css预处理器
不同的css预处理器要安装不同的loader来进行解析
- .scss: node-sass sass-loader
- .less: less less-loader
- .stylus: stylus stylus-loader
下面以sass为例:npm install node-sass sass-loader --save-dev
新建/src/a.scss
1 | $background: black; |
index.js
1 | import './index.css'; |
1 | module:{ |
打包 npm run dev
可以看到页面上有个一块黑色的div
** 注意:**
在index.css文件中可能会使用@import
语法引用a.css
文件,被引用的a.css
文件中可能还会导入a.scss
这时去打包 是不会解析a.scss文件的,会把它当做css文件直接显示在页面中。
设置options,如下 :
1 | module:{ |
2.3 处理样式前缀
打包css的时候需要处理下样式前缀
index.css
1 | body{ |
使用postcss-loader
增加样式前缀
1 | npm install postcss-loader autoprefixer --save-dev |
1 | module:{ |
需要创建postcss
的配置文件postcss.config.js
1 | // 默认自动添加前缀 |
可以配置浏览器的兼容性范围, 新建文件.browserslistrc
1 | cover 95% |
意思表示能兼容95%的浏览器
** 如上可知 这样配置样式,开发的时候是可以的,上线时解析css的时候就不能渲染dom(因为它是单线程的,这样会将js、css都打包到一个bundle.js文件中), 希望css可以并行和js一同加载,所以现在将css抽离出来**
2.4 抽离样式文件
只在生产模式时进行样式抽离,抽离css的好处是可以和js并行加载。
安装抽离插件
1 | npm install mini-css-extract-plugin --save-dev |
webpack.base.js 配置文件如下:
1 | const path = require('path'); |
打包 npm run build
,可以看到 /dist/css/main.css 生成了css文件,样式抽离出来了。
2.5 css压缩
在生产环境下默认只压缩js,要想压缩css需自行配置。如下:
webpack.pro.js
1 | const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); |
在生产环境下我们需要压缩css
文件,配置minimizer
选项,安装压缩插件
1 | npm i optimize-css-assets-webpack-plugin terser-webpack-plugin --save-dev |
2.6 文件指纹
- Hash整个项目的hash值
- chunkhash 根据入口产生hash值
- contentHash 根据每个文件的内容产生的hash值
我们可以合理的使用hash
戳,进行文件的缓存
1 | !isDev && new MiniCssExtractPlugin({ |
3.处理文件类型
3.1 处理引用的图片
1 | npm install file-loader --save-dev |
1 | import logo from './webpack.png'; |
使用file-loader
,会将图片进行打包,并将打包后的路径返回
1 | { |
3.2 转化成base64
1 | npm install url-loader --save-dev |
使用url-loader
将满足条件的图片转化成base64,不满足条件的url-loader
会自动调用file-loader
来进行处理
1 | { |
url-loader 不适用的场景:
一个图片好几次或大量使用时,浏览器本来是有缓存的,结果你直接生成 base64 打包到代码里面,请求速度来讲无疑是不划算的。
3.3 处理icon
二进制文件也是使用file-loader
来打包
1 | { |