loader如何处理图片呢,图片是神马,是buffer(也就是原始值)将图片的原始值转化为 base64
格式的图片 也可新建一个图片将其源数据覆盖到进新图片中
案例
工程目录视图
webpack-config-js 的配置如下
module.exports = {
mode:"development",
devtool:'source-map',
module:{
rules:[
{
test:/\.(jpb)|(png)|(gif)$/,
use:[{
loader:"./loaders/img-loader.js",
options:{
// 参数
limit:3000,
//3000字节以上使用图片,3000字节以内使用base64
// img 的buffer的长度(img二进制的字节长度)
filename:"img-[contenthash:5].[ext]",
// contenthash 会根据文件产生对应的hash值
//[ext]:占位符,根据内容生成后缀名
}
}]
}
]
}
}
img-loader.js 的源码
var loaderUtil = require("loader-utils")
function loader(buffer){
// 获取参数
var {limit = 1000 , filename = '[contenthash].[ext]'} = loaderUtil.getOptions(this)
// 当img的buffer的长度大于limit 使用文件的方式, 当小与使用base64 的格式
if(buffer.byteLength >= limit){
// 使用文件的方式
var content = getFilePath.call(this,buffer,filename)
}else{
// 使用base64 的格式
var content = getBase64(buffer)
}
return `module.exports = \`${content}\``
}
loader.raw = true; //该loader要处理的是原始数据
module.exports = loader;
/**
* 将img的buffer 做成base64 的个格式再将其返回
* @param {*} buffer img的原始值也即是buffer
*/
function getBase64(buffer){
return "data:image/png;base64,"+ buffer.toString("base64");
}
/**
* 将其新建一个img
* @param {*} buffer img 的原始值
* @param {*} filename img的名字
*@returns 返回一个文件名
*/
function getFilePath(buffer, filename){
// 新建img
var filename = loaderUtil.interpolateName(this,filename,{
content:buffer
})
// 将img 添加进最终生成的文件
this.emitFile(filename, buffer);
return filename;
}
index.js 里的源码
var src = require("./assets/webpack.png")
console.log(src)
var img = document.createElement('img')
img.src = src;
document.body.appendChild(img)
效果图