MediaWiki includes some binary assets in its code.
PNG files are needed for browsers without SVG compatibility.
All PNG images/icons included in our code are usually optimized with pngcrush or optipng, which offer automatic detection of the method with best results for the target files (and are packaged in several GNU/Linux distributions). For instance:
pngcrush -brute -reduce image.png image.out.png
MediaWiki has built-in support for SVG with fallback to PNG, using the Less code:
.background-image-svg( '../images/file.svg', '../images/file.png' );
To use this, also add the line at the top of your Less file:
to the top of the file.
Older versions of MediaWikiEdit
If you are developing for older versions of MediaWiki (before 1.22), you can use the same technique (from The invisible gradient technique) manually:
background: transparent url(fallback-image.png) center center no-repeat; background-image: -webkit-linear-gradient(transparent, transparent), url(vector-image.svg); background-image: linear-gradient(transparent, transparent), url(vector-image.svg);
Every image should exist also (or rather, primarily) in SVG format.
SVG files need to be optimized as well. For most core and extension files, svgo is used. You need to make sure a compatible XML prolog is kept, for instance with this snippet:
for i in `find . -name '*.svg'` do mv $i $i-tmp (echo -n '<?xml version="1.0" encoding="UTF-8"?>'; cat $i-tmp) > $i rm $i-tmp done
If your SVG files are already well-formed and have an XML prolog, you can simply use the svgo configuration for MediaWiki core. For example, from an extension's directory:
npm -g install svgo svgo --config ../../.svgo.config.js --folder .
For a more aggressive optimisation (e.g. if you don't care about reading the SVG source later), run it without the config file and it will apply all default optimisations. Note that for MediaWiki use, some of these are unnecessary (e.g. we pretty-print the XML because ResourceLoader will minify it later, and it's nicer to work with it unminified).