Чому погана практика повертати згенерований HTML замість JSON? Або це?


301

Завантажити вміст HTML зі своїх користувацьких URL-адрес / веб-служб досить просто за допомогою JQuery або будь-якого іншого подібного фреймворку. Я багато разів використовував цей підхід і до цього часу вважав ефективність задовільною.

Але всі книги, всі експерти намагаються змусити мене використовувати JSON замість генерованого HTML. Як він набагато перевершує HTML?

Це дуже швидше?
Чи має він набагато менше навантаження на сервер?

З іншого боку, у мене є деякі причини використання створеного HTML.

  1. Це проста розмітка, і часто так само компактна або насправді більш компактна, ніж JSON.
  2. Це менше схильних до помилок, тому що все, що ви отримуєте, - це розмітка, і немає коду.
  3. Програмування буде швидше у більшості випадків, оскільки вам не доведеться писати код окремо для клієнта.

На якій стороні ви знаходитесь і чому?


варто відзначити, що X в AJAX - це XML, а HTML в один момент повинен був бути XML. Ідея полягала в тому, що HTML - це людські та машиночитані дані (як JSON), а CSS буде робити презентацію. За таких умов, це не порушило б "розділення проблем" надсилати HTML у запиті AJAX
code_monk

Відповіді:


255

Я трохи по обидва боки, насправді:

  • Коли то , що мені потрібно на стороні браузера дані , я використовую JSON
  • Коли мені потрібно на стороні javascript - це презентація, на якій я не буду робити жодних обчислень, я зазвичай використовую HTML

Основна перевага використання HTML полягає в тому, що ви хочете замінити повну частину своєї сторінки тим, що повертається з запиту Ajax:

  • Повторно скласти частину сторінки в JS (досить) важко
  • Напевно, у вас вже є якийсь механізм шаблонування на стороні сервера, який використовувався в першу чергу для створення сторінки ... Чому б не використати її повторно?

Я, як правило, не беру до уваги "продуктивність" сторони речей, принаймні на сервері:

  • На сервері, генеруючи частину HTML чи деякий JSON, ймовірно, це не змінить
  • Про розмір речей, які проходять через мережу: ну ви, мабуть, не використовуєте сотні КБ даних / html ... Використання gzip у будь-якому, що ви передаваєте, саме те, що має найбільше значення (не вибираючи між HTML і JSON)
  • Одне, що може бути враховано, це те, які ресурси вам потрібні клієнту, щоб відтворити HTML (або структуру DOM) з даних JSON ... порівняйте це з проштовхуванням частини HTML на сторінку; -)

Нарешті, однозначно важливе:

  • Скільки часу знадобиться розробка нової системи, яка надсилатиме дані як JSON + код, JS, необхідний для введення його як HTML на сторінку?
  • Скільки часу буде потрібно лише повернути HTML? І як довго, якщо ви зможете повторно використовувати якийсь із вже існуючих кодів на стороні сервера?


І щоб відповісти на іншу відповідь: якщо вам потрібно оновити більше однієї частини сторінки, все ще є рішення / хак для надсилання всіх цих частин в одну велику рядок, що об'єднує кілька частин HTML, і витягніть відповідні частини в JS.

Наприклад, ви можете повернути рядок, який виглядає приблизно так:

<!-- MARKER_BEGIN_PART1 -->
here goes the html
code for part 1
<!-- MARKER_END_PART1 -->
<!-- MARKER_BEGIN_PART2 -->
here goes the html
code for part 2
<!-- MARKER_END_PART2 -->
<!-- MARKER_BEGIN_PART3 -->
here goes the json data
that will be used to build part 3
from the JS code
<!-- MARKER_END_PART3 -->

Це виглядає не дуже добре, але це, безумовно, корисно (я використовував його досить багато разів, в основному, коли HTML-дані були занадто великими, щоб бути інкапсульованими в JSON) : ви надсилаєте HTML для частин сторінки, які потрібна презентація, і ви надсилаєте JSON у випадку необхідних даних ...

... І щоб витягнути їх, метод підстроки JS зробить трюк, я думаю ;-)


6
Усі дані в кінцевому підсумку представлені.
Кирило Гупта

47
@Cyril: Так? Я думаю, ви намагаєтесь сказати, що дані, щоб бути корисними, повинні бути використані і таким чином подані десь у якійсь формі, і я згоден. Але говорити про те, що дані є уявлення здається помилковим, по крайней мере.
Вінко Врсалович

