Включена универсальная живая демонстрация

Сканирование и рендеринг JavaScript в Google все еще остается неясной проблемой.

Противоречивые утверждения и эксперименты можно найти повсюду в сети.

Так что это значит?

Как разработчику вам НЕОБХОДИМО оптимизировать сайты, созданные с помощью популярных JS-фреймворков для SEO.

Имея это в виду, вот третья часть нашей продолжающейся серии статей о SEO для JavaScript Framework.

В этом руководстве мы создадим серверный SPA для электронной коммерции Angular с использованием Universal.

Вот шаги, которые мы будем использовать для этого:

  1. Настройка Angular проекта.
  2. Создание компонентов Angular.
  3. Включение функции электронной коммерции в нашем SPA.
  4. Использование Universal, чтобы сделать наше приложение Angular оптимизированным для SEO

Это должно быть весело!

Зачем беспокоиться об Angular SEO? Angular не поддерживается Google?

Angular - это JS-фреймворк с открытым исходным кодом, разработанный инженерами Google в 2010 году.

Замечательно заполнить ваш безголовый стек или любой JAM-стек в этом отношении. Но он по-прежнему имеет общие проблемы SEO, известные фреймворкам JavaScript.

Одностраничные приложения JS добавляют контент на страницы динамически с помощью JavaScript. Это не оптимально для SEO: поисковые роботы, скорее всего, не будут запускать JS-код, поэтому не обнаружат фактическое содержание страницы.

По состоянию на 2018 год ходят слухи, что Google может сканировать и отображать страницы, заполненные JavaScript, таким образом, читая их, как это делают современные браузеры. Хотя сами по себе цитаты гиганта не столь оптимистичны:

"Времена изменились. Сегодня, если вы не запрещаете роботу Googlebot сканировать ваши файлы JavaScript или CSS, мы, как правило, можем обрабатывать и понимать ваши веб-страницы, как современные браузеры ».

"Иногда во время рендеринга что-то идет не так, что может отрицательно сказаться на результатах поиска по вашему сайту".

«Иногда JavaScript может быть слишком сложным или непонятным для выполнения, и в этом случае мы не можем полностью и точно отобразить страницу».

В то время как Google изо всех сил пытается обработать ваш JS, он ВСЕГДА превосходит все другие поисковые или социальные сканеры (Facebook, Twitter, LinkedIn). Таким образом, оптимизация рендеринга вашего приложения принесет пользу и вашим действиям на этих каналах!

Слишком много неиндексированного содержимого JavaScript, чтобы оставлять его на столе.

Как справиться с проблемами Angular SEO

Чтобы ваш веб-сайт на Angular занимал первое место в результатах поиска, вам нужно будет поработать.

Просмотреть как Google

Если у вас уже есть общедоступное приложение Angular, перейдите в Консоль поиска Google и запустите Fetch as Google на страницах, которые необходимо проиндексировать. Он расскажет, к чему роботы Google могут получить доступ, а что нет.

Это даст вам представление о том, в каких областях требуется работа по SEO.

Способы сделать это на самом деле не отличаются от того, что мы уже видели с Vue или React, но инструменты отличаются.

Предварительная обработка

Это довольно просто. JavaScript отображается в браузере; статический HTML сохраняется и возвращается сканерам. Это решение отлично подходит для простых приложений, которые не полагаются на какой-либо сервер. Его проще настроить, чем рендеринг на стороне сервера, тем не менее, с отличными результатами SEO.

Для предварительного рендеринга Angular я предлагаю заглянуть на Prerender.io.

Рендеринг на стороне сервера

Вот что я здесь сделаю.

Я воспользуюсь SSR с помощью Angular Universal.

Проще говоря, это запустит Angular на бэкэнде, так что при выполнении запроса контент будет отображаться в DOM для пользователя.

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

Мы исследовали эти два метода в этом видеоуроке по Vue.js. Это содержимое также применимо к Angular!

