Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

An easy and bundler agnostic way to use a sprite-sheet for your svgs. With server side rendering in mind

License

Notifications You must be signed in to change notification settings

kaoDev/react-lazy-svg

Repository files navigation

sloth emoji

react-lazy-svg

The easy way to use SVG sprite-sheets

GitHub license npm npm GitHub issues minified bundle size

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

Usage

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/ and ./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.

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.

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;
};

About

An easy and bundler agnostic way to use a sprite-sheet for your svgs. With server side rendering in mind

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

AltStyle によって変換されたページ (->オリジナル) /