10
Привіт Винко, помічаєш "в кінцевому рахунку"? Я маю на увазі саме те, що ти маєш на увазі. Тут просто намагаюся потрапити в книгу цитат. Ха-ха!
Кирило Гупта

37
Основне питання полягає в тому, чи ви абсолютно, позитивно, впевнені, що не будете використовувати ці дані ні для чого, крім HTML. Оскільки після упаковки в HTML, дані будуть майже неможливими. З JSON ваш бекенд може працювати з XML, SVG, двигунами баз даних, міжміським API та тисячею інших інтерфейсів і систем, які можуть приймати JSON. За допомогою HTML ви зможете використовувати його лише в межах HTML.
СФ.

3
@SF: Повертаючи HTML з сервера, я переконуюсь, що я розділяю код, що генерує HTML, від коду, що здійснює доступ до бази даних. Таким чином я легко можу також додати форму JSON.
Casebash

114

В основному я згоден з висловленими тут думками. Я просто хотів підсумувати їх як:

  • Неправильна практика надсилати HTML, якщо ви в кінцевому підсумку аналізуєте його на стороні клієнта, щоб зробити деякі обчислення над ним.

  • Неправильна практика надсилати JSON, якщо все, що ви в кінцевому підсумку робите, - це включити його в дерево DOM сторінки.


3
що робити, якщо вам потрібно зробити деякі обчислення, а також включити його до DOM сторінки?
Енріке

Цікаво, як довго до цього твердження буде додана правдивість, якщо ви додасте в рівняння " напівжиття знань "?
Валь

чи можна повернути HTML, який містить теги <script>, а потім виконувати їх на стороні клієнта при завантаженні сторінки?
nish1013

Це. Крім того, якщо ви повертаєте дані, які повинні бути певними в їх представленні, наприклад, якщо у вас є HTML-таблиця зі стовпцями, яку ви хочете мати можливість сортувати. Незалежно від того, ви зробили їх сортуванням зараз чи ні, можливо, ви захочете пізніше, тож у такому випадку майбутні випробування варті додаткових зусиль для проходження маршруту JSON.
trpt4him

Я також додав би, якщо ви вимагаєте URL-адрес зображення через JSON лише для того, щоб спробувати відобразити їх на сторінці, набагато ефективніше включати їх у HTML з самого початку, щоб зображення могли розпочати завантаження раніше (до того, як ваш Ajax повернеться) .
FailedUnitTest

30

Добре,

Я одна з тих рідкісних людей, яка любить розділяти речі таким чином: - Сервер відповідає за доставку даних (модель); - Клієнт відповідає за показ (перегляд) та маніпулювання даними (модель);

Отже, сервер повинен зосередитися на наданні моделі (в цьому випадку JSON краще). Таким чином, ви отримуєте гнучкий підхід. Якщо ви хочете змінити вигляд вашої моделі, ви продовжуєте сервер надсилати ті самі дані і просто змінювати клієнт, компоненти JavaScript, які змінюють ці дані на представлення. Уявіть, у вас є сервер, який передає дані на мобільні пристрої, а також настільні додатки.

Крім того, такий підхід збільшує продуктивність, оскільки сервер і клієнтський код можна будувати одночасно, ніколи не втрачаючи уваги, що відбувається, коли ви продовжуєте переходити з js на PHP / JAVA / і т.д.

Як правило, я думаю, що більшість людей вважають за краще робити якомога більше на серверній стороні, оскільки вони не опановують js, тому намагаються уникати цього якомога більше.

В основному я маю таку ж думку, що і ті хлопці, які працюють над Angular. На мою думку, це майбутнє веб-додатків.


Так, я повністю з вами згоден. Однак я вважаю, що робити стільки серверів, коли стосується конфіденційна інформація. Якщо вам потрібен клієнт, щоб реагувати по-різному, залежно від результату, я використовував би json, інакше я б користувався html.
Fi Horan

9

У мене є щось цікаве, що я думав, що можу додати. Я розробив додаток, який лише один раз завантажував повний перегляд. З цього моменту він спілкувався назад із сервером лише ajax. Для завантаження однієї сторінки потрібно було лише колись (моя причина цього тут неважлива). Цікава частина полягає в тому, що у мене була особлива потреба повернути деякі дані, якими слід працювати в javascript І частковий вигляд, який буде відображатися. Я міг би розділити це на два заклики до двох окремих методів дій, але я вирішив піти на щось трохи веселіше.

Перевір:

