2

I'm working on a React project using Vite as the build tool, and I'm trying to implement lazy loading of images using the react-lazy-load-image-component library. I'm facing issues with relative image paths during both development and build phases.

Here's the structure of my project:

my-project/
|-- public/
|-- src/
|   |-- assets/
|       |-- images/
|           |-- projects/
|               |-- presto_store.jpg
|               |-- presto_store-compressed.jpg
|   |-- components/
|       |-- ProjectSection/
|            |-- ProjectSection.jsx
|            |-- ProjectCard.jsx
|       |-- AboutMeSection.jsx
|-- index.html
|-- package.json
|-- vite.config.js

In the AboutMeSection.jsx file, I import the images and use the imported objects as the src and placeholderSrc props for the LazyLoadImage component, and it works perfectly during both development and build phases:

import ProfilePic from "../assets/images/Img_square1.jpg";
import BlurredProfilePic from "../assets/images/Img_square1-compressed.jpg";

<LazyLoadImage
  className="profile-pic"
  src={ProfilePic}
  alt="Immagine Profilo"
  effect="blur"
  placeholderSrc={BlurredProfilePic}
/>

However, in the ProjectCard.jsx component, I need to use relative image paths as props to keep the component agnostic to the actual image paths:

const ProjectCard = ({
  // ... other props
  imgPath,
  placeholderPath,
}) => {
  // ... other code

  return (
    // ... other code
    <LazyLoadImage
      className="project-img"
      src={imgPath}
      alt={title}
      placeholderSrc={placeholderPath}
      effect="opacity"
    />
    // ... other code
  );
};

export default React.memo(ProjectCard);

When I use the component like this inside ProjectSection.jsx (A section where ProjectCards are create and displayed dynamically), like this:

<ProjectCard
  imgPath="/assets/images/projects/presto_store.jpg"
  placeholderPath="/assets/images/projects/presto_store-compressed.jpg"
  // ... other props
/>

or even:

  • "assets/images/projects/presto_store.jpg"
  • "./assets/images/projects/presto_store.jpg"
  • "../assets/images/projects/presto_store.jpg"
  • "../../assets/images/projects/presto_store.jpg"

The images are not displayed both in development and build. If I use paths starting with "src/", it works only in the development environment but not in the build.

I need a solution that allows me to use relative image paths with Vite, React, and the react-lazy-load-image-component library so that the images are displayed correctly in both development and build phases, thanks a lot. PS: When I say not displaying I mean:"http://localhost:5173/assets/images/projects/presto_store.jpg 404 (Not Found)" in development mode.

"devDependencies": {
    "@types/react": "^18.0.28",
    "@types/react-dom": "^18.0.11",
    "@vitejs/plugin-react": "^3.1.0",
    "vite": "^4.2.0"
  }

Also, chat GPT suggested me some weird stuff like importing the path library and doing like so, but it doesn't work. And I can't belive it has to be this hard, im surely missing out something simple:

const resolvedImgPath = path.resolve(import.meta.env.BASE_URL, imgPath);
  const resolvedPlaceholderPath = path.resolve(import.meta.env.BASE_URL, placeholderPath);` 

1 Answer 1

-1

Just put the asset folder into public.

https://vitejs.dev/guide/assets.html#the-public-directory

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.