Означает ли использование этих методов, что вы внезапно окажетесь на вершине поисковой выдачи? Ну, может быть. Скорее всего? Неа. Есть много других соображений по SEO: отличный мобильный UX, соединение HTTPS, карта сайта, отличный контент, обратные ссылки и т. Д. В заключении Этот пост перечисляет пару советов по SEO!

Техническое руководство: пример Angular SEO-дружественного SPA с Universal

Предварительные условия

  • Базовое понимание одностраничных приложений (SPA)
  • Базовые знания Машинопись [необязательно]
  • Аккаунт Snipcart (навсегда бесплатно в тестовом режиме)

Настройка среды разработки

Установите Angular CLI глобально, используя следующую команду:

Я использую sass в своем проекте. Если вы решите сделать это, но он еще не установлен, что ж:

1. Настройка структуры проекта с помощью Angular CLI.

Создайте свой проект с помощью Angular CLI.

Заметили, как я добавил в команду аргумент стиля и маршрутизации?

Таким образом, routing и scss будут вставлены прямо в ваш проект, что намного проще, чем пытаться добавить их позже.

Как только это будет сделано, перейдите в каталог проекта и обслуживайте свой проект.

Теперь проект должен быть виден локально по адресу: http://localhost:4200/

2. Создание первого компонента Angular.

Как и многие современные интерфейсные библиотеки или фреймворки, Angular использует компонентную систему.

В Angular каждый компонент, кроме основного приложения, представляет собой каталог, расположенный в src/app/, содержащий три файла: файл TypeScript, файл стиля и файл HTML.

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

Используйте встроенную команду Angular CLI для создания новых компонентов:

2.1 Мокинг списка товаров

Перед редактированием компонентов вам необходимо создать структуру данных для продуктов.

Создайте файл product.ts прямо в папке src/app/ и придайте ему все необходимые свойства.

Также создайте mocked-product.ts в том же месте. Этот файл импортирует класс Product и экспортирует массив Product.

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

3. Размещение продуктов приложения.

Хорошо, продукт успешно издевался! Теперь давайте разместим наши продукты на главной странице. Для этого откройте products.component.ts и добавьте:

Как видите, каждый компонент Angular импортирует класс Component из базовой библиотеки Angular. @Component({}) - это функция-декоратор, которая отмечает класс как компонент Angular и предоставляет большую часть его метаданных.

Значение пары ключей selector - это тег XML, который можно включать в шаблоны для визуализации этого компонента.

Сделайте это сейчас, удалив все, что сгенерировано в шаблоне основного приложения (app.component.html), и добавьте соответствующий тег:

Когда это будет сделано, если вы посетите веб-сайт, вас должны встретить:

Теперь давайте изменим файл products.component.html, чтобы перечислить продукты, используя директиву Angular Repeater *ngFor и ручки ({{ }}) для привязки данных из вашего класса к шаблону.

4. Добавление маршрутизации в приложение Angular.

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

Поскольку вы добавили аргумент --routing при создании проекта, вы можете перейти непосредственно к app-routing.module.ts и преобразовать его в следующий код:

Этот модуль импортирует компоненты products и product и создает массив маршрутов, связывающих каждый путь с компонентом.

Как видите, я добавил :id заполнитель, который можно будет извлечь в product компоненте для отображения нужного продукта.

Также важно инициализировать маршрутизатор, добавив RouterModule.forRoot(route) в импорт модуля.

Как только это будет сделано, вы можете заменить тег компонента в шаблоне приложения (app.component.html) на тег <router-outlet>:

Тег router-outlet отобразит представление для соответствующего пути, указанного в массиве routes. В этом случае корневой каталог будет отображать представление для компонента Products.

Теперь вы можете добавить routerLink='relativePath' вместо любого атрибута href='path' в тегах <a>. Например, вы можете обновить products.component.html файл примерно так:

Таким образом, каждый элемент в нашем списке отправит пользователя в представление с компонентом product.

5. Создание компонента product

Теперь давайте создадим компонент сведений о продукте. В его файле TypeScript product.component.ts добавьте следующий код:

Выше я импортировал ActivatedRoute и Location из Angular. Это позволит вам получить productId из URL-адреса и получить текущий путь прямо в конструкторе.

