在上篇Vuejs webp圖片支持表伦,插件開發(fā)過程~ 中我做了一個圖片轉換成webp的組件扁耐,并且使用了相關的loader碍彭,但是我們在使用過程中發(fā)現webp和原圖的hash是不一樣的,這樣我們就沒有辦法保留版本的概念了挣柬,臨時我使用時間戳來作為替代,但是這樣每次上傳都會重新上傳所有文件睛挚,有點浪費硬盤邪蛔,于是我今天做了這個towebp-loader
。
功能
towebp-loader
可以在webpack中根據圖片類型轉換成一份webp
和原圖兩份圖片扎狱,并且集成了url-loader
的功能 支持url的limit
功能和file-loader
文件名的功能侧到。
使用方法
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'towebp?' + JSON.stringify({
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
})
},
配合vue-webp指令使用效果更佳哦
vue-webp
使用方法

關鍵源碼講解
……
// 獲取loader中的查詢字符串 使用webpack loader api
var query = loaderUtils.parseQuery(this.query);
// 保存源文件的路徑如果穿 name就使用不然使用默認hash.ext模式
var url = loaderUtils.interpolateName(this, query.name || "[hash].[ext]", {
content: content,
regExp: query.regExp
});
// webp 文件的保存路徑
var webpUrl = url.substring(0, url.lastIndexOf('.')) + '.webp';
// limit參數來自url-loader 如果小于這個值使用base64字符串替換圖片
if (query.limit) {
limit = parseInt(query.limit, 10);
}
var mimetype = query.mimetype || query.minetype || mime.lookup(this.resourcePath);
if (limit <= 0 || content.length < limit) {
callback( "module.exports = " + JSON.stringify("data:" + (mimetype ? mimetype + ";" : "") + "base64," + content.toString("base64")));
}
……
// 轉換原圖成webp
imagemin.buffer(content, { plugins: [imageminWebp(options)] }).then(file => {
// 保存原圖
this.emitFile(url, content);
// 保存壓縮后的webp圖片
this.emitFile(webpUrl, file);
callback(null, "module.exports = __webpack_public_path__ + " + JSON.stringify(url) + ";");
}).catch(err => {
callback(err);
});
……
主要代碼都在這里了。還有一些webpack loader的API 大家仔細去讀相關文檔