angular 2: возможно объединить оболочку приложения с универсальным рендерингом
У меня есть стандартный проект angular-cli. Имеет ли смысл создавать для него как оболочку приложения, так и комбинировать ее с техникой рендеринга сервера ng-universal?
Если так, то каков наилучший способ это сделать?
1 ответ
Angular Universal - это просто дополнительный рендеринг на стороне сервера, выполненный на 99% так же, как в браузере (различий мало, т.е. анимации). Так что наверняка можно реализовать его в существующем приложении Angular (даже если оно содержит AppShell).
На мой взгляд, есть только небольшие плюсы в этом.
Давайте посмотрим на это так:
- Стандартное приложение Angular поставляется конечному пользователю как "пустая" HTML-страница (в большинстве случаев HTML это просто:
<html>
<head>
<script type="text/javascript" src="yourapp.js" />
</head>
<body>
<app></app>
</body>
</html>
с пакетом JavaScript. JavaScript генерирует весь код на стороне клиента. Этот подход определенно не является дружественным для SEO (и во многих случаях не дружественным для пользователя).
- AppShell дает вам возможность предварительно перерисовать некоторые элементы, которые не меняются в представлении, во время компиляции - например, ответ на запрос клиента:
<html>
<head>
<script type="text/javascript" src="yourapp.js" />
</head>
<body>
<app>
<nav> <a href=""> some element</a> <a href=""> another element</a></nav>
<component>dynamic content goes here</component>
</app>
<body>
</html>
- Наконец, мы подходим к угловому универсальному. Этот метод выполняет рендеринг всей страницы (на основе запроса), отправку отрендеренного HTML-кода клиенту, и после того, как браузер отобразит представление, JavaScript начинает действовать и вносит в него изменения (он заменяет "статическую" страницу). с вашим приложением на одну страницу). Это было причиной мерцания страницы в ранние времена Angular Universal. Другая проблема заключалась в том, что некоторые события, выполняемые на "статическом" сайте, не могли быть перенесены в представление, представленное angular. Насколько я знаю, в данный момент мы можем решить эту проблему, используя
withServerTransition()
метод изBrowserModule
,
Ваше предложение может ускорить процесс рендеринга на стороне сервера. Конечно, если сайт может быть загружен быстрее, мы должны это сделать. Но, с другой стороны, рендеринг на стороне сервера в Angular работает очень быстро. Например, мой шаблон приложения Angular Universal ( https://www.angular-universal-serverless.maciejtreder.com/) готов на стороне клиента через ~1-2 секунды (после очистки кэша и т. Д.). Поскольку это PWA, каждый следующий визит выполняется в автономном режиме, поэтому время загрузки составляет менее 0,5 сек.
Так что в моем конкретном случае и во многих других (я полагаю) нет особого смысла получать дополнительные 0,0001 сек. Конечно, все зависит от ваших потребностей.