данные angularjs и JSON загружаются медленно - поиск лучшей производительности

Вот предыстория того, что я пытаюсь сделать.

У меня есть список из примерно 70 продуктов, которыми я хочу управлять в файле JSON. Файл состоит из данных изображения, заголовка, подзаголовка и краткого описания. Позже также будет ссылка на файл PDF, поэтому он также будет включен в файл JSON.

Вот как сейчас выглядит файл JSON:

[
    {
        "category": "oil",
        "image": "/xps-product-list/img/2-STROKE_MINERAL_OIL_GROUP.jpg",
        "title": "Maintenance and Oil Change Kit Spyder",
        "subTitle": "Engine Oils",
        "description": "Complete maintenance right out of the box: O-Ring, XPS oil, Rotax oil filter and instruction sheet"
    },
    {
        "category": "fuel",
        "image": "/xps-product-list/img/2-STROKE_PREMIX_OIL.jpg",
        "title": "XPS Premix Oil",
        "subTitle": "Engine Oils",
        "description": "Superior performance 2-stroke oil developed especially for Rotax 2-stroke engines. Formulated for fast and easy mixing at very cold temperatures. Please contact your nearest dealer for suggested retail prices of oil based products."
    }
]

Я использую AngularJS для ввода данных JSON и использую директиву ng-repeat для повторения данных и их отображения:

function AlbumCtrl($scope, $http, $timeout) {
    $scope.url = 'images.json';



    $scope.handleImagesLoaded = function (data, status) {
        $scope.images = data;
        $scope.currentImage = _.first($scope.images);

    }

    $scope.fetch = function () {
        $http.get($scope.url).success($scope.handleImagesLoaded);
    }

    $scope.setCurrentImage = function (image) {
        $scope.currentImage = image;
    }

    $timeout ($scope.fetch, 1000);
}

Тогда это HTML с ng-repeat:

<div id="image-container" ng-controller="AlbumCtrl">
       <div id="header">
          <div class="product-info">
              <ul>
                  <li ng-repeat="image in images | filter:categories">
                      <img ng-src="{{image.image}}" id="small-prod-img"/>
                       <h2>{{image.title}}</h2>
                       <h3>{{image.subTitle}}</h3>
                       <h4>{{image.description}}</h4>
                  </li>
              </ul>
           </div>
       </div>
   </div>     

Я чувствую, что должен быть более чистый способ сделать это. Проблема, с которой я сталкиваюсь, заключается в том, что изображения долго загружаются. Я использовал инструменты разработчика Firebug (вкладка сети), чтобы увидеть, насколько быстро загружаются данные. Существует постоянная задержка между временем загрузки данных и загрузкой изображений, обычно около полусекунды или около того.

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

Любые предложения будут ценны.

Пит

РЕДАКТИРОВАТЬ: Забыл упомянуть, что это будет одна страница со всеми продуктами, загруженными на одну страницу. Я также собирался использовать категорию и создать раскрывающуюся страницу, чтобы пользователь мог также фильтровать по категориям.

РЕДАКТИРОВАТЬ № 2 - вот изображение вкладки сети из инструментов разработчика Firefox, где вы можете четко видеть отставание при загрузке изображений:

введите здесь описание изображения


person Dade    schedule 06.11.2014    source источник
comment
насколько велики эти изображения?   -  person prawn    schedule 06.11.2014
comment
попробуйте найти способ загружать изображения только тогда, когда они видны на экране, чтобы они загружались один за другим, когда пользователь будет на них   -  person Charlie    schedule 06.11.2014
comment
@prawn Изображения на самом деле довольно маленькие - всего около 30-50 КБ.   -  person Dade    schedule 06.11.2014
comment
@charlie - ты говоришь о ленивой загрузке изображений?   -  person Dade    schedule 06.11.2014
comment
30 КБ * 70 изображений — это много для загрузки по умолчанию.   -  person isherwood    schedule 06.11.2014
comment
да, ленивая загрузка, хотя я не уверен, как этого добиться, но я думаю, что использование CSS было бы самым простым способом   -  person Charlie    schedule 07.11.2014


Ответы (1)


Здесь у вас есть несколько вариантов. Более простой вариант, который не изменит архитектуру вашего сайта/приложения, уже упоминался в комментарии: ограничьте количество изображений/данных, которые вы загружаете одновременно. Я предполагаю, что вы можете разделить 70 продуктов на 9 на странице (сетка 3 x 3). Таким образом, вы можете заменить

<li ng-repeat="image in images | filter:categories">

с

<li ng-repeat="image in images | filter:categories | limitTo: 9">

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

Более сложный, но более масштабируемый способ изменить архитектуру вашего приложения — использовать базу данных для хранения этой информации. Обычно я использую MongoDB, потому что он возвращает запросы в формате JSON, хорошо интегрируется с Angular.js, а его формат BSON намного быстрее, чем JSON.

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

$timeout ($scope.fetch, 1000);

и просто вызовите функцию выборки напрямую. Можно сэкономить секунду :)

person Yatit Thakker    schedule 06.11.2014
comment
Проблема здесь не в том, что загрузка занимает слишком много времени; дело в том, что для начала загрузки требуется много времени. - person New Dev; 06.11.2014
comment
Затем я бы пошел с последней частью, удалив $timeout и вызвав функцию напрямую, потому что $timeout задерживает запуск загрузки на секунду. - person Yatit Thakker; 06.11.2014
comment
@Yatit - я только начинаю работать с MongoDB. Насколько сложно было бы создать коллекцию для моих 70 записей, а затем загрузить их через AngularJS? Не могли бы вы дать мне несколько простых инструкций? - person Dade; 06.11.2014
comment
Если вы только начинаете, может потребоваться некоторое время, чтобы получить правильную реализацию. Отчасти то, насколько легко это будет, будет зависеть от того, на какой платформе написан ваш сервер (я больше всего знаком с node.js). Что касается получения ресурсов из БД с помощью Angular.js, вы можете продолжать использовать $http для вызова ваш сервер. На вашем сервере вам нужно будет написать логику для определенного URL-адреса, чтобы ПОЛУЧИТЬ эти изображения из Mongo (например, /api/images/) - person Yatit Thakker; 07.11.2014