
How To Import Image in Next JS From Public Folder
Images are a vital part of every web application β they enhance aesthetics, convey information visually, and improve user engagement. When developing applications with Next.js, you have several ways to handle and display images efficiently. One of the most straightforward and commonly used methods is importing images from the public folder.
In this comprehensive guide, youβll learn exactly how to import an image in Next.js from the public folder, how the next/image component works, and the best practices for managing static assets. Whether youβre a beginner exploring Next.js or a professional working on scalable web apps, this tutorial will help you understand how to handle images effectively.
π§ Understanding the Public Folder in Next.js
The public folder in Next.js serves as the root directory for all static assets such as images, icons, fonts, and videos. Any file placed inside this folder is served directly from the root of your application.
For example, if you have an image located at:
/public/images/banner.jpg
You can access it in the browser at:
http://localhost:3000/images/banner.jpg
This makes the public folder ideal for assets that donβt need to be processed or transformed at build time β such as company logos, icons, or default images.
βοΈ Why Use the Public Folder for Images?
The public folder is useful because:
- Simple Access β Files can be accessed using absolute URLs relative to the site root.
- No Import Required β You donβt need to import images as modules in your components.
- Better Performance β Static assets are cached efficiently by browsers.
- Ease of Management β It provides a centralized location for all assets, which simplifies deployment.
However, itβs important to note that images in the public folder donβt benefit from automatic optimization through the next/image component β unless you use it explicitly.
π§© How To Import Image in Next.js From Public Folder (Basic Method)
Letβs look at the simplest way to display an image stored in the public folder.
Step 1: Add an Image to the Public Folder
Create a folder named images inside the public directory, then place your image there. For example:
/public/images/logo.png
Step 2: Use the HTML <img> Tag
You can directly reference the image path starting from the root /:
export default function Home() {
return (
<div>
<h1>Welcome to My Website</h1>
<img src="/images/logo.png" alt="Company Logo" width={200} height={100} />
</div>
);
}
Output
This will render your logo on the page, sourced from the public folder.
Key Note
- Always start the image path with a leading slash (
/). - You donβt need to import or require the image.
- The image is served statically and efficiently.
π Using the Next.js Image Component
While using <img> works fine, Next.js provides a more powerful and optimized way to handle images using the next/image component.
This component offers several benefits, including:
- Automatic resizing and optimization
- Lazy loading by default
- Responsive images for various screen sizes
- Built-in support for modern image formats like WebP
Example: Importing Image from Public Folder Using next/image
import Image from 'next/image';
export default function Home() {
return (
<div>
<h1>Our Products</h1>
<Image
src="/images/product.jpg"
alt="Product Image"
width={500}
height={300}
priority
/>
</div>
);
}
Explanation
src: The image path from thepublicfolder (starting with/).width&height: Define the rendered dimensions.priority: Ensures critical images (like hero banners) are loaded early.alt: Describes the image for accessibility and SEO.
π§ How It Works Internally
The next/image component does not require importing files from the public folder as JavaScript modules. When you specify a path beginning with /, Next.js automatically looks for the file in the public directory.
For example:
<Image src="/team/photo.jpg" alt="Team Member" width={400} height={400} />
Next.js internally resolves this to the public folder path /public/team/photo.jpg and serves it as /team/photo.jpg.
This simplifies file management while still leveraging optimization features.
π§© Importing Local Images (Static Import Alternative)
If your image is stored inside the src or component directory, you can import it as a module instead of using the public folder. This is different but worth understanding.
import Image from 'next/image';
import productImg from '../assets/product.jpg';
export default function Product() {
return <Image src={productImg} alt="Product" />;
}
Here, Next.js processes the image during build time β optimizing it for different devices automatically. However, this method isnβt needed when youβre using the public folder.
πΌοΈ When Should You Use the Public Folder?
Use the public folder for:
- Static images that donβt change frequently.
- Global assets such as logos, icons, favicons, or backgrounds.
- External integrations or CDN-based resources.
- Files accessed outside React components (like
manifest.jsonorrobots.txt).
Avoid placing thousands of dynamically generated images in public/ β instead, serve them via an API route or use external storage (e.g., AWS S3, Cloudinary).
π‘ Common Mistakes Developers Make
Here are common pitfalls to avoid when importing images from the public folder:
-
Forgetting the Leading Slash (
/)- Incorrect:
src="images/logo.png" - Correct:
src="/images/logo.png"
- Incorrect:
-
Incorrect Folder Path
- The path is relative to the root of the app, not the component file.
-
Using Imports for Public Assets
- You do not need
import logo from '/public/images/logo.png'.
- You do not need
-
Ignoring
next/imageOptimization- Use
<Image>for performance-critical visuals.
- Use
-
Missing Alt Tags
- Always include descriptive
alttext for accessibility and SEO.
- Always include descriptive
π§° How To Handle Background Images from the Public Folder
Sometimes, you may want to use images as CSS backgrounds. You can still use the public folder for that.
export default function HeroSection() {
return (
<div
style={{
backgroundImage: 'url(/images/hero-bg.jpg)',
backgroundSize: 'cover',
backgroundPosition: 'center',
height: '500px',
color: '#fff',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
<h1>Welcome to AAMAX</h1>
</div>
);
}
This approach allows you to keep your design flexible while still serving static assets efficiently.
π§© Example Project Structure
A typical Next.js structure when using images from the public folder:
my-next-app/
βββ public/
β βββ images/
β β βββ logo.png
β β βββ banner.jpg
β β βββ icon.png
β βββ favicon.ico
β βββ robots.txt
βββ pages/
β βββ index.js
β βββ about.js
βββ components/
β βββ HeroSection.js
βββ package.json
βββ next.config.js
This clean organization ensures your public assets are easily accessible and scalable.
β‘ Using Dynamic Image Paths
In some scenarios, you might need to load images dynamically from the public folder based on user input or data.
Example:
export default function Gallery({ imageName }) {
return (
<div>
<Image
src={`/images/${imageName}.jpg`}
alt={imageName}
width={400}
height={300}
/>
</div>
);
}
If imageName equals "nature", the app loads /public/images/nature.jpg.
π οΈ Image Optimization in Next.js
Even when using the public folder, you can benefit from Next.jsβs image optimization features. The next/image component automatically optimizes images on-demand, resizing them for different devices and formats.
To control optimization settings, update your next.config.js:
module.exports = {
images: {
formats: ['image/avif', 'image/webp'],
deviceSizes: [640, 768, 1024, 1280, 1600],
imageSizes: [16, 32, 48, 64, 96],
},
};
This ensures the best balance between image quality and page speed.
π§ SEO Considerations When Using Images
Images play a major role in SEO performance and user experience. Follow these best practices:
- Use descriptive file names β e.g.,
modern-office-setup.jpginstead ofimg001.jpg. - Add
altattributes β Helps search engines understand image context. - Compress your images β Use tools like TinyPNG or Squoosh.
- Serve modern formats β Use WebP or AVIF when possible.
- Avoid oversized images β Match image dimensions to display size.
π₯ Advanced Tip: Using External Image Hosts with the Public Folder
Sometimes you may need to mix local (public folder) and external (CDN) image sources. You can configure Next.js to allow specific domains in next.config.js:
module.exports = {
images: {
domains: ['cdn.example.com', 'images.unsplash.com'],
},
};
This enables you to use the <Image> component for remote images without any issues.
πΌ Why Use Next.js for Image Handling?
Next.js combines the simplicity of React with built-in performance optimization tools. Its Image component and static asset management through the public folder make it perfect for high-performance applications.
You can also integrate Next.js with MERN Stack projects to build scalable, optimized web apps quickly.
If youβre building a complex web app or eCommerce project and need professional help, you can AAMAX β a full-service digital marketing and development agency specializing in MERN Stack Development, Web Development, Digital Marketing, and SEO Services. Their expert team can help you develop visually stunning, high-performance applications using Next.js and modern web technologies.
π Final Thoughts
Importing images from the public folder in Next.js is one of the simplest and most reliable ways to handle static assets. Itβs perfect for logos, icons, and background images that donβt require dynamic imports or transformations.
Hereβs a quick recap:
- Store static images in the
public/directory. - Use
<img>for simple, static references. - Use the
next/imagecomponent for optimized rendering. - Always start image paths with
/. - Keep file names descriptive and SEO-friendly.
With this understanding, you can efficiently manage images in your Next.js projects while maintaining fast load times and a professional user experience.
And if you want expert help building powerful Next.js or MERN-based applications, consider hiring AAMAX β your partner for cutting-edge web development and digital growth.