public JsonResult MyJsonObject(string someData)
{
     return Json(new { SomeData = someData, PartialView = RenderPartialViewToString("JsonPartialView", null) }, JsonRequestBehavior.AllowGet);
}

Що ви можете запитати RenderPartialViewToString ()? Саме цей маленький самородок прохолоди тут:

protected string RenderPartialViewToString(string viewName, object model)
{
     ViewData.Model = model;

     using (StringWriter sw = new StringWriter())
     {
          ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
          ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
          viewResult.View.Render(viewContext, sw);

          return sw.GetStringBuilder().ToString();
     }
}

Я не робив жодних тестів на ефективність щодо цього, тому я не впевнений, що він несе більш-менш накладні витрати, ніж викликати один метод дій для JsonResult і один для ParticalViewResult, але я все ще вважав, що це досить круто. Він просто серіалізує частковий вигляд у рядок і надсилає його разом з Json як один із його параметрів. Тоді я використовую JQuery, щоб взяти цей параметр і ляпати його у відповідний вузол DOM :)

Дайте мені знати, що ви думаєте про мій гібрид!


1
Надсилання винесеного подання та даних в одному запиті здається трохи зайвим. Жартую, якби у вас була можливість робити візуалізацію подання на стороні клієнта, було б ще краще надіслати шаблон перегляду та дані як окремі запити. Він вимагав додаткового запиту, але лише один раз, оскільки запит шаблону буде кешований для наступних запитів. В ідеалі було б найкраще використовувати комбінацію візуалізації подання з боку клієнта та сервера, щоб ви могли створювати сторінки на сервері та часткові частини браузера, але якщо ви реалізуєте лише надання серверного подання, це не є поганим підходом.
Еван Плейс

8

Якщо відповідь не потребує подальшої обробки на стороні клієнта, на мою думку, HTML в порядку. Відправлення JSON лише змусить вас зробити цю обробку на стороні клієнта.

З іншого боку, я використовую JSON, коли не хочу використовувати всі дані відповіді одночасно. Наприклад, у мене є серія з трьох ланцюгових вибірок, де вибране значення одного визначає, які значення використовуватимуться для заповнення другого тощо.


7

IMV, справа в тому, щоб відокремити дані від подання даних, але я з Паскалем, це не обов'язково випливає, що поділ може бути лише через межу клієнта / сервера. Якщо у вас вже є розмежування (на сервері) і ви просто хочете щось показати клієнту, чи ви надсилаєте назад JSON, чи обробляєте його на клієнті, чи просто відправляєте назад HTML, повністю залежить від ваших потреб. Сказати, що ви "неправі" надсилати HTML назад у загальному випадку, це занадто бланк заяви IMV.


6

JSON дуже універсальний і легкий формат. Я виявив його красу, коли почав використовувати її як дані про аналізатор шаблону на стороні клієнта. Поясню, поки я використовував smarty та погляди на стороні сервера (генеруючи велике навантаження сервера), тепер я використовую деякі спеціальні функції jquery, і всі дані надаються на стороні клієнта, використовуючи браузер клієнтів як аналізатор шаблонів. це економить серверні ресурси, а інші браузери щодня покращують свої двигуни JS. Тому швидкість розбору клієнтів зараз не є важливою проблемою, навіть більше, об'єкти JSON зазвичай дуже малі, тому вони не споживають багато клієнтських ресурсів. Я вважаю за краще мати повільний веб-сайт для деяких користувачів з повільним браузером, а не повільний сайт для всіх через дуже завантажений сервер.

З іншого боку, надсилаючи чисті дані з сервера, ви абстрагуєте їх від презентації, тому, якщо завтра ви хочете змінити їх або інтегрувати свої дані в інший сервіс, ви можете зробити це набагато простіше.

Всього мої 2 копійки.


І як ви забезпечите отримання читабельної сторінки, коли JavaScript відключений?
Вінко Врсалович

8
якщо JS відключений, ви також не зможете завантажити HTML. JS відключено для 2,3% користувачів відповідно до моєї статистики Google Analytics. Найкращий спосіб спуститися - спробувати догодити всім.
Майк

4
Я згідний на 100% з Майком. Намагатися догодити всім неможливо і тільки зашкодить вам. Якщо користувачі вимикають JS, вони повинні використовуватись на багатьох сайтах, які досі не працюють для них.
Шев

1
Як отримати статистику JavaScript в Analytics, оскільки Analytics використовує Javascript для відстеження даних?
Нік

