A webgl GLSL minifier based on Angle compiler
JavaScript
28
111 commits
updated Apr 22, 2025
Executes preprocessor directives, removes whitespaces, applies constant folding, mangle non exported functions and variable names. Used in "Island Not Found" https://github.com/SalvatorePreviti/js13k-2020 and "Dante" https://github.com/SalvatorePreviti/js13k-2022 (first place on JS13K 2022)
Package is precompiled at https://www.npmjs.com/package/spglsl
It includes a rollup plugin.
For an esbuild plugin, see https://github.com/rottencandy/esbuild-plugin-spglsl
npm i spglsl --save
import { spglslAngleCompile } from "spglsl";
async function compileFile() {
const result = await spglslAngleCompile({
mainFilePath: "myfile.frag",
mainSourceCode: fs.readFileSync("myfile.frag", "utf8"),
minify: true,
// Mangle everything, except uniforms and globals, "main" and function starting with "main"
mangle: true,
// Map of global variables to rename
mangle_global_map: {
my_uniform_to_rename: "x",
my_fragment_input_to_rename: "y",
},
});
if (!result.valid) {
console.log(result.infoLog);
throw new Error("compilation failed");
}
// Prints all the uniform used, key is the original uniform name and value is the renamed uniform, if it was defined in mangle_global_map
console.log(result.uniforms);
// Prints all the globals used, key is the original variable name and value is the renamed uniform, if it was defined in mangle_global_map
// Globals are varying, vertex and fragment input, outputs and buffers ...
// Globals do not include uniforms.
console.log(result.globals);
return result.output;
}
There is also an handy rollup and vite plugin:
import { rollupPluginSpglsl } from "spglsl";
const pluginToPassToRollupOrVite = rollupPluginSpglsl({ ...options });
MIT license Salvatore Previti Copyright 2020-2022
Angle Copyright 2018 The ANGLE Project Authors.
The project is mostly C++, compiled to WASM with Emscripten and runnable in NodeJS. Look at project/scripts folder on how to install dependencies and build.
111 commits
JavaScript
48.8%
HTML
25.8%
C++
13.6%
GLSL
5.4%
TypeScript
5.4%
A webgl GLSL minifier based on Angle compiler
JavaScript
28
111 commits
updated Apr 22, 2025
Executes preprocessor directives, removes whitespaces, applies constant folding, mangle non exported functions and variable names. Used in "Island Not Found" https://github.com/SalvatorePreviti/js13k-2020 and "Dante" https://github.com/SalvatorePreviti/js13k-2022 (first place on JS13K 2022)
Package is precompiled at https://www.npmjs.com/package/spglsl
It includes a rollup plugin.
For an esbuild plugin, see https://github.com/rottencandy/esbuild-plugin-spglsl
npm i spglsl --save
import { spglslAngleCompile } from "spglsl";
async function compileFile() {
const result = await spglslAngleCompile({
mainFilePath: "myfile.frag",
mainSourceCode: fs.readFileSync("myfile.frag", "utf8"),
minify: true,
// Mangle everything, except uniforms and globals, "main" and function starting with "main"
mangle: true,
// Map of global variables to rename
mangle_global_map: {
my_uniform_to_rename: "x",
my_fragment_input_to_rename: "y",
},
});
if (!result.valid) {
console.log(result.infoLog);
throw new Error("compilation failed");
}
// Prints all the uniform used, key is the original uniform name and value is the renamed uniform, if it was defined in mangle_global_map
console.log(result.uniforms);
// Prints all the globals used, key is the original variable name and value is the renamed uniform, if it was defined in mangle_global_map
// Globals are varying, vertex and fragment input, outputs and buffers ...
// Globals do not include uniforms.
console.log(result.globals);
return result.output;
}
There is also an handy rollup and vite plugin:
import { rollupPluginSpglsl } from "spglsl";
const pluginToPassToRollupOrVite = rollupPluginSpglsl({ ...options });
MIT license Salvatore Previti Copyright 2020-2022
Angle Copyright 2018 The ANGLE Project Authors.
The project is mostly C++, compiled to WASM with Emscripten and runnable in NodeJS. Look at project/scripts folder on how to install dependencies and build.
111 commits
JavaScript
48.8%
HTML
25.8%
C++
13.6%
GLSL
5.4%
TypeScript
5.4%