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){// 新建imgvar 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)
效果图
