From 1c629032d1284e6d1e2034e393aa68f11bdd584b Mon Sep 17 00:00:00 2001 From: Daniel Bulant Date: Wed, 25 Aug 2021 18:04:31 +0200 Subject: [PATCH] convert images to webp automatically --- imageMaker.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- rollup.config.js | 4 ++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 imageMaker.js diff --git a/imageMaker.js b/imageMaker.js new file mode 100644 index 0000000..87c0bfe --- /dev/null +++ b/imageMaker.js @@ -0,0 +1,48 @@ +import webp from "webp-converter"; +import fs from "fs/promises"; +import fsSync from "fs"; +import path from "path"; + +async function convertFolder({ folder, production, base, out, ref }) { + const promises = []; + for(const file of await fs.readdir(folder)) { + const loc = path.join(folder, file); + const stat = await fs.stat(loc); + if(stat.isDirectory()) { + promises.push(convertFolder({ folder: loc, production, base, out })); + } else if([".png", ".jpg", ".jpeg"].includes(path.extname(loc))) { + var rel = loc.substr(base.length); + rel = rel.substr(0, rel.length - path.extname(rel).length); + + const targetFile = path.join(out, rel + ".webp"); + if(fsSync.existsSync(targetFile)) continue; + + var target = path.join(out, rel); + console.log("target", target, path.basename(target)); + var dir = target.substr(0, target.length - path.basename(target).length); + console.log("dir", dir); + if(!fsSync.existsSync(dir)) await fs.mkdir(dir, { recursive: true }); + + promises.push(webp.cwebp(loc, targetFile, "-q 80")); + } else { + ref.warn("Non-image file found:", loc); + } + } + return await Promise.all(promises); +} + +export function makeImages({ folders, production }) { + return { + name: "image-maker", + generateBundle: async function makeImages() { + webp.grant_permission(); + + const base = path.join(__dirname, "images/png"); + const out = path.join(__dirname, "public/sprite"); + await fs.mkdir(out, { recursive: true }); + const ref = this; + folders = folders.map(folder => path.join(base, folder)); + await Promise.all(folders.map(folder => convertFolder({ folder, production, base, out, ref }))); + } +}; +}; \ No newline at end of file diff --git a/package.json b/package.json index 91e8dac..a2c0d5c 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "hammerjs": "^2.0.8", "howler": "^2.2.1", "phaser": "^3.54.0", - "sirv-cli": "^1.0.0" + "sirv-cli": "^1.0.0", + "webp-converter": "^2.3.3" } } diff --git a/rollup.config.js b/rollup.config.js index f06b0bd..a65dcdf 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -6,8 +6,11 @@ import { terser } from 'rollup-plugin-terser'; import css from 'rollup-plugin-css-only'; import workbox from 'rollup-plugin-workbox'; import replace from "@rollup/plugin-replace"; +import { makeImages } from './imageMaker'; const production = !process.env.ROLLUP_WATCH; +// List of folders from images/png to convert to webp and save into public/sprite +const imageFolders = ["angels", "backgrounds", "button", "death", "levels"]; function serve() { let server; @@ -59,6 +62,7 @@ export default [{ dedupe: ['svelte'] }), commonjs(), + makeImages({ folders: imageFolders, production }), // In dev mode, call `npm run start` once // the bundle has been generated