Уменьшение размера большого одностраничного приложения AJAX (jQuery, ASP.net)

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

Распространение функций увеличило размер этого приложения за пределы возможностей текущей архитектуры, и оно слишком медленно работает на любых более медленных компьютерах (что не подходит для веб-приложений), особенно на тех, которые используют Internet Explorer. В настоящее время он имеет 64 отдельных шага, 5400 элементов DOM, а один файл .aspx весит 300 КБ (4206 LOC). Загрузка приложения занимает от 1,5 секунд на быстрой машине с FireFox 3 до 20 секунд на более медленной машине с IE7. Перемещение между шагами занимает примерно одинаковое количество времени.

Итак, давайте резюмируем особенности:

  • Многоступенчатая форма в стиле мастера с несколькими путями (64 шага)
  • Текущий шаг показан примерно так: http://codylindley.com/CSS/325/css-step-menu
  • Несколько проверенных полей
  • Изменение словоблудия в зависимости от выбора пользователя
  • Окончательная редактируемая страница обзора

Я использую jQuery 1.3.2 и следующие плагины:

  • Плагин мастера форм jQuery
  • плагин jQuery clueTip
  • jQuery sexycombo
  • Плагин jQuery meioMask

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

У меня это нигде не опубликовано, но я в основном ищу несколько советов о том, как подойти к такого рода проектам и сделать их легкими и расширяемыми. Если у кого-то есть идеи относительно инструментов, руководств или технологий, я ищу это. Я довольно-таки начинающий программист (я в основном занимаюсь CSS / xHTML / дизайном), так что говорите мягко. Мне просто нужен хороший план атаки, чтобы сделать это приложение быстрее. Любые идеи?


person Patrick Alan    schedule 10.07.2009    source источник
comment
Какую часть страницы 300 КБ занимает ViewState?   -  person pbz    schedule 10.07.2009
comment
если честно ... не знаю. Я не очень хорошо знаком с работой asp.net. как я могу сказать?   -  person Patrick Alan    schedule 10.07.2009
comment
Быстрый и грязный способ - посмотреть исходный код страницы и найти поле ввода с name = __ VIEWSTATE и посмотреть, сколько символов у вас есть в атрибуте value.   -  person pbz    schedule 10.07.2009
comment
ну тогда ... нет. Поле ввода ViewState вообще не отображается в моем источнике. На самом деле страница представляет собой просто xHTML и JavaScript, затем я использую плагин формы jQuery для отправки данных на другую страницу aspx через AJAX. Думаю, это может быть причиной того, что я не вижу viewstate.   -  person Patrick Alan    schedule 10.07.2009
comment
Хорошо, это чистый XHTML. Как вы отправляете результат со страницы? Другими словами, что / кто обрабатывает форму, введенную пользователем на стороне сервера?   -  person pbz    schedule 10.07.2009
comment
Я использую jQuery для POST на странице aspx, на которой есть сценарий C #, который в основном содержит ряд строк, таких как строка re_firstname = Request [re_firstname]; а затем это просто MailMessage, которое отправляется на адрес электронной почты. На стороне сервера действительно очень мало происходит.   -  person Patrick Alan    schedule 10.07.2009


Ответы (4)


Один из способов - разбить шаги на несколько страниц / запросов. Для этого вам нужно где-нибудь сохранить состояние предыдущих страниц. Вы можете использовать базу данных для этого или другого метода.

Другой способ - динамически загружать нужные вам части через AJAX. Это не поможет с 54000 DOM-элементами, но поможет с начальной загрузкой страницы.


Основываясь на комментариях к вопросу, быстрый способ «решить» эту проблему - создать класс C #, который отражает все поля в вашем вопросе. Что-то вроде этого:

public class MySurvey
{
  public string FirsName { get; set; }
  public string LastName { get; set; }
  // and so on...
}

Затем вы можете сохранить это в сеансе (тоже, пусть это будет проще ... Я знаю, что это не "лучший" способ), например

public MySurvey Survey 
{
  get 
  { 
    var survey = Session["MySurvey"] as MySurvey;
    if (survey == null)
    {
      survey = new MySurvey();
      Session["MySurvey"] = survey;
    }
    return survey;
  }
}

Таким образом, у вас всегда будет ненулевой объект Survey, с которым вы сможете работать.

Следующим шагом будет разбиение этой большой формы на более мелкие страницы, скажем: step1.aspx, step2.aspx, step3.aspx и т. Д. Все эти страницы будут унаследованы от общей базовой страницы, которая будет включать указанное выше свойство. После этого все, что вам нужно сделать, это отправить запрос от step1.aspx обратно и сохранить его в Survey, аналогично тому, что вы делаете сейчас, но для каждого небольшого фрагмента. По завершении перенаправления (Response.Redirect ("~ / stepX.aspx")) на следующую страницу. Информация с предыдущей страницы будет сохранена в объекте сеанса. Если они закроют страницу браузера, они не смогут вернуться.

