Giter VIP home page Giter VIP logo

react-vanilla-lazyload's Introduction

Vanilla Lazy Load for React

codecov

Welcome to the React Vanilla Lazyload repo! Yes, the name is a bit of a head-scratcher ๐Ÿ˜…. But fear not, despite the contradiction, the story behind this oddly fitting name: we're using a fantastic script called Vanilla LazyLoad to lazily load our images in React.

So, even though React isn't exactly vanilla, this little module does its job beautifully... Get ready to turbocharge your React apps!... with React "Vanilla" LazyLoading.

Installation

npm install react-vanilla-lazyload

How To Use

To enable the lazy loading in your app import the VanillaLazyLoad component or use LazyWrapper to wrap your lazy components. The difference between VanillaLazyLoad and LazyWrapper is that LazyWrapper is a wrapper component that wraps all lazy components in your app, use it in case you want to limit the scope of your lazy components.

Note that the lazy-loaded elements should not be in the initial viewport to avoid LCP or FID issues.

So in short, you can do the following:

    <>
      {/* The rest of the app */}
      <VanillaLazyLoad/>
    </>

OR if you want to limit the scope of your lazy components:

    <LazyWrapper>
      {/* The components that contains the lazy components */} 
    </LazyWrapper>

Script & Wrapper

  • VanillaLazyLoad - This is the main script that you need to import and add to your app footer to use it.
  • LazyWrapper - This is a wrapper component that wraps all lazy components. this replaces the VanillaLazyLoad component. This is useful in case you want to use it inside a wrapper

Lazy Components

  • LazyEl - This component is used to lazy load any element, has a set of props that can be used to customize the lazy load (i.e. srcBg srcBgHDPI, dataBgMulti, dataBgMultiHidpi) used for backgrounds. typed as html element
  • LazyImg - This component is used to lazy load images. typed as image
  • LazyVideo - This component is used to lazy load videos. typed as video
  • LazyIframe - This component is used to lazy load iframes. typed as iframe
  • LazyModule - This component is used to lazy load React Components. typed as React Component

Getting Started

Check out the Examples to get started.

Using VanillaLazyLoad

If you want to use the VanillaLazyLoad component, you can use it in your app footer and after all the lazy components.

import React from "react";
import {VanillaLazyLoad, LazyEl} from "react-vanilla-lazyload";

const App = () => {
  return (
    <>
      {/* The rest of the app */}
      <LazyImg src={"https://github.com/erikyo/react-vanilla-lazyload/demos/images/440x560-01.webp"} width={440} height={560}/>
      <VanillaLazyLoad/>
    </>
  );
};

export default App;

Using a wrapper

If you want to use the LazyWrapper component, you can use it in your app footer.

import React from 'react';
import {
  LazyWrapper,
  LazyImg,
  LazyVideo,
  LazyIframe,
  LazyEl,
  LazyModule
} from "react-vanilla-lazyload";

const MyComponent = () => {
  return (
    <LazyWrapper>
      {/* The Lazy components are here */}
      <LazyImg src={"https://github.com/erikyo/react-vanilla-lazyload/demos/images/440x560-01.webp"} width={440} height={560}/>
    </LazyWrapper>
  );
};

export default MyComponent;

Components

import React from 'react';
import {
  LazyWrapper,
  LazyImg,
  LazyVideo,
  LazyIframe,
  LazyEl,
  LazyModule
} from "react-vanilla-lazyload";

const MyComponent = () => {
  return (
    <LazyWrapper>
      {/** Image */}
      <LazyImg src={"https://github.com/erikyo/react-vanilla-lazyload/demos/images/440x560-01.webp"} width={440} height={560}/>
      {/** Iframe */}
      <LazyIframe src={"https://github.com/erikyo/react-vanilla-lazyload/demos/iframes/i01.html"} title={"iframe"} />
      {/** Video */}
      <LazyVideo src={"https://github.com/erikyo/react-vanilla-lazyload/demos/videos/1920x1080-01.mp4"} poster={"https://github.com/erikyo/react-vanilla-lazyload/demos/images/440x560-01.webp"}/>
      {/** HTML Element */}
      <LazyEl bg={"https://github.com/erikyo/react-vanilla-lazyload/demos/images/440x560-01.webp"}/>
      {/** React Component */}
      <LazyModule component={import('src/components/MyComponent.tsx')} loader={<Loading/>}/>
    </LazyWrapper>
  );
};

export default MyComponent;

LazyImg, LazyVideo, LazyIframe

LazyImg, LazyVideo, LazyIframe are used to lazy load images, videos and iframes. They are typed as html element, image, video and iframe respectively. Those components are designed as a drop-in replacement for the vanilla img, video, iframe elements you can use in your app simply replacing the tag img, video, iframe with LazyImg, LazyVideo, LazyIframe.

LazyEl

LazyEl is used to lazy load any element, has a set of props that can be used to customize the lazy load (i.e. srcBg srcBgHDPI, dataBgMulti, dataBgMultiHidpi) used for backgrounds. It is typed as html element.

  • bg - The source of the background
  • bgHidpi - The source of the hidpi background
  • bgMulti - The source of the background for multi resolution
  • bgMultiHidpi - The source of the background for multi resolution and hidpi
<LazyEl srcBg={"https://github.com/erikyo/react-vanilla-lazyload/demos/images/440x560-01.webp"}/>

LazyModule

LazyModule is used to lazy load React Components.

  • component - A function that returns a React Component
  • loader - A React Component that will be rendered while the component is loading
<LazyModule component={import('src/components/MyComponent.tsx')} loader={<Loading/>}/>

Examples

Example Code Demo
demo demo.tsx demo
animated animated.tsx demo
images images.tsx demo
infinite scroll no-lazyload.tsx demo
no-lazyload no-lazyload.tsx demo
native native.tsx demo

react-vanilla-lazyload's People

Contributors

erikyo avatar

Stargazers

Luigi Teschio avatar

Watchers

Andrea Verlicchi avatar  avatar  avatar

react-vanilla-lazyload's Issues

Lazyload components

this is an idea that @johnhooks gave me... it's just matter of using the mutation observer on the attributes of a lazyloaded proxy and drop in the component when loaded (leveraging the suspense and maybe a loading icon)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.