export에서next/image 사용하기
개시하다
아마 많은 분들이 아실 거예요.
Next.js의 주요 기능입니다.
next/image
는 기본적으로 next export
에서 사용할 수 없다.[1] Vercel을 사용할 수 없는 항목 등에서
그래도나는 js를 사용하고 싶은 상황이 있다고 생각한다.
이때
next/image
의 편의성과 우수성을 알게 되면처음부터 이미지 구성 요소를 만들면 뼈가 부러져요...
이러한 생각으로 구축할 때 이미지를 최적화하다
next export
에 next/image
기능이 있는 구성 요소를 생성했습니다.만약 같은 생각을 가진 사람이 있다면 반드시 참고해 주십시오
더 좋은 방법과 가까운 운용 방침 등의 댓글을 얻었으면 좋겠어요!
이 보도가 전달할 수 있는 내용
유감스럽게도 공식
next/image
을 사용할 수 없기 때문에 구축할 때 이미지를 최적화합니다next export
도 next/image
의 기능을 사용할 수 있는 비공식 구성 요소에 대한 소개.Next.js와는 사상이 다를 것 같아요.
먼저 했습니다. 이 구성 요소는 Next입니다.js, Vercel의 생각과 다른 점을 주의하세요.
우리 공식 문서에서 말한 바와 같다
구축할 때 이미지를 최적화하는 해결 방안은
이미지 수가 증가함에 따라 구축 시간이 비례적으로 증가하는 단점.
따라서 이른바 정적 접대 서비스를 사용하는 것 이외에
나는 기본적으로 수요에 따라 진행된 이미지 최적화를 사용하는 것이 비교적 좋을 것이라고 생각한다.
이루어지다
제가 중요한 부분에 대한 해설을 허락해 주세요.
코드의 전체 내용은 이쪽 창고를 보세요.
responsieve-loader를 사용하여 이미지 최적화
이번에 구축할 때 이미지 최적화
Next.js가 웹 패키지를 핸드백에 사용했기 때문에 loader 기능을 사용하고 싶습니다.
따라서
next/image
에 사용된'스펀지형 이미지'를 실현하는 데 필요한여러 크기의 이미지를 생성할 수 있다는 관점에서
responsive-loader
.이 프로그램 라이브러리는 이미지 처리에서 사용할 수 있다
sharp
구축 시간도 빠른 것도 추천의 포인트다.Next.js에서 웹 패키지 설정을 하려면 건드려야 합니다.
next.config.js
/**
* @type {import('next/dist/next-server/server/config-shared').NextConfig}
*/
const config = {
reactStrictMode: true,
images: {
disableStaticImages: true,
},
webpack: (config) => {
config.module.rules.push({
test: /\.(jpe?g|png|webp)$/i,
use: {
loader: "responsive-loader",
options: {
name: "[path][name].[hash].[width].[ext]",
outputPath: "static/chunks/images/",
publicPath: "/_next/static/chunks/images/",
sizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
placeholder: true,
adapter: require("responsive-loader/sharp"),
},
},
});
return config;
},
};
module.exports = config;
이렇게 설정합니다.옵션의 설정을 간단하게 설명해 드릴게요.
.next
디렉터리에서 그림을 출력jimp
을 사용하지 않은 상태에서 덮어쓸 수 있음따라서 가져오기
jpg
, png
, webp
시responsive-loader
에서 처리합니다.구성 요소 설치
공식 Image 구성 요소와 같은 부분은 생략됨
전체 코드는 다음과 같습니다.
const ExportImage = ({
src,
sizes,
alt,
priority = false,
loading,
lazyBoundary = "200px",
className,
placeholder = "empty",
objectFit,
objectPosition,
onLoadingComplete,
wrapperClassName,
...all
}: Props) => {
//
// ~~~省略~~~
//
const {
placeholder: blurDataURL,
width,
height,
srcSet,
src: outSrc,
} = require(`~/src/images/${src}`);
const serSetWebp = require(`~/src/images/${src}?format=webp`).srcSet;
//
// ~~~省略~~~
//
let imgAttributes: {
src: string;
srcSet?: string;
serSetWebp?: string;
sizes?: string;
} = {
src: emptyDataURL,
srcSet: undefined,
serSetWebp: undefined,
sizes: undefined,
};
if (isVisible) {
imgAttributes = {
src: outSrc,
srcSet,
serSetWebp,
sizes,
};
}
return (
<span className={wrapperClassName} style={wrapperStyle}>
{sizerStyle && (
<span style={sizerStyle}>
{sizerSvg && (
<img
style={{
maxWidth: "100%",
display: "block",
margin: 0,
border: "none",
padding: 0,
}}
alt=""
aria-hidden={true}
src={`data:image/svg+xml;base64,${toBase64(sizerSvg)}`}
/>
)}
</span>
)}
<picture>
<source srcSet={imgAttributes.serSetWebp} type="image/webp" />
<img
{...rest}
src={imgAttributes.src}
srcSet={imgAttributes.srcSet}
sizes={imgAttributes.sizes}
decoding="async"
className={className}
ref={(img) => {
ref(img);
handleLoading(img, outSrc, layout, placeholder, onLoadingComplete);
}}
style={{ ...imgStyle, ...blurStyle }}
alt={alt}
/>
</picture>
<noscript>
<img
{...rest}
src={outSrc}
srcSet={srcSet}
sizes={sizes}
decoding="async"
style={imgStyle}
className={className}
loading={loading ?? "lazy"}
alt={alt}
/>
</noscript>
{priority ? (
<Head>
<link
key={
"__nimg-" +
imgAttributes.src +
imgAttributes.serSetWebp +
imgAttributes.sizes
}
rel="preload"
as="image"
href={imgAttributes.serSetWebp ? undefined : imgAttributes.src}
imagesrcset={imgAttributes.serSetWebp}
imagesizes={imgAttributes.sizes}
></link>
</Head>
) : null}
</span>
);
};
export default ExportImage;
자세히 볼게요.우선,
src
prop을 통해 이미지 이름을 수신합니다어셈블리에서 이미지를 가져옵니다.
const {
placeholder: blurDataURL,
width,
height,
srcSet,
src: outSrc,
} = require(`~/src/images/${src}`);
const serSetWebp = require(`~/src/images/${src}?format=webp`).srcSet;
Dell 데이터 기반next/image
도 마찬가지로 구성요소를 구현했습니다.공식과 달리 픽처 라벨로 이루어진다.
이 구성 요소는 구축할 때 이미지 처리를 합니다
웹 및 원본 확장자의 이미지를 추출하기 위해 사용자 에이전트를 볼 필요가 없기 때문이다
안전하게 픽처 라벨로 나눠졌어요.
return (
<span className={wrapperClassName} style={wrapperStyle}>
{sizerStyle && (
<span style={sizerStyle}>
{sizerSvg && (
<img
style={{
maxWidth: "100%",
display: "block",
margin: 0,
border: "none",
padding: 0,
}}
alt=""
aria-hidden={true}
src={`data:image/svg+xml;base64,${toBase64(sizerSvg)}`}
/>
)}
</span>
)}
<picture>
<source srcSet={imgAttributes.serSetWebp} type="image/webp" />
<img
{...rest}
src={imgAttributes.src}
srcSet={imgAttributes.srcSet}
sizes={imgAttributes.sizes}
decoding="async"
className={className}
ref={(img) => {
ref(img);
handleLoading(img, outSrc, layout, placeholder, onLoadingComplete);
}}
style={{ ...imgStyle, ...blurStyle }}
alt={alt}
/>
</picture>
</span>
);
그리고 priority
prop이 true
일 때 읽기 지연이 없습니다proeload의 기능은 다음과 같다.
<Head>
<link
key={
"__nimg-" +
imgAttributes.src +
imgAttributes.serSetWebp +
imgAttributes.sizes
}
rel="preload"
as="image"
href={imgAttributes.serSetWebp ? undefined : imgAttributes.src}
imagesrcset={imgAttributes.serSetWebp}
imagesizes={imgAttributes.sizes}
></link>
</Head>
이 점도 공식과 다르다(이것은 단점이다)웹 및 원래 확장자에 따라 이미지 URL이 달라지는 제작 시 이미지 처리
preload를 만들 그림만 웹 페이지로 만들어야 합니다.
보태다
물론 웹 페이지와 원시 확장자의 이미지는preload를 진행할 수 있다
심지어 필요 없는 그림을 불러와서 본말이 뒤바뀌었다.
따라서 이번 구성 요소는 웹에만 preload를 진행합니다.
이 점도 정부 영상 처리 수단이다. 비록 영상의 요구는 같지만
되돌아오는 그림은 다르다. 이런 방법은 우수하다고 느낀다.
끝맺다
여기까지 읽어주셔서 감사합니다!
설명이 부족하거나 잘못된 점이 있으면 반드시 댓글이나 트위터에 남겨주세요!
Next.js의 목표 방향성과 세계관이 매우 이상적이라고 생각할 때가 많다. 비록 우수한 틀이지만
이번처럼
export
하고 싶지만 사용할 수 있는 기능이 제한된다는 점은 사람마다 다를 수 있다.이런 사람들에게 이번 기사는 약간 넥스트다.js를 사용하는 상자를 늘리는 데 도움이 되었으면 좋겠습니다.
금후
앞으로 라이브러리에서 이번과 같은 구성 요소를 제공할 수 있을 것 같습니다.
다음 프로그램 라이브러리는 업데이트가 중단된 후에도 대량의 다운로드가 있습니다
issue를 보면 구축할 때의 이미지 처리를 확인하는 수요가 적지 않습니다.
이 점을 감안하면 방향성은 좀 다르지만 우리 구성 요소 같은 것을 제공할 수 있다면
아마 많은 분들이 쓰실 것 같아요, 웃음.
실력이 될지 모르겠지만, 그때 꼭 써줬으면 좋겠어요.
각주
외부 이미지 공급자를 사용하면 이 제한을 받지 않습니다.↩︎
Reference
이 문제에 관하여(export에서next/image 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/d_suke/articles/f4db3a9c85a87780effa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)