Skip to content

folknor/svgo

 
 

Repository files navigation

SVGO

Fork of svg/svgo with additional features and all upstream bug fixes applied.

SVGO, short for SVG Optimizer, is a Node.js library and command-line application for optimizing SVG files.

Why fork?

This fork adds the preserve option — the ability to protect specific SVG elements from being modified by any plugin. It also includes 9 upstream bug fixes that have not been merged into the main project.

Installation

pnpm add svgo

Command-line usage

Process single files:

svgo one.svg two.svg -o one.min.svg two.min.svg

Process a directory of files recursively with -r/--recursive and -f/--folder:

svgo -rf path/to/directory_with_svgs -o path/to/output_directory

Help for advanced usage:

svgo --help

Configuration

SVGO has a plugin architecture. You can read more about all plugins in Plugins | SVGO Documentation, and the default plugins in Preset Default | SVGO Documentation.

SVGO reads the configuration from svgo.config.mjs (or .js/.cjs) or the --config path/to/config.mjs command-line option. Some other parameters can be configured through command-line options too.

svgo.config.mjs

export default {
  multipass: false, // boolean
  datauri: 'base64', // 'base64'|'enc'|'unenc'
  js2svg: {
    indent: 4, // number
    pretty: false, // boolean
  },
  plugins: [
    'preset-default', // built-in plugins enabled by default
    'prefixIds', // enable built-in plugins by name

    // enable built-in plugins with an object to configure plugins
    {
      name: 'prefixIds',
      params: {
        prefix: 'uwu',
      },
    },
  ],
};

Default preset

Instead of configuring SVGO from scratch, you can tweak the default preset to suit your needs by configuring or disabling the respective plugin.

svgo.config.mjs

export default {
  plugins: [
    {
      name: 'preset-default',
      params: {
        overrides: {
          // disable a default plugin
          cleanupIds: false,

          // customize the params of a default plugin
          inlineStyles: {
            onlyMatchedOnce: false,
          },
        },
      },
    },
  ],
};

You can find a list of the default plugins in the order they run in Preset Default | SVGO Documentation.

Preserve elements

You can protect specific elements from being modified by any plugin using the preserve option. Matched elements and all their children are left completely untouched.

export default {
  preserve: {
    ids: ['my-logo', 'icon-star'],
    classes: ['no-optimize'],
  },
  plugins: ['preset-default'],
};

Custom plugins

You can also specify custom plugins:

svgo.config.mjs

import importedPlugin from './imported-plugin.js';

export default {
  plugins: [
    // plugin imported from another JavaScript file
    importedPlugin,

    // plugin defined inline
    {
      name: 'customPlugin',
      params: {
        paramName: 'paramValue',
      },
      fn: (ast, params, info) => {},
    },
  ],
};

API usage

SVGO provides a few low level utilities.

optimize

The core of SVGO is the optimize function.

import { optimize } from 'svgo';

const result = optimize(svgString, {
  path: 'path-to.svg', // recommended
  multipass: true, // all other config fields are available here
  preserve: {
    ids: ['keep-this'],
  },
});

const optimizedSvgString = result.data;

loadConfig

If you write a tool on top of SVGO you may want to resolve the config file.

import { loadConfig } from 'svgo';

const config = await loadConfig();

You can also specify a path and customize the current working directory.

const config = await loadConfig(configFile, cwd);

License and Copyright

This software is released under the terms of the MIT license.

About

Fork of SVGO with a preserve option to protect specific SVG elements from optimization, plus upstream bug fixes and ESM-only builds

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • JavaScript 97.8%
  • TypeScript 2.2%