在上篇Vuejs webp圖片支持,插件開發過程~ 中我作了一個圖片轉換成webp的組件,而且使用了相關的loader,可是咱們在使用過程當中發現webp和原圖的hash是不同的,這樣咱們就沒有辦法保留版本的概念了,臨時我使用時間戳來做爲替代,可是這樣每次上傳都會從新上傳全部文件,有點浪費硬盤,因而我今天作了這個towebp-loader
。html
towebp-loader
能夠在webpack中根據圖片類型轉換成一份webp
和原圖兩份圖片,而且集成了url-loader
的功能 支持url的limit
功能和file-loader
文件名的功能。vue
{ test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'towebp?' + JSON.stringify({ limit: 10000, name: utils.assetsPath('fonts/[name].[hash:7].[ext]') }) },
vue-webp
使用方法webpack
![](abc.jpg)
…… // 獲取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) { return "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 你們仔細去讀相關文檔git