Вместо того, чтобы сохранять его в сеансе, вы можете сохранить его в базе данных или в файле cookie, но вы ограничены 4K для файлов cookie, поэтому он может не соответствовать.

person pbz    schedule 10.07.2009
comment
Я бы предпочел пойти по маршруту AJAX и загружать каждую часть по мере необходимости. Я просто не уверен, как лучше всего это сделать, поскольку каждая страница также должна знать, какой фрагмент многословия получить в зависимости от того, какой путь выбирает пользователь. - person Patrick Alan; 10.07.2009
comment
Вам нужно будет справиться со всем этим с помощью пользовательского JavaScript. Если пользователь выбрал путь X, загрузите Y и так далее. С точки зрения удобства использования, если это огромная форма, я бы рекомендовал сохранить как можно больше шагов. Нет ничего хуже, чем потратить 20 минут на заполнение формы, а затем не иметь возможности отправить ее из-за того, что сеть вышла из строя, или произошел сбой браузера и т. Д. Есть ли причина, по которой вы предпочитаете маршрут AJAX? - person pbz; 10.07.2009
comment
Итак, если бы я сделал что-то вроде, выбрал переключатель var verbiage = verbiage, а затем каждый раз, когда я загружал шаг, загружал слово «verbiage» для этого шага? Могу ли я сохранить информацию в файле cookie? это было бы хорошей идеей? Я предпочитаю AJAX, потому что мне удобнее писать с помощью jQuery, чем с чем-либо еще. - person Patrick Alan; 10.07.2009
comment
Вы можете сохранить эти вещи в XML-файле или во временной таблице в db. - person Sharique; 05.12.2009

Я согласен с PBZ, сохранение отдельных шагов было бы идеальным. Однако вы можете сделать это с помощью AJAX. Однако если бы вы это сделали, потребовались бы некоторые вещи, которые звучат так, как будто они могут выходить за рамки вашего набора навыков в основном фронтенд-разработки, вам, вероятно, потребуется создать новую строку базы данных и привязать ее к идентификатору сеанса пользователя, и Каждый раз, когда они переходят к следующему шагу, обновляйте эту строку. Возможно даже привязать его к их IP-адресу, чтобы, если все это взорвется, они могли вернуться и нажать «помнишь меня?» для вашего приложения, чтобы получить его.

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

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

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

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

person NateDSaint    schedule 10.07.2009

Согласитесь, разбейте ступеньки. 5400 элементов - это слишком много.

Есть несколько вариантов, если вам нужно сохранить его на одной странице.

  • Запросы AJAX для возврата либо необработанного HTML, либо массива объектов для синтаксического анализа в HTML или DOM
  • Фреймы или фреймы
  • JavaScript для установки innerHTML или управления DOM на основе текущего шага. Обратите внимание, что с этой опцией IE7 и особенно IE6 будут иметь утечки памяти. Утечки памяти Google IE6 JavaScript для получения дополнительной информации.
  • Используйте document.write, чтобы включить только файлы .js, необходимые для текущего шага.

HTH.

person Axl    schedule 10.07.2009

Похоже, в основном проблема оптимизации JQuery.

Первое предложение - переключить как можно больше выборов в селекторы идентификаторов. У меня было ускорение более чем в 200-300 раз за счет возможности перейти только к выбору атрибута id.

Второе предложение - это скорее план атаки. Поскольку IE - ваша основная проблема, я предлагаю использовать отладчик IE8. Вам просто нужно нажать f12 в IE8 ... Вкладки 3 и 4 - это скрипт и профилировщик соответственно.

После того, как вы выполнили как можно больше из # 1, как вы думаете, чтобы получить отправную точку, просто перейдите в профилировщик, нажмите «Начать профилирование», выполните несколько медленных действий на веб-странице, а затем прекратите профилирование. Вы увидите свои самые длинные вызовы методов и просто будете работать над ними.

Для более точного тестирования / dev перейдите на вкладку скриптов. Локальные точки останова и т. Д. Доступны для анализа. Вы можете разработать / протестировать изменения через непосредственное окно ... т.е. поставить точку останова, где вы хотите изменить функцию, запустить функцию, выполнить свой javascript вместо определенного javascript в непосредственном окне.

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

Вот и все. Если этот поток не может увести вас достаточно далеко, как упоминалось выше, сам JQuery (и, следовательно, его плагины) не очень эффективны, и замена стандартным javascript ускорит все. Если ваши плагины работают медленно, попробуйте заменить их другими плагинами.

person user195604    schedule 04.11.2009