Вернуть HTML или построить HTML, используя JavaScript? - PullRequest
9 голосов
/ 08 февраля 2011

Я возвращаю данные о контактах для создания списка

основной HTML выглядит как

{repeat:20}
<div class="contact">
  <a rel="123">FirstName LastName</a>
  <div class="info">
    {repeat:5}
    <div>
      <div class="infoLabel">Age:</div>
      <div class="infoPiece">56</div>
    </div>
    {endrepeat}
  </div>
</div>
{endrepeat}

{repeat: 20} не является действительным кодомЭтот блок кода повторяется 20 раз

Мой вопрос.

Что более полезно:

  1. Создайте сервер разметки, верните фактическуюhtml.
  2. Возвращает данные Json вместе с информацией и создает список на стороне клиента.

Для целей данного обсуждения предположим, что некоторые константы

  • Загрузка сервера не является проблемой (мы используем высокопроизводительный сервер)
  • Возвращенные данныетолько для отображения (не манипулировать)
  • Мы не учитываем пользователей без включенного JavaScript.
  • Мы не учитываем браузеры

Ответы [ 7 ]

8 голосов
/ 08 февраля 2011

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

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

С другой стороны, просто отправка данных JSON, например, и выполнение рендеринга на клиенте, намного меньшетрафик по проводам, но это больше нагрузки на процессор на стороне клиента.Браузеры (DOM + ECMAscript) значительно повысили производительность за последние годы и месяцы, поэтому многие приложения так и делают.

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

|box1|item1|item2

меньше кода, чем нотация JSON

'{"box1": ["item1", "item2"]}'

Это, конечно, очень специфично, но оно экономит много трафика, если мы собираемся по-настоящему большой.Я рекомендую книгу Николаса С. Закаса Высокопроизводительный Javascript .Отличная книга на эту тему.

3 голосов
/ 08 февраля 2011

Если вы планируете выполнять интенсивные задачи AJAX, такие как добавление новых записей, редактирование их на лету и т. Д., Тогда я предлагаю вам загрузить пустую страницу, которая вызывает скрипт, который возвращает массив словарей от JSONи затем с помощью системы Template (бета), реализованной недавно в jQuery, или самостоятельно внедрите ее, имея скрытый элемент, с тегами spans / divs / tds, помеченными классами, и клонируйте и заполняйте его каждый раз, когда создаете новыйзапись поступила.

С другой стороны, если вы собираетесь сохранять статичность, просто используйте HTML.

Вот как я управляю шаблонами.Это эффективный способ, поскольку элементы DOM существуют в дереве DOM, и клонирование обходится дешевле, чем анализ строки, содержащей элементы.

<html>
    <head>
        <script type="text/javascript">
            $(function() {

                $contactTemplate = $("#contact_template")
                function makeContactElement(data) {
                    var $newElem = $contactTemplate.clone(true)

                    $newElem.attr("data-id", data.id)
                    $newElem.find(".name").text( data.firstName + " " + data.lastName )

                    for(var i in data.info) {
                        $newElem.find(".info").append( makeInfoElement(data.info[i]) )
                    }

                    return $newElem
                }

                $infoTemplate = $("#info_template")
                function makeInfoElement(data) {
                    var $newElem = $infoTemplate.clone(true)

                    $newElem.find("infoLabel").text(info.label)
                    $newElem.find("infoPiece").text(info.piece)

                    return $newElem
                }

                $.getJSON('/foo.bar', null, function(data) {
                    for(var i in data) {
                        $("#container").append( makeInfoElement(data[i]) )
                    }
                })
            })
        </script>
        <style type="text/css">
            .template { display: none; }
        </style>
    </head>
    <body>

        <div id="container">
        </div>

        <!-- Hidden elements -->

        <div id="contact_template" class="contact template">
          <a rel="123" class="name"></a>
          <div class="info"></div>
        </div>

        <div id="info_template" class="template">
          <div class="infoLabel"></div>
          <div class="infoPiece"></div>
        </div>
    </body>
</html>

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

Использование .clone(true) открывает дверь для создания общих событий вместо привязки живого события, что более дорого.

Например, если вы хотите сделать кнопку для удаления записи:

<script ...>
...
$("#contact_template .delete").click(function() {
    var id = $(this).parents("contact").attr("data-id")
    $.post('/foo.bar', { action: delete, id: id }, function() { ... })
    return false
})
</script>
...
<div id="contact_template" class="contact template">
    <a href="#" class="delete">Delete</a>
</div>

Удачи!

2 голосов
/ 08 февраля 2011

Лично я бы создал серверную часть и вернул бы html. Основная причина в том, что в противном случае ваш сайт бесполезен для тех, у кого отключен JavaScript. Это также было бы в значительной степени невидимым для поисковых систем.

1 голос
/ 08 февраля 2011

Поскольку вас не беспокоит нагрузка на сервер и у вас есть запасные циклы ЦП, продолжайте, и ваш бэкэнд сделает основную часть работы. Приложение будет работать быстрее и быстрее. Однако следует помнить об использовании сети. Бросание строк JSON назад и вперед чрезвычайно эффективно и снижает нагрузку на сеть, но требует, чтобы клиент выполнял больше работы. Как отмечалось в этом обсуждении, браузеры в наши дни работают очень быстро. Реализации JavaScript в Chrome, FF4 и IE9 - одни из самых быстрых, которые мы когда-либо видели.

Я предлагаю сделать небольшой тест с вашим приложением «как есть» и посмотреть, как оно работает. Попробуйте поразить два варианта множеством запросов, чтобы увидеть вещи под нагрузкой. Это действительно будет зависеть от вашего конкретного приложения.

1 голос
/ 08 февраля 2011

Кажется, вы спрашиваете мнение, а не конкретный ответ на технический вопрос.Так вот мое мнение.

В настоящее время наблюдается тенденция к созданию веб-приложений с большей функциональностью на стороне клиента и автономными функциями.Поэтому я бы сделал это на стороне клиента и отправил бы JSON.Это также более масштабируемо, поскольку серверная часть выполняет меньше работы.

1 голос
/ 08 февраля 2011

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

1 голос
/ 08 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...