Це гарна ідея зробити користувальницький інтерфейс 100% у Javascript та надавати дані через API?


19

Моя основна робота щодня - це створення програм HTML. З цим я маю на увазі внутрішньо використовувані програми типу CRUD з безліччю редагованих переглядів сітки, текстових полів, спасних місць і т. Д. Ми зараз використовуємо веб-форми ASP.NET, які справді виконують роботу, але продуктивність в основному похмура, і досить часто ви доведеться стрибати через обручі, щоб отримати те, що потрібно. Обручі, які вішають на стелю і встановлюють полум’я.

Тож мені цікаво, чи, можливо, було б гарною ідеєю перемістити весь інтерфейс користувача на сторону JavaScript. Розробіть потужний набір елементів багаторазового керування, які спеціально підібрані до наших потреб, та обмінюйтесь лише даними з сервером. Так, мені подобається парадигма "control" (він же "віджет"), вона цілком підходить для таких програм. Таким чином, на стороні сервера у нас все ще буде основний макет, подібний до нашої поточної розмітки ASPX, але потім він буде надісланий клієнту лише один раз, і частина Javascript подбає про всі наступні оновлення інтерфейсу користувача.

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

  • Продуктивність досі. Бенчмаркінг показує, що в даний час основна затримка знаходиться на стороні клієнта, коли браузер намагається відновити більшу частину сторінки після оновлення AJAX. Розроблена розмітка веб-форм ASP.NET надає нового значення слову "web", а багаті елементи управління Devexpress додають власний шар складності Javascript. Але чи було б швидше перерахувати всі необхідні зміни на стороні Javascript, а потім оновити лише те, що потрібно оновити? Зауважте, що я говорю про форми, які мають декілька редакторів сітки для редагування, безліч текстових скриньок, безліч спаднень, у яких є півмільйона фільтруваних елементів тощо.
  • Легкість розвитку . Зараз буде набагато більше Javascript, і він, ймовірно, змішається з розміткою HTML сторінки. Той чи якийсь новий двигун огляду мав би бути виготовлений. Intellisense для Javascript також набагато гірший, ніж для коду C #, і через динамічний характер Javascript не можна очікувати, що він стане набагато кращим. Практика кодування може трохи покращити її, але не набагато. Крім того, більшість наших розробників в першу чергу є розробниками C #, тому будуть деякі криві навчання та початкові помилки.
  • Безпека . Багато перевірок безпеки доведеться зробити двічі (на стороні сервера та на користувальницькому інтерфейсі), і на стороні сервера для обробки даних доведеться включити набагато більше їх. В даний час, якщо ви встановили текстове поле лише для читання на стороні сервера, ви можете залежати від його значення, що не змінюється через клієнтський перехід. Рамка вже має достатній код для забезпечення (за допомогою шифрування viewstate). З підходом лише до даних стає важче, тому що вам потрібно все вручну перевірити. З іншого боку, можливо, в місцях безпеки буде простіше помітити, тому що у вас будуть лише дані, про які потрібно турбуватися.

Загалом, чи вирішить це наші проблеми, чи погіршить їх? Хто-небудь намагався цього зробити, і які були результати? Чи є там якісь рамки, які допомагають у подібних починаннях (jQuery та моральні еквіваленти вбік)?


So on the server side we would still have a basic layout simliar to our current ASPX markup, but that then would get sent to the client only once, and the Javascript part would take care of all the subsequent UI updates.Ви точно описуєте , що таке ASP.NET, що говорить про те, що ви, ймовірно, не правильно його використовуєте. :) Якщо ви розміщуєте компоненти на панелях оновлення, у своїх програмах ASP.NET тоді бібліотека javascript ASP.NET виконуватиме асинхронні поштові повідомлення на стороні сервера та відтворюватиме лише ті компоненти, які ви вказали.
maple_shaft

@maple_shaft - Я знаю, але якось це працює повільно, як пекло. Також сітки вже роблять зворотній зв'язок. Для всього іншого, якщо є поштовий зворотний зв'язок, у переважній більшості випадків вам все одно потрібно оновити більшу частину сторінки, оскільки елементи керування змінюють видимість / можливість запису / тощо. І це повільно.
Vilx-

3
Щоразу, коли я бачу додаток ASP.NET, де хтось розміщує все на сторінці на панелі оновлень, я відчуваю, що кидаю монітор біля стіни>. <! Це значною мірою перемагає цілі ASP.NET. Для підтримки подій життєвого циклу та подій на сервері необхідно, щоб він спілкувався вперед та назад з усією ViewState сторінки. Якщо у вас є 200 елементів управління та сітка даних, тоді Джоелу Спольському не потрібно було б передбачати, що у вас виникнуть великі проблеми з продуктивністю. Ед Вуддок і AmmoQ підсумували все ідеально, тому мені не потрібно давати вам додаткову відповідь.
maple_shaft

