react-lazy-svg
Version:
react-lazy-svg is a simple way to use SVGs with the performance benefits of a sprite-sheet and svg css styling possibilities. Without bloating the bundle. It automatically creates a sprite-sheet for all used SVGs on the client but also provides the option
77 lines (59 loc) • 2.88 kB
Markdown
<p align="center"><img alt="sloth emoji" src="https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/160/apple/271/sloth_1f9a5.png" /></p>
<h1 align="center">react-lazy-svg</h1>
<p align="center" style="font-size: 1.2rem;">The easy way to use SVG sprite-sheets</p>
[](https://github.com/kaoDev/react-lazy-svg/blob/main/license.md)
[](https://www.npmjs.com/package/react-lazy-svg)
[](https://www.npmjs.com/package/react-lazy-svg)
[](https://github.com/kaoDev/react-lazy-svg/issues)
[](https://bundlephobia.com/package/react-lazy-svg)
react-lazy-svg is a simple way to use SVGs with the performance benefits of a
sprite-sheet and svg css styling possibilities. Without bloating the bundle. It
automatically creates a sprite-sheet for all used SVGs on the client but also
provides a function to create a server side rendered sprite-sheet for icons used
in the first paint. So you can inject the critical svg
```bash
npm install --save react-lazy-svg
```
Examples on how to use react-lazy-svg with remix and next.js can be found in the
[./example-nextjs/](./example-nextjs/) and [./example-remix/](./example-remix/)
directory.
Wrap the App with the contextProvider and provide a function to resolve SVG
strings by URL. If you are using server side rendering you should also call
`initOnClient()` to hydrate the sprite sheet context.
```tsx
import { SpriteContextProvider, initOnClient. Icon } from 'react-lazy-svg';
import icon1 from './icon1.svg';
const loadSVG = async (url: string) => {
return await (await fetch(url)).text();
};
initOnClient();
const Root = () => (
<SpriteContextProvider loadSVG={loadSVG}>
<Icon url={icon1} className="icon"></Icon>
<Icon url={icon1} className="icon red"></Icon>
</SpriteContextProvider>
);
```
On the server the SVG resolver function could look like this, and load the svg
contents from the file system.
```ts
const svgIconFiles = new Map<string, string>();
const readFile = promisify(fs.readFile);
const cdnBase = 'http://localhost:3001/static/media/';
export const readSvg = async (url: string) => {
if (svgIconFiles.has(url)) {
return svgIconFiles.get(url);
}
if (url.startsWith(cdnBase)) {
url = path.join(
process.cwd(),
url.replace(cdnBase, './build/public/static/media/'),
);
const svgString = await readFile(url, { encoding: 'utf8' });
svgIconFiles.set(url, svgString);
return svgString;
}
return undefined;
};
```