Мы также импортировали наш массив имитированных продуктов, получили текущий продукт, используя идентификатор из маршрута, используя find(), и снабдили URL префиксом источника запросов сервера.

Теперь давайте обновим шаблон компонента (product.component.html) для отображения необходимой информации и создадим кнопку покупки, совместимую с определением продукта Snipcart.

Обратите внимание, как я не использовал фигурные скобки для привязки данных в атрибутах HTML?

Для свойств можно использовать только фигурные скобки, но не атрибуты. Следовательно, вы должны использовать синтаксис привязки атрибутов Angular, как показано в приведенном выше коде.

6. Интеграция функций корзины покупок.

Теперь давайте интегрируем Snipcart, добавив необходимые скрипты с нашим ключом API в index.html файл, в котором размещено наше основное приложение.

Таким образом, он сможет взаимодействовать со всеми вашими представлениями.

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

Я оставлю эту часть на ваше усмотрение, поскольку она не является основной целью руководства.

7. Использование Angular Universal для SEO

Наконец, давайте сделаем наше приложение оптимизированным для SEO с помощью SSR.

В этой демонстрации я буду использовать сервер Node.js Express. Имейте в виду, что Angular Universal можно добавить на любой сервер, если он может взаимодействовать с функцией Angular renderModuleFactory, но конфигурация, скорее всего, будет отличаться от той, что продемонстрирована в этом посте.

7.1 Установка Angular Universal

Для начала давайте добавим необходимые инструменты в вашу среду разработки:

7.2 Редактирование клиентского приложения

Теперь, когда у нас есть все необходимые инструменты, давайте отредактируем код на стороне клиента, чтобы разрешить переход между страницей, отображаемой на стороне сервера, и приложением на стороне клиента. В app.module.ts замените импорт BrowserModule в декораторе @NgModule() следующим кодом:

Поскольку приложение встроено в код на стороне сервера и код на стороне клиента, вам потребуется два пути вывода. Начнем с указания пути вывода для браузера. Для этого отредактируйте outputPath в angular.json.

7.3 Настройка сервера

Теперь, когда вы внесли необходимые изменения в клиент, давайте отредактируем код для сервера.

Создайте app.server.module.ts в каталоге src/app.

Создайте файл main.server.ts в каталоге src/, который экспортирует AppServerModule, который будет действовать как точка входа на ваш сервер.

Кроме того, создайте файл server.ts в корневом каталоге вашего приложения. Этот файл содержит код Экспресс-сервера. Он будет прослушивать входящий запрос, обслуживать запрошенный ресурс и отображать HTML-страницы, вызывая renderModuleFactory (завернутый ngExpressEngine).

Теперь, когда вы настроили сервер, вам нужно добавить и обновить файлы конфигурации. Создайте файл tsconfig.server.json в каталоге src.

Создайте файл webpack.server.config.js в корневом каталоге приложения с помощью следующего кода:

Теперь обновите конфигурацию Angular CLI и установите выходной путь сборки сервера, добавив следующий код в angular.json:

Наконец, добавьте команды сборки и обслуживания в раздел сценариев package.json.

Таким образом вы сможете сохранить ng serve для обычного рендеринга на стороне клиента и использовать npm run build:ssr && npm run serve:ssr для рендеринга на стороне сервера с Universal.

7.4 Сборка и запуск приложения

Теперь, когда все настроено, все готово! Соберите приложение и запустите сервер.

Репозиторий GitHub и живая демонстрация

См. Репозиторий GitHub здесь

Смотрите живую демонстрацию здесь

Заключительные мысли

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

Однако включить Universal в мой проект оказалось труднее, чем я ожидал; очень легко потеряться во всех файлах конфигурации!

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

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

Надеюсь, это поможет вам правильно понять SEO в Angular! :)

Есть вопросы? Не стесняйтесь оставлять комментарии, чтобы поделиться с нами своими мыслями, отзывами и вопросами. Если вам понравился этот пост, найдите секунду, чтобы 👏 или поделиться в Твиттере!

Первоначально опубликовано в блоге Snipcart и в нашем информационном бюллетене.