Next.js — фреймворк рендеринга на стороне сервера, основанный на стеке технологий React.js.
Я впервые опубликовал статью о самородках.С познавательной точки зрения я подытожил восстановление проекта собственной разработки рендеринга на стороне сервера с использованием Next.js, закрепил свои знания и обсудил технологии со своими коллегами. (Статья постоянно совершенствуется...)
1. Предыстория проекта
Оригинальный проект компании был разработан на основе смеси PHP и jQuery и предложенных требований рефакторинга. Однако стек внутренних технологий был заменен с PHP на микросервисы Java, а стек внешних технологий также был заменен с jQuery на React.js. Поскольку отрасль компании нуждается в онлайн-продвижении, рефакторинг проекта следует считать дружественным к SEO-оптимизации.Я обычно использую стек технологий React.js для фронтенд-разработки, поэтому я нашел Next.js (на основе React) Этот сервер- боковая структура рендеринга.
2. Основные потребности
индекс поисковой системы: оптимизирован для SEO, удобен для поиска и сканирования информации о странице.
благоустройство маршрута: Маршрутизация должна отображаться по правилам
Отображение разных данных в зависимости от разных городов: Необходимо отображать разные данные о городах в соответствии с конкретными городами (IP-позиционирование).
ПК-конец/М-конец: Рендеринг шаблонов компонентов различных клиентов в соответствии с оценкой устройства.
SEO-информация настраивается: Каждая подстраница вверху страницы (например, домашняя страница, страница о нас, страница с описанием компании) поддерживает SEO-информацию и может быть настроена.
Поддержка переключения среды разработки/производства: определить текущую среду на основе командной строки и настроить префикс интерфейса API.
Развертывание файла авторизации WeChat: файл авторизации платежей WeChat *.txt файл развернут в корневом каталоге проекта
Частичная обработка прокси-запроса Http: Междоменная обработка некоторых интерфейсов (http-proxy-middleware)
Аналогично обработке перенаправления: доступ к текущему доменному имени, извлечение данных страницы под разными доменными именами и отображение их под текущим маршрутом.
моделирование локальных данных: Попытаюсь использовать способ mock.js / json-server / faker.js [инструмент управления документами API может использовать yapi]
Метод развертывания проекта: для проекта существует два метода развертывания, основанные на развертывании Docker и развертывании Node (локальная отладка также будет выполняться с помощью Docker).
3. Принцип Next.js
китайский официальный сайтNext.js — это облегченная среда приложений React, отображаемая на сервере.
Понимание рендеринга на стороне сервера: на самом деле, многие люди сталкивались с рендерингом на стороне сервера.Самая традиционная вложенная статическая HTML-страница PHP является разновидностью рендеринга на стороне сервера. PHP рендерит данные, полученные из базы данных, в html через шаблонизатор, и когда фронтенд обращается к указанному маршруту, php отправляет их на указанную фронтендом страницу, которая распознается браузером как файл .html (Content- тип: text/html), браузер анализирует и отображает страницу в соответствии со статическим форматом файла html и отображает ее. При просмотре исходного кода в браузере в тегах есть теги расширенного html и текстовая информация, такая как информация SEO , название/содержание статьи и т. д. Такие страницы могут быть легко просканированы поисковыми системами. Принцип Next.js аналогичен, за исключением того, что серверным языком является Node.Динамические данные на стороне сервера, полученные методом getInitialProps, встраиваются в компонент React, а компонент React отображается в html-странице на сервере. стороны и отправлены на передний план.
4. Ключевые моменты Next.js
Файловая система:
Файловая система Next предусматривает, что каждый файл *.js в папке pages станет маршрутом, автоматически обработанным и отрендеренным.
Создайте новый ./pages/index.js в своем проекте.После запуска проекта вы можете получить доступ к странице через путь localhost:3000/index. Точно так же ./pages/second.js можно получить через localhost:3000/second.
Обслуживание статических файлов:
Такие как изображения, шрифты, инструменты js
Создайте новую папку с именем static в корневом каталоге. Код может импортировать связанные статические ресурсы через /static/Не настраивайте имя статической папки, ее можно назвать только статической, потому что только это имя Next.js будет рассматривать ее как статический ресурс.
Приведенный выше код получает данные через асинхронный метод getInitialProps и привязывает их к свойствам. При отображении службы getInitialProps сериализует данные, как JSON.stringify. При первоначальной загрузке страницы getInitialProps будет загружаться только на стороне сервера. Только при переходе маршрута (переход компонента Link или переход метода API) клиент выполнит getInitialProps.
Сфокусируйся на:getInitialProps не будет работать в дочерних компонентах. Может использоваться только на странице страницПодкомпоненты могут получать данные через страницы в папке pages, а затем Props передают значения в подкомпоненты
Свойства входного объекта getInitialProps следующие::
pathname - часть пути URL
query - часть запроса URL, преобразованная в объект
asPath - фактический путь (включая часть запроса), отображаемый в браузере, типа String
req - объект HTTP-запроса (только сервер)
res - объект возврата HTTP (только на стороне сервера)
jsonPageRes — получить объект ответа данных (доступно только на стороне клиента)
err - любые ошибки при рендеринге
Реализация коммутации маршрутизации на стороне клиента с помощью компонентов
Если вам нужно ввести имя пути, запрос или asPath в ваш компонент, вы можете использовать компонент более высокого порядка withRouter
С этого шага начинается процесс фактического создания проекта и написания кода.Поскольку это проект компании, здесь используются все данные моделирования, но упомянутые выше требования проекта будут реализованы с нуля одно за другим.
Откройте и просмотрите исходный код с помощью инструмента отладки браузера, вы увидите, что элементы div отображаются в корневом контейнере _next.Когда данных много, поисковым системам будет удобно сканировать html-код.
Это лучше понять по сравнению с одностраничным приложением SPA.Приложение SPA имеет только один корневой корневой контейнер для монтирования компонентов. Никакой другой расширенный HTML-код не будет виден в контейнере.
6. Реализация требований проекта
Проект предназначен для облегчения рендеринга на стороне сервера для SEO.Когда дело доходит до SEO, вам необходимо установить информацию заголовка заголовка в html-документе. Здесь есть три очень важных фрагмента информации: ключевые слова | описание | заголовок соответственно представляют ключевое слово, описание и заголовок текущей веб-страницы. Поисковая система будет сканировать ключевую информацию веб-страницы в соответствии с содержанием этих тегов, а затем пользователь отобразит страницу результатов поиска в соответствии со степенью соответствия этих ключевых слов при поиске. (Конечно, алгоритм представления — это гораздо больше, чем обращение к этой информации, семантике тегов страниц, плотности ключевых слов, внешним ссылкам, внутренним ссылкам, трафику, времени удержания пользователя...)
Это достигается, и поиск в поисковой системе также является простой реализацией. Чтобы добиться удобства для поисковых систем, на самом деле есть много аспектов, которые можно оптимизировать.
Настройте встроенный компонент для загрузки на страницу, назовите файл HeadSeo.js.
Откройте localhost:3000, и вы увидите, что соответствующая SEO-информация заголовка заголовка была отображена. Если вам нужно динамически отображать данные на сервере, вы можете запросить фоновые данные из файлов в каталоге pages и отобразить их в файл HeadSeo, передав значение через реквизиты.
Требование 2. Благоустройство маршрута
Функция пользовательского улучшения маршрутизации реализована с помощью пользовательской маршрутизации на стороне сервера. Например, на сайте Ухань (Ухань) маршрут, необходимый для доступа к домашней странице, выглядит следующим образом.
Город
титульная страница
насчет нас
Ухань
/wuhan/index
/wuhan/about
Шанхай
/shanghai/index
/shanghai/about
Нанкин
/nanjing/index
/nanjing/about
Создайте серверный файл сценария server.js, сервер использует Express в качестве сервера.
// 安装 express 服务端代理工具也一起安装了 http-proxy-middleware
cnpm i express http-proxy-middleware --save
Сценарий для изменения файла package.json выглядит следующим образом: затем запустите команду npm run ssrdev, чтобы открыть порт 3000, и теперь вы можете получить доступ к странице через улучшенный маршрут localhost:3000/wuhan/index.
localhost:3000/wuhan/about
Требование 3: отображать разные данные в зависимости от разных городов
Отобразите домашнюю страницу соответствующего городского сайта в соответствии с географическим положением пользователя и получите данные о разных городах. Здесь начинается моделирование данных и сбор данных на стороне сервера.
В этой проектной практике будут опробованы два метода моделирования данных.
json-server
mock.js (этот метод проще, будет добавлен позже)
Сначала установите json-сервер с открытым исходным кодом.
cnpm install -g json-server
Создайте новый файл макета в каталоге ssr, а затем создайте новый файл data.json под макетом.Данные файла выглядят следующим образом.
На этом этапе вы можете видеть напечатанные данные и отображаемые данные на этой странице.
Следующим шагом является определение отображаемого города страницы в соответствии с географическим положением пользователя.Этапы решения следующие [пока только метод, а код будет улучшен позже]
Сначала запросите Baidu open api, чтобы получить название города и уникальный код в соответствии с IP-адресом.
Запросите данные города, соответствующие уникальному коду, используя уникальный код в качестве параметра.
После того, как маршрут будет благоустроен, верните соответствующие данные страницы города на стойку регистрации для отображения.
Требование 4: Рендеринг разных страниц на стороне ПК/М
Основной принцип: судить о терминале по заголовку запроса user-agnet, а затем рендерить разные компоненты
Создайте новую папку js в статической папке и создайте новый модуль класса инструмента util.js в папке js.Код выглядит следующим образом
Используйте браузер, чтобы открыть мобильный режим панели отладки, чтобы автоматически рендер мобильную страницу
Требование пятое: информация о конфигурации SEO
На самом деле, это в основном реализовано.Фронтдеск маршрутизирует параметры страницы через разные страницы, чтобы запросить начальный интерфейс данных первого экрана подстраницы, и запрос завершается в методе getInitialProps при рендеринге сервера.
Например: /wuhan/index может получить SEO-информацию, настроенную для индексной страницы в фоновом режиме, в соответствии с индексом в качестве параметра.
/wuhan/posts может использовать сообщения в качестве параметра для получения SEO-информации, настроенной в фоновом режиме для страницы сообщений.
Требование 6. Поддержка переключения среды разработки/формальной среды
Сервер server.js можно реализовать следующими способами
const dev = process.env.NODE_ENV !== 'production';
Клиент может быть реализован через конфигурационный файл next.config.js
pages/index.js изменяет код адреса хоста API через файл конфигурации, код выглядит следующим образом (позже запрос на выборку будет инкапсулирован в общедоступный метод)
import React, { Component } from 'react';
import Layout from "../components/Layouts/PcLayout"
import 'isomorphic-unfetch'
import getConfig from 'next/config' // next自带的配置方法
const { publicRuntimeConfig } = getConfig() // 取到配置参数
class index extends Component {
constructor(props) {
super(props);
this.state = {
city:"武汉"
};
}
static async getInitialProps({ req }) {
const res = await fetch(publicRuntimeConfig.host + '/api/seo') // 从配置文件里获取
const seo = await res.json()
return { seo }
}
componentDidMount(){
console.log(this.props)
}
render(){
const { seo } = this.props;
return (
<Layout seo={seo}>
<div>Welcome to next.js!</div>
<div>{seo.title}</div>
</Layout>
)
}
}
export default index
При оплате или авторизации WeChat на веб-странице необходимо пройти проверку безопасности сервера WeChat.Сервер WeChat отправляет ключевой файл *.txt, который обычно находится в корневом каталоге проекта и должен поддерживать доступ, например : локальный: 3000/MP_verify_HjspU6daVebgWsvauH.txt
Установите доступ к корневому каталогу server.use(express.static(__dirname)), это слишком небезопасно, все файлы в корневом каталоге открыты
Добавьте метод для обработки файлов .txt в файле server.js.
Его нужно отображать при доступе к маршруту localhost:3000/winyhask.redirect.com/about?type_…контент на странице.
Сначала установите инструмент
cnpm и urllib --save
Как упоминалось в предыдущей статье, он был реализован
Требование одиннадцатое: метод развертывания проекта
В основном для записи файла Dockerfile локальный VsCode может начать отладку контейнера, последующую демонстрацию
FROM mhart/alpine-node
WORKDIR /app
COPY . .
RUN yarn install
RUN yarn build
EXPOSE 80
CMD ["node", "server.js"]
Окончательное резюме:
Есть еще много деталей, которые можно улучшить, я надеюсь, что это может помочь всем, и я также надеюсь комментировать, обмениваться информацией и учиться друг у друга.