配合前面写的webp-loader
,接下来接收到webp-loader传递过来的数据,继续把文件处理成一个svg格式的placeholder。
var loaderUtils = ;var validateOptions = ;var sqip = ;var schema = ;// https://codepen.io/tigt/post/optimizing-svgs-in-data-uris{var uriPayload =;return "data:image/svg+xml," + uriPayload;}module {// 接收webp-loader传递过来的buffervar contentBuffer = sourcebuffer;thiscacheable && this;// 获取options并校验var options = loaderUtils || {};;if contentBuffervar content = contentBuffer;var filePath = thisresourcePath;var contentIsUrlExport = /^module.exports = "data:base64,/;//var contentIsFileExport = /^module.exports = (.*)/.test(content);var src = "";// 对于base64格式的内联图片,不做任何处理,直接返回if contentIsUrlExportsrc = content1;if optionsskipPreviewIfBase64return 'module.exports = { "originSrc": ' + src + ', "preview": "" };';// svg格式的图片也不做处理,直接返回(svg不需要placeholder)if filePath === 'svg'return 'module.exports = { "originSrc":__webpack_public_path__ +"' + sourceurl + '", "preview": "" };';// 处理loader optionsvar numberOfPrimitives = "numberOfPrimitives" in options ? : 20;var mode = "mode" in options ? : 0;var blur = "blur" in options ? : 12;// 生成svg格式的占位符图片var sqipResult =;var encodedSvgDataUri = ;var dimensions = JSON// 拼接需要返回的modulereturn 'module.exports = {' +'"originSrc": __webpack_public_path__ + "' + sourceurl +'" , "webpSrc": __webpack_public_path__ + "' + sourcewebpUrl +'" , "preview": "' + encodedSvgDataUri +'", "dimensions": ' + dimensions +' };';};
项目实战
一张原图片在经过webp-loader
,svg-placeholder-loader
的处理之后,最终导出的图片数据为:
;console// {// dimensions: {height: 1002, width: 668, type: "jpg"},// originSrc: "/static/media/girl.jpeg",// preview: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='........'",// webpSrc: "/static/media/girl.jpeg.webp",// }
配合实际的React项目(绝不仅限于React项目,同样适用于Vue,Jquery的项目)来用就是: webpack.config.js 配置:
test: /\.bmp$/ /\.gif$/ /\.jpe?g$/ /\.png$/ /\.svg$/use:loader: pathoptions:numberOfPrimitives: 20loader: pathoptions:limit: 1000name: 'static/media/[name].[ext]'
;{return <Picture img=girl alt='my girl' className='my-girl' />};{super;thissvg = React;}{thissvgcurrentstyleopacity = 0;eventtargetstyleopacity = 1;}{const img alt className = thisprops;return<div className='picture'><img src=imgpreviewalt=altclassName='svg ' + classNameref=thissvg /><picture><source srcSet=imgwebpSrctype="image/webp"/><img onLoad=thishandleImgLoadsrc=imgoriginSrcalt=altclassName='img ' + className/></picture></div>}PicturepropTypes =img: PropTypesshapepreview: PropTypesstringisRequiredoriginSrc: PropTypesstringisRequiredwebpSrc: PropTypesstringisRequiredalt: PropTypesstringisRequiredclassName: PropTypesstringisRequired;
Summary
经过上面的学习,webpack loader从开发到实战都应该有了一个清晰的认识,并且有了在项目中实战的例子
不过不得不说的是,使用loader一方面会方便我们处理图片,另一方面也会降低项目启动和打包的速度(尽管充分利用了异步和缓存),我还是更倾向于配合gulp的watch功能,监听图片的新增实现图片的转换,会大大的提高webpack的处理速度。