Как создать современный интерфейс с бэкэндом, отличным от Node.js?

В основном я backend и fullstack разработчик и техлид. Я выбираю инструменты разработчика на протяжении многих лет.

Для серверной части я выбрал Typesafe Stack. Это делает приложения реактивными и относительно простыми в масштабировании и обслуживании. И это весело кодировать на Scala.

Для фронтенда использую Angular.js, ранее это были Knockout.js, YUI, Mootools, jquery, vanilla.

Но с Angular.js я действительно запутался. Проблема не в самом инструменте, а в том, как развивается Интернет.

Цель состоит в том, чтобы ускорить приложение, сделать его более отзывчивым, реактивным, интерактивным. Это приводит нас к одностраничным приложениям. Angular.js подходит для этого.

Но.

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

Много сетевых задержек ждать! Много последовательных запросов, идущих один за другим.

Таким образом, требуется долгое время, чтобы увидеть содержимое. Кроме того, это затрудняет индексацию с помощью поисковых систем и ограничивает доступность (режим чтения в Safari обычно не учитывает разметку, созданную angular.js).

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

Я слышал, что Твиттер наконец-то стал рендерить контент на бекенде, а потом оборачивать его скриптами. Как?

Я видел несколько проектов на node.js с той же целью. Они отображают контент с помощью того же javascript, который фактически получает клиент, и передают ему результат html. Затем оборачивает его, скажем, триггерами и кодами React.js или даже angular.js. Но что, если серверная часть Node.js не наш выбор?

Так что требования вполне естественны:

  • Возможность (предварительно) рендерить контент на бэкенде
  • Проводные скрипты на странице после ее загрузки
  • Не заменяйте содержимое страницы чем-либо, сгенерированным скриптами.
  • Используйте маршрутизацию html5 для всех остальных просмотров страниц
  • Избегайте node.js, по крайней мере, не используйте его в качестве основной серверной технологии.

Я один против этой проблемы? Как вы думаете об этом?


person Dmitry Kurinskiy    schedule 22.04.2014    source источник
comment
Загрузите первую страницу с сервера, все обновления сделайте с помощью Angular. Что мне не хватает?   -  person Mathletics    schedule 22.04.2014
comment
Мне нужны функции nodejs, но я не хочу использовать nodejs... чувак, просто используй nodejs   -  person rafaelcastrocouto    schedule 22.04.2014
comment
@Mathletics означает дублирование шаблонов как в серверной, так и в клиентской среде. Знаете ли вы решение маршрутизации angularjs, чтобы не маршрутизировать только первую страницу?   -  person Dmitry Kurinskiy    schedule 23.04.2014
comment
@rafaelcastrocouto, это такой беспорядок среди техников. Чтобы иметь Feature1 на интерфейсе, мне нужен Tool1 на сервере. Чтобы иметь Feature2 на серверной части, мне нужен инструмент Tool2 на серверной части. Чтобы объединить Tool1 и Tool2, мне нужны Tool3 и DesignPattern4... Вот так и растет сложность. Что ж, сейчас мы не готовы переключиться ТОЛЬКО на node.js на бэкенде.   -  person Dmitry Kurinskiy    schedule 23.04.2014
comment
Все ваши шаблоны являются клиентскими, кроме первой страницы, которая отображается на стороне сервера. Загрузите библиотеки Angular асинхронно и не инициализируйте их до тех пор, пока страница не будет отрисована. Маршрутизация для домашней страницы не должна ничего делать, поэтому никакие обновления не выполняются до тех пор, пока пользователь не перейдет или не выполнит какое-либо действие. На самом деле я не знаю Angular, но команда на моей предыдущей работе делала именно это для одного из своих приложений.   -  person Mathletics    schedule 23.04.2014
comment
@Mathletics любая страница может быть первой. Клиент может попасть на сайт по ссылке или из поисковой системы. Поэтому в любом случае требуется, чтобы все общедоступные страницы были подготовлены на стороне сервера.   -  person Dmitry Kurinskiy    schedule 24.04.2014
comment
Если вы просто беспокоитесь о совместном использовании шаблонов, есть несколько, которые работают как на стороне клиента, так и на стороне сервера (пыль, руль и, возможно, другие). Еще одна вещь, на которую стоит обратить внимание, - это внедрение страницы jQuery Mobile. Он предназначен для того, чтобы все отображалось на сервере, но затем вся навигация выполнялась с помощью AJAX/истории. Это, вероятно, самое близкое к тому, что вы просите.   -  person Mathletics    schedule 24.04.2014


Ответы (1)


Вот варианты для вас: - Используйте промежуточный сервер node.js, который полагается на серверную технологию по вашему выбору для фактических данных и прочего. Pro, вы можете медленно протестировать его, прежде чем перейти к нему полностью. - Два Напишите всю логику вашего шаблона дважды, один раз для вашего сервера и еще раз для клиента. Использование node.js позволяет вам просто повторно использовать логику из внешнего интерфейса, но Angular.js не совсем подходит для узлов из-за того, что он зависит от DOM.

Если вы действительно хотите получить наилучший опыт загрузки первой страницы, вам следует взглянуть на этот ответ, который я дал сегодня: AngularJS SEO для статических веб-страниц (S3 CDN)

Это позволит вам загрузить статическое приложение, которое работает со стилями и маршрутами только с CSS, пока ваше угловое приложение загружается. Надеюсь, это поможет.

person Naman Goel    schedule 12.05.2014
comment
Спасибо за Ваш ответ. Прямо сейчас я реализую шаблоны дважды, как шаблон scala и шаблон angular. Это приводит к двойной загрузке данных (html + затем json, когда маршрут начинается) и страница мерцает перед загрузкой. Я только что обнаружил, что в Twitter используются Mustache и Mustache.java. Выглядит хорошо, и действительно, почему угловатым? Я ищу более легкие и модульные решения, возможно, менее зависимые от дома. - person Dmitry Kurinskiy; 12.05.2014