Image Lazy Loading은 페이지 안에 있는 실제 이미지들이 실제로 화면에 보여질 필요가 있을 때 로딩을 할 수 있도록 하는 테크닉
웹 페이지 내에서 바로 로딩을 하지 않고 로딩 시점을 뒤로 미루는 것이라 볼 수 있습니다. 이 방식은 웹 성능과 디바이스 내 리소스 활용도 증가, 그리고 연관된 비용을 줄이는데 도움
lazy loading은 페이지 내에서 실제로 필요로 할 때까지 리소스의 로딩을 미루는 것
img 태그를 이용하는 방법 - 1
<img data-src="https://ik.imagekit.io/demo/default-image.jpg" />
img 태그를 이용하는 방법 - 2
<!-- img 태그 -->
<img src="…" loading="lazy" alt="…" width="200" height="200">
<!-- iframe 태그 -->
<img src="…" loading="lazy" alt="…" style="height:200px; width:200px;">
$nextTick
으로 넣어줌) export default {
props: {
imageSource: {
type: String,
required: true
},
imageErrorCallback: {
type: Function,
required: false,
default: function() {}
},
imageSuccessCallback: {
type: Function,
required: false,
default: function() {}
},
backgroundSize: {
type: String,
required: false,
default: 'cover'
}
},
data : function() {
return {
imageWidth: 0,
imageHeight: 0,
imageState: 'loading',
asyncImage: new Image(),
errorImage : require("@/assets/movies/error.png"),
//https://icons8.com/preloaders/
loadingImage : require("@/assets/movies/loadimage.gif"),
}
},
computed: {
computedStyle() {
if (this.imageState === 'loading') {
return 'background-image: url(' + this.loadingImage + '); background-size: ' + this.backgroundSize
}
if (this.imageState === 'error') {
return 'background-image: url(' + this.errorImage + '); background-size: ' + this.backgroundSize
}
if (this.imageState === 'loaded') {
return 'background-image: url(' + this.asyncImage.src + '); background-size: ' + this.backgroundSize
}
return '';
}
},
methods: {
fetchImage() {
// 이미지가 성공적으로 load 되었을 때
this.asyncImage.onload = this.imageOnLoad
//이미지가 load에서 error 났을 경우
this.asyncImage.onerror = this.imageOnError
this.imageState = 'loading'
this.asyncImage.src = this.imageSource
},
imageOnLoad() {
this.imageState = 'loaded'
this.imageWidth = this.asyncImage.naturalWidth
this.imageHeight = this.asyncImage.naturalHeight
this.imageSuccessCallback()
},
imageOnError() {
this.imageState = 'error'
this.imageErrorCallback()
}
},
mounted() {
this.$nextTick(() => {
this.fetchImage()
})
}
}
data : function() {
return {
imageWidth: 0,
imageHeight: 0,
imageState: 'loading',
asyncImage: new Image(),
errorImage : "@/assets/movies/error.png",
loadingImage : "@/assets/movies/loadimage.gif",
}
},
computed: {
computedStyle() {
if (this.imageState === 'loading') {
return 'background-image: url(' + this.loadingImage + '); background-size: ' + this.backgroundSize
}
if (this.imageState === 'error') {
return 'background-image: url(' + this.errorImage + '); background-size: ' + this.backgroundSize
}
if (this.imageState === 'loaded') {
return 'background-image: url(' + this.asyncImage.src + '); background-size: ' + this.backgroundSize
}
return '';
}
},
url('../assets/')
혹은 url('@/assets/')
로 접근하게 되면, 웹페이지 해당 주소창 위치를 기준으로 이미지를 찾게됨. data : function() {
return {
imageWidth: 0,
imageHeight: 0,
imageState: 'loading',
asyncImage: new Image(),
// 바뀐부분
errorImage : require("@/assets/movies/error.png"),
loadingImage : require("@/assets/movies/loadimage.gif"),
// ---------------
}
},
computed: {
computedStyle() {
if (this.imageState === 'loading') {
return 'background-image: url(' + this.loadingImage + '); background-size: ' + this.backgroundSize
}
if (this.imageState === 'error') {
return 'background-image: url(' + this.errorImage + '); background-size: ' + this.backgroundSize
}
if (this.imageState === 'loaded') {
return 'background-image: url(' + this.asyncImage.src + '); background-size: ' + this.backgroundSize
}
return '';
}
},