Webpack 中loader的使用
本文最后更新于:2022年4月22日 上午
leader 是 Webpack 中比较重要的一个概念,webpack 默认只能处理 js 和 json 文件,对于一些其它的文件(例如.css 文件),webpack 默认是不支持的,这个时候,我们可能需要使用一些合适的 loader 来对这些文件进行处理
loader 的基本使用
loader需要配置在 module 对象中的 rules 中,rules 是一个数组,数组中是一个个对象, 配置 loader 需要有两个必须的属性
test用于匹配需要处理的文件use配置需要使用的 loader
示例使用
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'css-loader',
]
}
]
}
}以上是loader的基本使用,示例了 css-loader 的使用,按照上述配置后,当我们在代码中引入了 .css 文件时,会发现我们的样式并没有生效,是因为 css-loader 只会帮我解析 .css 文件的引用,但是没有帮我把这些 css 添加到网页中
这时候我们需要使用 style-loader 来帮我们做这些操作
style-loader 的使用
style-loader 会帮我创建一个 style 标签,并帮我们把样式注入进去
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
]
}
]
}
}配置完 style-loader 后基本就可以满足我们项目中的 css 的基本使用了,但是我们在实际开发中,经常是使用 less 或 sass 等 css 预处理器来编写样式,这个时候我们的配置显然就不满足了,我们以 less 举例
眼尖的朋友会注意到 style-loader 在 css-loader 前面,是因为 webpack 在加载 loader 时是从后往前加载的
less-loader 的使用
less-loader 的使用配置很简单,sass 同理
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
'less-loader',
]
}
]
}
}到目前为止,以上的配置基本上够我们项目中使用了,但是当我们把我们的项目跑在不同的浏览器中,可能会出现样式失效的情况,这是为什么呢
因为我们编写的很多样式都是基于主流浏览器适配的,所以跑在不同浏览器时我们需要加上浏览器前缀,但是我们所有的样式都要手动加上浏览器前缀的话,工作量就太大了,这时候我们就需要一个合适的 loader 来帮我们完成这些操作
postcss-loader 的使用
在 webpack 中使用 PostCss 需先安装 postcss-loader, 并在 webpack.config.js 配置使用 postcss-loader
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader' },
{ loader: 'postcss-loader' }
],
}
]
}
}然后在根目录 创建 postcss.config.js
PostCss 中 autoprefixer 的使用
postcss.config.jsmodule.exports = {
plugins:[
'autoprefixer'
]
}autoprefixer 会自动给不同浏览器添加一些前缀,配置完后我们写的样式代码就可以跑在所有现代浏览器了,但当我们的项目在低版本浏览器打开时,会发现我们写的样式可能还是不生效的情况,这个时候,我们就需要再使用另一个 PostCss 的插件了
autoprefixer是PostCss中的一个插件,它会使用 borwserslist 根据 Can I Use 的数据来给不同浏览器自动添加上前缀,如果项目中未对 borwserslist 配置,则会使用默认值
> 0.5%, last 2 versions, Firefox ESR, not dead,表示全球市场占有率 大于
0.5%,最后两个版本, 最新的Firefox ESR版本,没有死亡的(24个月内更新过版本的浏览器),其中只要满足一个条件就会自动添加前缀
关于 Can I Use 和 borwserslist 不在本篇博客的探讨范围之内
PostCss 中 postcss-preset-env 的使用
postcss-preset-env 可以帮我们把最新的 css 特性转换为大多数浏览器都可以识别的样式代码postcss-preset-env 已经集成了 autoprefixer ,并且默认开启, 所以可以去除 autoprefixer
postcss.config.jsmodule.exports = {
plugins:[
'postcss-preset-env'
]
}配置完 postcss-preset-env 后我们的css代码就可以随心所欲的跑在所有主流浏览器了
file-loader 的使用
当我们在代码中使用了一些图片等静态资源,就需要使用 file-loader 来帮我们处理了,
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader' },
{
loader: 'postcss-loader',
}
],
},
{
test: /\.(png|svg|jpg)$/,
use: [
{
loader: 'file-loader',
options: {
name:'img/[name].[hash:6].[ext]'
}
}
]
}
]
}
}如果我们在js代码中 使用过 import 或者 require 的方式引入静态图片资源,file-laoder 默认的配置需要我们 再通过 .default 来获取图片,因为它默认帮我们转换成 es6 模块化了
如:
index.jsimport logo from './assets/images/logo.png';
...
<img src={log.default}>
...
如果不想使用这种方式,我们还需要对 file-loader 进行一些额外的配置, esModule: false
webpack.config.js...
{
test: /\.(png|svg|jpg)$/,
use: [
{
loader: 'file-loader',
options: {
name: 'img/[name].[hash:6].[ext]',
esModule: false
}
}
]
}
...
options 中的配置项目 可从 webpack官网 中查询到
上述配置表示在 打包后把图片放到img文件下,保留原文件名并拼接上6位的hash值,最后保留原有文件的扩展名
url-loader 的使用
url-loader 的功能和 file-loader 类似,
相当于对 file-loader 进行增强,并且可以通过 limit 属性来配置限制,
大于这个限制的 图片会被交给 file-loader 处理,小于这个限制的会被转换成 base64 的格式,直接打包进源代码
但是可以设置指定大小内的图片转换为base64格式的图片,加载网页时一并加载出来
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader' },
{
loader: 'postcss-loader',
}
],
},
{
test: /\.(png|svg|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 1024 * 100
}
}
]
},
]
}
}html-loader
可以解决在 html 文件中使用 img 标签使用的 url 问题
webpack 5 中 asset 的使用
在 webpack 5 中,给我们内置了一些模块,可以在不使用其它 loader 的时候使用 图片、字体等文件
asset/resource发送一个单独的文件并导出 URL。之前通过使用file-loader实现。asset/inline导出一个资源的 data URI。之前通过使用url-loader实现。asset/source导出资源的源代码。之前通过使用raw-loader实现。asset在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用url-loader,并且配置资源体积限制实现。
asset/resource 的使用
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.(png|svg|jpg|gif)$/,
type: 'asset/resource',
generator: {
filename: 'img/[name].[hash:6][ext]'
}
},
]
}
}asset/inline 的使用
使用 asset/inline 资源会以 base64 的格式来展示
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.(png|svg|jpg|gif)$/,
type: 'asset/inline',
},
]
}
}asset 的使用
当我们有些图片资源过大时,我们是不希望它也被转换成base64 的,此时,就可以使用 asset 模块来帮我们做转换,
当我是不设置 parser 时,asset 会默认将小于 8kb 的资源使用 inline 来选择 inline 类型,大于的会选择 resource 类型,
当我们想要手动配置大小时,示例代码如下
webpack.config.jsconst path = require('path');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './build'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.(png|svg|jpg|gif)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 100 * 1024,
}
}
},
]
}
}本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处。