通常我做网站时,会用到图片资源,那一般有两种引入方式,一是img
标签的src
属性,而是通过css
的background-image
属性来家在图片,那这两种模式我们怎么在webpack
中打包呢?接下来就讲解图片的打包操作。
使用file-loader来处理图片
1.yarn add file-loader --dev
。安装file-loader
插件。
2.接着我们的项目,引入一张图片,并动态创建img标签将图片载入。
// src/js/image.js
// 在js同级目录下创建了images文件夹,添加了一张图片
import oneImage from '../images/1.jpg'
const createImage = () => {
// 创建一个div容器
const container = document.createElement('div');
// 创建img标签,通过require引入
const image = document.createElement('img');
image.src = oneImage;
image.width = 500;
container.appendChild(image);
return container;
}
document.body.appendChild(createImage());
// src/app.js
// 将处理图片的文件引入
import { start } from './js/start'
import './js/image'
start();
console.log('app.js被打包了')
3.修改webpack.config.js
文件,添加对图片处理的规则。
// webpack.config.js
{
test: /\.(png|svg|gif|jpe?g)$/,
use: ['file-loader']
}
通过上述步骤我们图片就被打包成功了,当然我们还有另外两种方式引入图片:
// src/js/image.js
// 通过require的方式导入
image.src = require('../images/1.jpg').default;
如果不想加default,则还需要修改webpack的配置,同样也能得到想要的结果
// src/js/image.js
image.src = require('../images/1.jpg')
// webpack.config.js
{
test: /\.(png|svg|gif|jpe?g)$/,
use: [
{
loader: 'file-loader',
options: {
esModule: false
}
}
]
}
那接下来我们尝试打包背景图片,添加一个标签,以及为他添加背景图片。
// src/css/image.css
.bg-image {
width: 100px;
height: 200px;
border: 1px solid red;
background: url('../images//1.jpg');
}
// src/js/image.js
import oneImage from '../images/1.jpg'
import '../css/image.css'
const createImage = () => {
// 创建一个div容器
const container = document.createElement('div');
// 创建img标签,通过require引入
const image = document.createElement('img');
image.src = oneImage;
image.width = 500;
container.appendChild(image);
// 创建img标签,用css添加background属性
const bgImage = document.createElement('img');
bgImage.className = 'bg-image';
container.appendChild(bgImage);
return container;
}
document.body.appendChild(createImage());
之后我们在重新打包,发现图片并没有加载进来,而且我们build
的文件夹下还多了一个图片文件,这里就可以理解为css-loader
在处理图片时会require这个图片,但是我们又没办法在css
文件中加上default
属性,所以我们需要修改的是css-loader
里的配置。
// webpack.config.js
// 加上不做esModule的转换
{
loader: 'css-loader',
options: {
importLoaders: 1,
esModule: false
}
},
之后我们该怎么自定义打包完之后的图片名称以及路径呢?
我们还是要修改file-loader
的参数。这里有一些关键字:
[ext]
是文件扩展名。
[name]
是文件的名称。
[hash: 4]
生成4位的hash值。
// webpack.config.js
{
test: /\.(png|svg|gif|jpe?g)$/,
use: [
{
loader: 'file-loader',
options: {
name: 'images/[name].[hash:6].[ext]'
}
}
]
}
使用uril-loader来处理图片
1.yarn add url-loader --dev
。安装url-loader
插件。
2.我们直接把file-loader
的规则改为url-loader
来处理。
// webpack.config.js
{
test: /\.(png|svg|gif|jpe?g)$/,
use: ['url-loader']
}
重新运行打包,我们发现在build
文件夹下并没有图片产生,浏览器检查工具可以查看到是图片已经被转换为base64
的图片资源了。可知url-loader
默认是帮我们把所有图片资源转换为base64
的资源直接加载的,当文件比较大时,这样做其实是不对的,所以我们要配置url-loader
的属性。
// webpack.config.js
{
test: /\.(png|svg|gif|jpe?g)$/,
use: [
{
loader: 'url-loader',
options: {
name: 'images/[name].[hash:6].[ext]',
limit: 25 * 1024
}
}
]
}
我们限制了图片的大小,当超过这个大小时,就跟file-loader
处理图片一样,当小于时,就转换为base64
的资源。
使用webpack内置的asset模块直接来处理图片。
asset/resource --- file-loader
asset/inline --- url-loader
asset/source --- raw-loader
// webpack.config.js
// asset/resource打包图片类似于file-loader
{
test: /\.(png|svg|gif|jpe?g)$/,
type: 'asset/resource',
generator: {
filename: 'images/[name].[hash:8].[ext]'
}
}
// webpack.config.js
// asset/inline打包图片类似于默认的url-loader
{
test: /\.(png|svg|gif|jpe?g)$/,
type: 'asset/inline',
}
那我们想限制大小选择输出图片类型呢?
// webpack.config.js
{
test: /\.(png|svg|gif|jpe?g)$/,
type: 'asset',
generator: {
filename: 'images/[name].[hash:8].[ext]'
},
parser: {
dataUrlCondition: {
maxSize: 150 * 1024
}
}
}
打包图片的知识我们就学习完啦!接下来就是打包字体啦!