#javascript #angular #base64 #indexeddb
#javascript #угловой #base64 #indexeddb
Вопрос:
Я делаю запрос на сервер и получаю строку URL-адреса изображения, внутри компонента я преобразую URL-адрес в строку Base64. И вот код для этого: «Я скопировал его из ответа и не могу найти его в своей истории, чтобы указать автора».
getBase64Image(img: HTMLImageElement) {
// We create a HTML canvas object that will create a 2d image
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
// This will draw image
ctx.drawImage(img, 0, 0);
// Convert the drawn image to Data URL
var dataURL = canvas.toDataURL("image/png");
return dataURL.replace(/^data:image/(png|jpg);base64,/, "");
}
getBase64ImageFromURL(url: string) {
return new Observable((observer: Observer<string>) => {
// create an image object
let img = new Image();
img.crossOrigin = 'Anonymous';
img.src = url;
if (!img.complete) {
// This will call another method that will create image from url
img.onload = () => {
observer.next(this.getBase64Image(img));
observer.complete();
};
img.onerror = (err) => {
observer.error(err);
};
} else {
observer.next(this.getBase64Image(img));
observer.complete();
}
});
}
на странице html
<div style="background-image:url({{item.imageKey}}); ">
</div>
вывод изображения составляет около 800 КБ
Затем я сохраняю строку base64 в таблице indexeddb, а затем извлекаю строку из таблицы для ее отображения. Моя цель выполнения всех этих хлопот — ускорить загрузку веб-сайта при последующих посещениях. Но это не то, чего я ожидал, поскольку для рисования изображений действительно требуется несколько секунд. Для некоторых страниц, содержащих меньше изображений, это разумно, но на других страницах это становится уродливым. Есть ли более эффективный способ сделать это?
Ответ №1:
Моя цель выполнения всех этих хлопот — ускорить загрузку веб-сайта при последующих посещениях.
Почему бы просто не установить заголовок кэша при просмотре изображения и позволить браузеру выполнить работу по сохранению кэшированного изображения за вас?
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Modified-Since
Комментарии:
1. Я бы даже добавил это -> developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires
2. для меня это как чужая территория, я должен узнать об этом, чтобы иметь возможность реализовать это и сделать это ответом. Дополнительные объяснения были бы чрезвычайно полезны и оценены.
3. В основном, когда вы возвращаете изображение, ваш веб-сервер также устанавливает заголовок ETag, или заголовок expires, или любой из множества других заголовков управления кэшем. Как вы это делаете, зависит от того, какой веб-сервер вы используете, но тогда, допустим, они запрашивают logo.jpg , ваш сервер вернет изображение, а также Etag для этого изображения, скажем, тег «ABCDEF». Если пользователь перезагрузит страницу, браузер увидит: «эй, я уже получал это изображение раньше, так что дайте мне logo.jpg если только у него все еще нет etag «ABCDEF», в этом случае просто скажите мне «никаких изменений».
4. Если вы выполняете заголовок expires, когда вы запрашиваете logo.jpg , сервер скажет: «Вот изображение, и продолжайте использовать его до истечения этого срока действия». Затем, когда пользователь перезагружает страницу, браузер просто скажет: «Эй, у меня уже есть это изображение в кэше, я даже не буду его запрашивать».