1
@maple_shaft - Вибачте, але я фактично профілював цей матеріал. На локальних комп’ютерах розробників це було / повільно, і Fiddler чітко показав, що HTTP-з'єднання було відкрито менше ніж на секунду, тоді як сторінка з’явилася лише через кілька секунд, і весь цей час браузер використовував стільки процесора, скільки міг дістатись і в основному заморожений. Це не роздутий Viewstate, це роздутий HTML / Javascript.
Vilx-

1
@ Vilx - з C # /. NET немає нічого поганого (крім вікон / вартість). Існують великі проблеми з нальотом, який рамки ASP.NET WebForms ставлять поверх нього. Як було сказано, спробуйте Ненсі, якщо вам подобається .NET. Але це зовсім поза темою, це був лише коментар, що вам краще піти, якщо ви перестанете використовувати веб-форми
Райнос

Відповіді:


10

Linkedin робить це для свого мобільного сайту (див. Http://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile, частина 4), і, мабуть, це було дуже корисно для них з боку точки зору продуктивності.

Однак я б радив вам не робити те саме з різних причин.

Перше - це ремонтопридатність: C # / ASP.net, завдяки серверній базі, не залежить від клієнта, тоді як Javascript не є (навіть із такою рамкою, як jQuery, ви не збираєтеся отримувати 100% сумісність між браузерами. , а не в майбутньому). Я б сказав, що також простіше перевірити функціональність програми зі статичним типом, ніж динамічного, і це обов'язково потрібно врахувати, якщо ви створюєте масштабні сайти.

Друга полягає в тому, що вам буде важко знайти інших людей, здатних (і готових) створити додаток із чистим JavaScript, який має складність, необхідну для запуску всього веб-сайту (порівняно з відносною легкістю пошуку. Програмісти NET). Це може не турбувати вас безпосередньо, але, безумовно, є над чим подумати з довгострокової точки зору.

Третє питання - сумісність з клієнтами; якщо ви створюєте загальнодоступні веб-сайти, то пам’ятайте, що в розумній частині мережі все ще не ввімкнено JS (з різних причин), тому вам потрібно бути абсолютно впевненим, що ви не збираєтесь виключати велику частину вашої бази даних, перейшовши на веб-сайт, керований JS.

Що стосується ваших проблемних проблем:

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

  • Простота розробки насправді також не викликає занепокоєння, на мою думку, для розробки JS є дуже хороші інструменти, не просто вставте себе у VisualStudio, тому що ви звикли до цього! (спробуйте, наприклад, JetBrains WebStorm).

  • Працездатність двигунів перегляду JS у більшості випадків абсолютно чудова (знову ж таки, на моєму досвіді), я їх активно використовую щодня. Я б запропонував уникнути більш важких рамок, таких як knockout.js тощо, і натомість скористайтеся чимось на зразок мікро шаблону Джона Резіга. Таким чином, ви можете підключити підтримуючий код таким чином, щоб ви були впевнені, що вони швидкі та надійні.

Що б я зробив, якби ти був, - це справді вивчити причини цього перемикача; Цілком може бути, що ви просто не використовуєте .NET ефективно та потребуєте вдосконалення своєї гри, WebForms - це не особливо повільний фреймворк, який не виходить з коробки, тому, можливо, деякі сторонні бібліотеки, якими ви користуєтеся сповільнюють показ.

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


Ні, як я вже коментував відповідь Darknights, це внутрішня програма, в якій немає (ну, мало) публічної частини, тому залежність від JavaScript в порядку. І я зробив профілювання. Сторона сервера хороша. Це сторона клієнта, яка впадає під важко створений HTML (як я вже сказав, генерована розмітка ASP.NET є похмурою) та Devexpress Javascript.
Vilx-

1
@EdWoodcock Веб-сайти ASP.NET за своєю суттю керуються Javascript. Це так, як він обробляє асинхронну комунікацію ViewState та візуалізацію елементів сторінки.
maple_shaft

@ Vilx - Це може стати шоком, але такі управління, як Data Grids, надзвичайно складні. Можливо, у вас просто занадто багато елементів на одній сторінці?
maple_shaft

@ Vilx - Можливо, саме час переглядати використання вашого керування, якщо вони генерують шалену розмітку (керування asp.net за замовчуванням не в більшості випадків, якщо ви використовуєте такі речі, як Repeaters замість DataGrids тощо), можливо вам слід скачати власні елементи керування (або замість цього перейти до рукописного HTML у UserControls).
Ед Джеймс

1
@maple_shaft - Або, точніше, Flex, який (наскільки я розумію) побудований на вершині Flash для саме таких цілей. Це ще одна ідея, з якою я бавляюся деякий час. Але ... стільки, скільки я намагався згадати це іншим, я отримував лише негативну відповідь, тому не можу уявити, як це перетягнути. Це також вимагало б від нас усіх дізнатися щось абсолютно нове.
Vilx-

8

Використовуйте ExtJS, якщо хочете піти цим шляхом, не винаходити колесо. Але будьте готові, це означає повну зміну парадигми. Ви навички HTML майже застаріли. AJAX скрізь, сервер здебільшого надає API AJAX. Ви будете писати набагато більше JavaScript, ніж будь-коли, тому краще переконайтеся, що ви справді підходите до JavaScript.


1
Мені дуже зручно з Javascript. Я знаю, що деякі інші люди не є.
Vilx-

2
Я робив це кілька років на попередній роботі. ExtJS - це дуже приємно, і ви можете зробити з ним величезну кількість.
Захарій К

@ZacharyK - Як це виконується на дійсно складних формах? Як я писав там, з кількома переглядами сітки, табло та ін?
Vilx-

2
Досить добре. вам, звичайно, потрібно думати про свої моделі даних. Якщо чесно, я намагаюся уникати величезних форм і складати кілька менших елементів. Але це має менше спільного з межами ExtJS, ніж хороший дизайн тощо
Zachary K

@ZacharyK - Леніво повторювати себе. Прочитайте мій коментар до відповіді Еда Вудкока. Я не можу зробити це простіше. :(
Vilx-

8

Команда, в якій я перебуваю, вирішила перейти до ExtJS наприкінці 2008 року. У нас в цей момент було додано PHP на 200 000 ліній, які страждали від проблем, пов'язаних з передовим процесом. Наша ситуація була набагато гіршою, ніж у вас, тому що у нас була керована система управління формою, яка була дуже поганою, і ми сильно використовували рамки для завантаження розділів сторінки (візуальна архітектура датована 2005 роком, і команда не знала Ajax, що рано). Нам все-таки довелося перефактурувати код, так що це полегшило рішення про сильну перестановку кодової бази в основному на стороні клієнта.

На сьогоднішній день додаток складає 300 000 рядків, з яких 60 000 рядків - код extjs, і приблизно 3/4 функціоналу перенесено на ExtJS. Код extjs - це додаток на одній сторінці, але він все ще містить деякі застарілі форми у iframes. Ми перенесли спочатку навігаційний контейнер, а потім перенесли різні ділянки з частинами. При такому підході нам вдалося перенести міграцію extjs у звичайний процес розробки функцій, не надто сповільнюючи нас.

  • Продуктивність

    Код ExtJS виявився набагато швидшим, ніж застарілий код. Старий код був, звичайно, дуже поганим у виконанні, але навіть ми задоволені результатами. Код користувальницького інтерфейсу - це все статичний javascript, тому він кешується дуже добре (ми перебуваємо на етапах планування викидання його на CDN). Сервер не бере участь у передньому візуалізації, що зменшує навантаження там. Це також допомагає, що ExtJS забезпечує великий контроль за життєвим циклом інтерфейсу користувача (лінива візуалізація, легке завантаження невидимих ​​елементів інтерфейсу). Зазвичай після завантаження коду (архітектура завантаження на вимогу) більша частина часу завантаження екрана витрачається на виклик веб-служби для отримання даних. Сітка ExtJS дійсно швидка, особливо при використанні буферних подань для надання видимих ​​рядків у прокрутці.

  • Простота розвитку

    Якщо чесно, це мішана сумка. ExtJS - це DSL, це не насправді веб-розробка в традиційному розумінні. Нашим розробникам знадобилося багато часу, щоб справді вивчити API рамки, і я не бачу, щоб ця крива була менш крутою для інших клієнтських рамок. Усі в команді повинні бути "старшими" розробниками javascript (як правило, книга Crockford не повинна зберігати секретів). Ми страждаємо від проблем завантаження з новими розробниками, тому що експертиза на стороні клієнта не настільки широко поширена, як ви могли б подумати, а досвід роботи extjs майже нульовий (у Бельгії, де ми знаходимося).

    З іншого боку, як тільки ви швидкісні, досвід розробників дуже приємний. ExtJS дуже потужний, тому, якщо ви знаходитесь в канаві, ви можете збити дивовижні екрани дуже швидко. По мірі IDE, ми використовуємо PHPStorm, який я визнав досить компетентним з кодом ExtJS.

  • Безпека

    Безпека - одна з головних причин користувальницького інтерфейсу на стороні клієнта. Причина проста: зменшення поверхні атаки. API веб-служби, який використовується нашим кодом ExtJS, є набагато меншою поверхнею атаки, ніж рівень інтерфейсу на стороні сервера. ASVS OWASP вказує, що ви повинні перевірити весь вхід на сервері для правильності перед його використанням. В архітектурі веб-служб очевидно і просто, коли і як зробити перевірку вводу. Мені також простіше міркувати про безпеку в архітектурі інтерфейсу на стороні клієнта. Ми все ще боремося з проблемами XSS, тому що ви не позбавлені кодування до HTML, але в цілому ми набагато краще щодо безпеки, ніж ми були на старій базі коду. ExtJS полегшує перевірку полів форми на стороні сервера, тому нам не потрібно сильно писати код двічі.


Я хочу, щоб я міг зробити більше, ніж просто +1, через ваш фактичний досвід!
Vilx-

4

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

Плюси:

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

Мінуси:

  • все має бути у javascript (може бути, а може і не бути проблемою)
  • критичну логіку потрібно дублювати на сервері
  • стан потрібно підтримувати на клієнті та сервері та синхронізувати між обома
  • безпеку може бути важче виправити (враховуючи, як чим-небудь у коді клієнта можуть управляти зловмисні користувачі)
  • ви виставляєте значну частину своєї кодової бази (код, який працює на сервері, неможливо побачити ззовні)

Особисто я думаю, якщо ви йдете цим маршрутом, ASP.NET UpdatePanels - це не правильний шлях. Вони чудово підходять для часткового відключення існуючих веб-додатків, але вони все ще надсилають HTML через AJAX, і керування станом таким чином може бути досить волохатим. Вам краще пройти весь шлях, обслуговуючи лише статичний документ HTML, а потім скористатися бібліотекою шаблонів javascript, щоб зробити візуалізацію HTML; сервер взагалі не обслуговує жодного динамічного HTML, натомість клієнт здійснює виклики бізнес-логіки на сервері та отримує необроблені дані.


1

Так, можна, але ..

Вам потрібно переконатися, що у вас витончена «деградація», щоб критичні частини вашої програми все ще працювали без Javascript.

Ось так я будую більшість додатків у стилі "HIJAX".


Додатки вже важкі для JavaScript і без нього не працюють. Наші клієнти з цим чудово і ніколи не скаржилися. Якщо чесно, я ще не знайшов користувача, у якого цей день і вік відключений. Зауважте також, що ці програми НЕ потребують будь-якого типу SEO (було б катастрофою, якщо пошукова система може отримати доступ до всієї цієї конфіденційної інформації), і НЕ призначена для використання з мобільних пристроїв. Ми також думаємо про те, щоб зробити щось подібне для мобільних пристроїв, але наразі це лише на етапах концепції, і ми навіть не знаємо, чи був би попит.
Vilx-

2
"І, якщо чесно, я ще не знайшов користувача, у якого цей день і вік відключений." Ну привіт тоді. У мене встановлений noscript, тому за замовчуванням для мене відключений JavaScript під час посадки на новий веб-сайт. І якщо нічого не працює, я зазвичай просто закриваю вкладку веб-сайту.
Арх

3
@Arkh, ти думаєш, як програміст, а не користувач, ми враховуємо невелику меншину у грандіозній схемі речей. Давайте не перетворюватимете це на "до js чи не до js?" тому що це було зроблено на смерть навколо цих частин :)
Темна ніч

1
Люди, які відключають JS, як правило, добре розуміють, що при цьому вони можуть стикатися з сайтами, які покладаються на нього, і тому вони не працюватимуть. Чи хочуть вони включити його для певного сайту - це їх вибір, але якщо вони навмисно відключають стандартну технологію, я не заперечую, якщо вони не в змозі переглядати сайт. З іншого боку, я не знаю про підтримку JS для екранізаторів. Це може бути більшою проблемою. І звичайно є проблема індексації. Але коли хочеться зробити додаток, який не потребує індексації і не буде корисним для сліпих людей, то є сенс покладатися на JS.
Андреа

1
maple_shaft Ви мені подобаєтесь, тому скажу це добре, не дозволяйте бігти по цьому шляху :) дякую!
Темна ніч

1

Мій сайт ще знаходиться в зародковому стані, але 100% js ui для мене досі добре. Єдина логіка сервера, що існує на передньому кінці, - це відображення моделей та URL-адрес ajax. Сервер взагалі не має знань про інтерфейс, який мені дуже легко обслуговувати. Якщо ви зацікавлені, ви можете замовити мій сайт, написаний на ExtJS http://coffeedig.com/coffee/ . На моєму веб-сайті насправді немає проблем із безпекою, але клієнт допомагає звичайному користувачеві простим підтвердженням. Я знаю, що зловмисник може дійсно надіслати будь-який аякс на сервер, тому вся логіка "безпеки" виконується на сервері.

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

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