@Nick Добре запитання, але я знайшов це: stackoverflow.com/questions/15265883/…
Ренан Кавалієрі

6

Якщо ви хочете отримати чистий розв'язаний клієнт, що, на мій погляд, є найкращою практикою, то має сенс мати 100% DOM, створений JavaScript. Якщо ви створюєте клієнт на базі MVC, який має всі знання про те, як створити інтерфейс користувача, то ваші користувачі завантажують один раз файл Javascript один раз і він кешується на клієнті. Усі запити після цього початкового завантаження базуються на Ajax і повертають лише дані. Цей підхід є найчистішим, що я знайшов, і забезпечує чітке незалежне капсулювання презентації.

Тоді серверна сторона зосереджується лише на наданні даних.

Тож завтра, коли продукт попросить вас повністю змінити дизайн сторінки, все, що ви зміните, - це джерело JS, який створює DOM, але, швидше за все, ви отримаєте можливість використовувати вже наявні обробники подій, і сервер не звертає уваги, оскільки він на 100% відключається від презентації


1
Я згоден, також ви можете повторно використовувати json для свого мобільного додатка.
Алекс Шильман

Це повинна була бути прийнята відповідь - перші 6 - 7 слів відповідають на питання лаконічно.
nicholaswmin

Погодьтеся. Перевага даних повернення (JSON) перед презентацією (html) полягає в тому, що тепер у вас є "безкоштовний" веб-API, який можна повторно використовувати для інших клієнтів, будь то мобільний або зовсім інший додаток, який зацікавлений у деяких даних цього додатка За моїм досвідом використання простої веб-бази на сервері, яка стосується лише даних, а не представлення, часто призводить до хороших і простих результатів. Сучасні браузери та процесори настільки швидкі, що лише в особливих випадках візуалізація буде вузьким місцем. Найбільшим вузьким місцем в основному є сама мережа та виклик бази даних.
початківець_

4

Залежно від вашого інтерфейсу користувача, можливо, вам доведеться оновити два (або більше) різних елемента у вашому домені. Якщо ваша відповідь у HTML, чи збираєтесь ви її розібратися, щоб зрозуміти, що куди йде? Або ви можете просто використовувати хеш JSON.

Ви навіть можете комбінувати його, повертати дані JSON w / html :)

{ 'dom_ele_1' : '<p>My HTML part 1</p>', 'dome_ele_2' : '<div>Your payment has been received</div>' }

Неправильно відправляти JSON, якщо все, що ви в кінцевому підсумку робитимете, це включити його в дерево DOM сторінки ... і комбінуючи JSON з HTML, ви використовуєте цю погану процедуру
thermz

2

HTML має багато зайвих і не відображаються даних, тобто тегів, таблиць стилів тощо. Отже, розмір HTML у порівнянні з даними JSON буде більшим, що призведе до більшого часу завантаження та візуалізації, а також призведе до того, що браузер буде зайнятий переданням нових даних.


1

Надсилання json, як правило, виконується, коли у вас є віджет javascript, який запитує інформацію з сервера, наприклад, список або дерево, або автозаповнення. Це коли я надішлю JSON, оскільки це дані, які будуть проаналізовані та використані в сирому вигляді. Однак якщо ваш тільки що покаже HTML, то його набагато менше роботи, щоб створити його на стороні сервера і просто показати його в браузері. Веб-браузери оптимізовані для вставки HTML безпосередньо в dom з innerHTML = "", тому ви не можете помилитися з цим.


FWIW, innerHTMLісторично набагато повільніше, ніж фрагмент документа: coderwall.com/p/o9ws2g/… .
Нейт Уіттакер

0

Я думаю, це залежить від структури дизайну, використовувати JSON просто більш сексуально, ніж HTML, але питання полягає в тому, як би впоратися з ним, щоб його було легко підтримувати.

Наприклад, скажіть, що у мене є сторінка переліку, яка використовує той самий html / стиль всього сайту, я б написав глобальну функцію для форматування цих частин HTML, і все, що мені потрібно зробити, це передати об’єкт JSON у функцію.


0

Відповіді Html достатньо в більшості випадків, якщо вам не доведеться виконати певний розрахунок на стороні клієнта.


0

Залежить від обставин.

Іноді важливо уникати JSON. Наприклад, коли наші програмісти мають проблеми з програмуванням у js, наприклад.

Мій досвід говорить про це: краще використовувати послугу ajax, ніж вбудований JSON.

Рано чи пізно js стає проблемою

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.