Как вы кэшируете изображение в Javascript



мои друзья и я работаем на веб-сайте, где мы хотели бы кэшировать определенные изображения, чтобы отображать их быстрее в будущем. У меня есть два основных вопроса:




  1. как вы кэшируете изображение?

  2. как вы используете изображение после его кэширования? (и просто чтобы проверить, если изображение кэшируется на странице A, можно вызвать его из кэша, чтобы использовать его на странице B, верно?)


кроме того, можно ли установить , когда в срок действия кэшированной версии изображения истечет?



было бы очень полезно, если бы был включен пример и/или ссылка на страницу, которая описывает это далее.



мы в порядке, используя сырой JavaScript или jQuery версии.

1015   8  

8 ответов:

Как только изображение было загружено каким-либо образом в браузер, оно будет находиться в кэше браузера и будет загружаться намного быстрее при следующем использовании, независимо от того, используется ли это использование на текущей странице или на любой другой странице, пока изображение используется до истечения срока его действия из кэша браузера.

Итак, чтобы предварительно кэшировать изображения, все, что вам нужно сделать, это загрузить их в браузер. Если вы хотите предварительно кэшировать кучу изображений, вероятно, лучше всего сделать это с помощью javascript, поскольку он обычно не задерживает загрузки страницы, когда сделано с помощью JavaScript. Вы можете сделать это так:

function preloadImages(array) {
    if (!preloadImages.list) {
        preloadImages.list = [];
    }
    var list = preloadImages.list;
    for (var i = 0; i < array.length; i++) {
        var img = new Image();
        img.onload = function() {
            var index = list.indexOf(this);
            if (index !== -1) {
                // remove image from the array once it's loaded
                // for memory consumption reasons
                list.splice(index, 1);
            }
        }
        list.push(img);
        img.src = array[i];
    }
}

preloadImages(["url1.jpg", "url2.jpg", "url3.jpg"]);

эта функция может быть вызвана столько раз, сколько вы хотите, и каждый раз, он просто добавит больше изображений в precache.

после того, как изображения были предварительно загружены таким образом с помощью javascript, браузер будет иметь их в своем кэше, и вы можете просто ссылаться на обычные URL-адреса в других местах (на ваших веб-страницах), и браузер будет получать этот URL-адрес из своего кэша, а не через сеть.

со временем кэш браузера может заполниться и выбросить самые старые вещи, которые не использовались в течение некоторого времени. Таким образом, в конечном итоге изображения будут удалены из кэша, но они должны оставаться там некоторое время (в зависимости от того, насколько велик кэш и сколько другого просмотра выполняется). Каждый раз, когда изображения фактически загружаются снова или используются на веб-странице, он автоматически обновляет их положение в кэше браузера, поэтому они с меньшей вероятностью будут сброшены тайник.

кэш браузера является межстраничным, поэтому он работает для любой страницы, загруженной в браузер. Таким образом, вы можете предварительно кэшировать в одном месте на своем сайте, и кэш браузера будет работать для всех других страниц на вашем сайте.


при предварительном кэшировании, как указано выше, изображения загружаются асинхронно, поэтому они не будут блокировать загрузку или отображение вашей страницы. Но, если на Вашей странице есть много собственных изображений, эти изображения precache могут конкурировать за пропускную способность или соединения с изображениями, которые отображаются на Вашей странице. Обычно это не является заметной проблемой, но при медленном соединении это предварительное кэширование может замедлить загрузку главной страницы. Если вы не возражаете, чтобы изображения предварительной загрузки загружались последними, вы можете использовать версию функции, которая будет ждать начала предварительной загрузки до тех пор, пока все другие ресурсы страницы не будут загружены.

function preloadImages(array, waitForOtherResources, timeout) {
    var loaded = false, list = preloadImages.list, imgs = array.slice(0), t = timeout || 15*1000, timer;
    if (!preloadImages.list) {
        preloadImages.list = [];
    }
    if (!waitForOtherResources || document.readyState === 'complete') {
        loadNow();
    } else {
        window.addEventListener("load", function() {
            clearTimeout(timer);
            loadNow();
        });
        // in case window.addEventListener doesn't get called (sometimes some resource gets stuck)
        // then preload the images anyway after some timeout time
        timer = setTimeout(loadNow, t);
    }

    function loadNow() {
        if (!loaded) {
            loaded = true;
            for (var i = 0; i < imgs.length; i++) {
                var img = new Image();
                img.onload = img.onerror = img.onabort = function() {
                    var index = list.indexOf(this);
                    if (index !== -1) {
                        // remove image from the array once it's loaded
                        // for memory consumption reasons
                        list.splice(index, 1);
                    }
                }
                list.push(img);
                img.src = imgs[i];
            }
        }
    }
}

preloadImages(["url1.jpg", "url2.jpg", "url3.jpg"], true);
preloadImages(["url99.jpg", "url98.jpg"], true);

как сказал @Pointy, вы не кэшируете изображения с помощью javascript, браузер делает это. так что это может быть то, что вы просите, а может и не быть... но вы можете предварительно загрузить изображения с помощью JavaScript. Помещая все изображения, которые вы хотите предварительно загрузить в массив, и помещая все изображения в этот массив в скрытые элементы img, вы эффективно предварительно загружаете (или кэшируете) изображения.

var images = [
'/path/to/image1.png',
'/path/to/image2.png'
];

$(images).each(function() {
var image = $('<img />').attr('src', this);
});

есть несколько вещей, которые вы можете посмотреть на:

предварительная загрузка изображений
Установка времени в кэше .htaccess file
Размер файла изображений и base64 их кодирование.

предварительная загрузка: http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/

кэширование: http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html

есть несколько разных мыслей для base64 кодирование, некоторые говорят, что http-запросы болото вниз пропускной способности, в то время как другие говорят, что "воспринимается" загрузка лучше. Я оставлю это в воздухе.

У меня есть аналогичный ответ для асинхронной предварительной загрузки изображений через JS. Их динамическая загрузка-это то же самое, что и обычная загрузка. они будут кэшировать.

Что касается кэширования, вы не можете управлять браузером, но вы можете установить его через сервер. если вам нужно загрузить свежий ресурсов по требованию, вы можете использовать cache buster technique для принудительной загрузки свежего ресурса.

даже если ваш вопрос говорит "с помощью javascript", вы можете использовать prefetch атрибут тега ссылки для предварительной загрузки любого актива. На момент написания этой статьи (10 августа 2016 года) он не поддерживается в Safari, но почти везде:

<link rel="prefetch" href="(url)">

дополнительная информация о поддержке здесь: http://caniuse.com/#search=prefetch

обратите внимание, что IE 9,10 не перечислены в caniuse матрицы, потому что Microsoft прекратила поддержку для них.

Так если вы действительно застряли на использовании javascript, вы можете использовать jquery для динамического добавления этих элементов на свою страницу; -)

Я использую аналогичную технику для lazyload изображений, но не могу не заметить, что Javascript не получает доступ к кэшу браузера при первой загрузке.

мой пример:

У меня есть вращающийся баннер на моей домашней странице с 4 изображениями слайдер ждет 2 секунды, чем javascript загружает следующее изображение, ждет 2 секунды и т. д.

эти изображения имеют уникальные URL-адреса, которые меняются всякий раз, когда я их изменяю, поэтому они получают заголовки кэширования, которые будут кэшироваться в браузере для год.

max-age: 31536000, public

теперь, когда я открываю Chrome Devtools и убедитесь, что опция de 'Disable cache' не активна и загружает страницу в первый раз (после очистки кэша), все изображения получают выборку и имеют статус 200. После полного цикла всех изображений в баннере сетевые запросы останавливаются и используются кэшированные изображения.

теперь, когда я делаю регулярное обновление или перейти на подстраницу и нажмите кнопку назад, изображения, которые находятся в кэше, кажется, игнорируются. Я бы ожидать, чтобы увидеть серое сообщение "из дискового кэша" на вкладке Сеть Chrome devtools. Вместо этого я вижу, что запросы проходят каждые две секунды с зеленым кругом состояния вместо Серого, я вижу, что данные передаются, поэтому у меня создается впечатление, что кэш вообще не доступен из javascript. Он просто извлекает изображение каждый раз, когда страница загружается.

таким образом, каждый запрос на домашнюю страницу запускает 4 запроса независимо от политики кэширования изображения.

учитывая вышесказанное вместе и новый стандарт http2 большинство веб-серверов и браузеров теперь поддерживают, я думаю, что лучше прекратить использовать lazyloading, так как http2 будет загружать все изображения почти одновременно.

Если это ошибка в Chrome Devtools, это действительно удивляет, что никто этого еще не заметил. ;)

Если это верно, использование lazyloading только увеличивает использование полосы пропускания.

пожалуйста, поправьте меня, если я ошибаюсь. :)

да, браузер автоматически кэширует изображения для вас.

однако вы можете установить срок действия кэша изображений. Проверьте это переполнение стека вопросы и ответы:

Срок Действия Кэша На Статических Изображениях

Я всегда предпочитаю использовать пример, упомянутый в Konva JS: события изображения для загрузки изображений.

  1. вы должны иметь список URL-адресов изображений в качестве объекта или массива, например:

    var sources = { lion: '/assets/lion.png', monkey: '/assets/monkey.png' };

  2. определите определение функции, где он получает список URL-адресов изображений и функцию обратного вызова в своем списке аргументов, поэтому, когда он закончит загрузку изображения, вы можете начать excution в своем интернете страница:

    function loadImages(sources, callback) {
                var images = {};
                var loadedImages = 0;
                var numImages = 0;
                for (var src in sources) {
                    numImages++;
                }
                for (var src in sources) {
                    images[src] = new Image();
                    images[src].onload = function () {
                        if (++loadedImages >= numImages) {
                            callback(images);
                        }
                    };
                    images[src].src = sources[src];
                }
            }
  1. наконец, вам нужно вызвать функцию. Вы можете вызвать его, например, из jQuery ' s Документ

$(document).ready(function (){ loadImages(sources, buildStage); });

Comments

    Ничего не найдено.