Next.js. Image. Форматы изображений
Последняя приятная плюшка компонента
Настроить разрешенные форматы можно в next.config.js в поле
#nextjs #серверныйрендеринг #документация
Последняя приятная плюшка компонента
Image
, о которой я упомяну - это автоматическое использование производительных форматов. Если браузер клиента поддерживает webp, то изображение будет в webp, даже если вы сохранили его в jpg.Настроить разрешенные форматы можно в next.config.js в поле
images.formats
.#nextjs #серверныйрендеринг #документация
🔥3👍2
Next.js. Оптимизация шрифтов
Next реально много делает для оптимизации тяжелых ресурсов. Про изображения мы уже поговорили, теперь поговорим о шрифтах. Next предоставляет удобные функции для работы с ними, в том числе и для google-шрифтов.
Все шрифты хостятся на вашем сервере (гугловские шрифты загружаются во время сборки и тоже помещаются на сервер).
Для работы понадобится пакет @next/font.
Локальные шрифты
Для локальных шрифтов используем функцию
Функция
Применять такой загруженный шрифт нужно с помощью сгенерированного имени класса. Для нужного элемента в разметке устанавливаем проп
Google-шрифты
Для гугл-шрифтов нужно импортировать функции из пакета @next/font/google. Потребуется указать подмножество шрифта и при необходимости настройки, например, вес и стиль:
Используем эти шрифты точно так же, через
Шрифты в head
Можно использовать и более привычный вариант - указать шрифты в теге
Демо: https://codesandbox.io/p/sandbox/wizardly-dream-5gv4mx?file=%2Fpages%2Findex.tsx&selection=%5B%7B%22endColumn%22%3A37%2C%22endLineNumber%22%3A3%2C%22startColumn%22%3A37%2C%22startLineNumber%22%3A3%7D%5D
В демке для документа установлен глобальный стиль с
Статья в документации: https://nextjs.org/docs/basic-features/font-optimization
#nextjs #серверныйрендеринг #документация #примерыкода
Next реально много делает для оптимизации тяжелых ресурсов. Про изображения мы уже поговорили, теперь поговорим о шрифтах. Next предоставляет удобные функции для работы с ними, в том числе и для google-шрифтов.
Все шрифты хостятся на вашем сервере (гугловские шрифты загружаются во время сборки и тоже помещаются на сервер).
Для работы понадобится пакет @next/font.
Локальные шрифты
Для локальных шрифтов используем функцию
localFont
. Работает и с одним файлом, и с несколькими, если разные начертания находятся в разных файлах:import localFont from '@next/font/local';
const myFont1 = localFont({ src: './my-font.woff2' });
const myFont2 = localFont({
src: [
{
path: './Roboto-Regular.woff2',
weight: '400',
style: 'normal',
},
{
path: './Roboto-Italic.woff2',
weight: '400',
style: 'italic',
},
]
});
Функция
localFont
возвращает объект с полями className
и style
.Применять такой загруженный шрифт нужно с помощью сгенерированного имени класса. Для нужного элемента в разметке устанавливаем проп
className={myFont.className}
. Теперь для этого элемента установлено нужное значение font-family
.Google-шрифты
Для гугл-шрифтов нужно импортировать функции из пакета @next/font/google. Потребуется указать подмножество шрифта и при необходимости настройки, например, вес и стиль:
import { Inter } from '@next/font/google';
import { Roboto } from '@next/font/google';
const inter = Inter({ subsets: ['latin'] })
const roboto = Roboto({
weight: '400',
subsets: ['latin'],
});
const roboto1 = Roboto({
weight: ['400', '700'],
style: ['normal', 'italic'],
subsets: ['latin'],
});
Используем эти шрифты точно так же, через
className
.Шрифты в head
Можно использовать и более привычный вариант - указать шрифты в теге
style
с помощью синтаксиса jsx. Это следует делать в файле _app.tsx. Значение берем из myFont.style.fontFamily
. Важно сделать блок со стилями глобальным (атрибут global
, чтобы стили были помещены в head.Демо: https://codesandbox.io/p/sandbox/wizardly-dream-5gv4mx?file=%2Fpages%2Findex.tsx&selection=%5B%7B%22endColumn%22%3A37%2C%22endLineNumber%22%3A3%2C%22startColumn%22%3A37%2C%22startLineNumber%22%3A3%7D%5D
В демке для документа установлен глобальный стиль с
font-family: Inter
(файл pages/_app.tsx). На главной странице (pages/index.tsx) загружен шрифт Pacifico. Он установлен для одного абзаца с помощью className
.Статья в документации: https://nextjs.org/docs/basic-features/font-optimization
#nextjs #серверныйрендеринг #документация #примерыкода
codesandbox.io
Next.js. Fonts. React Junior
CodeSandbox is an online editor tailored for web applications.
🔥3👍1
TypeScript в Next.js
Соберем в одном месте типы, которые использует Next:
Данные для серверного рендеринга - GetStaticProps, GetStaticPaths, GetServerSideProps
API-роуты - NextApiRequest, NextApiResponse
Тип
Компонент App - AppProps
#nextjs #документация #typescript
Соберем в одном месте типы, которые использует Next:
Данные для серверного рендеринга - GetStaticProps, GetStaticPaths, GetServerSideProps
import { GetStaticProps, GetStaticPaths, GetServerSideProps } from 'next';
export const getStaticProps: GetStaticProps = async function (context) {
// ...
}
export const getStaticPaths: GetStaticPaths = async function () {
// ...
}
export const getServerSideProps: GetServerSideProps = async function (context) {
// ...
}
API-роуты - NextApiRequest, NextApiResponse
import type { NextApiRequest, NextApiResponse } from 'next'
export default function handler(req: NextApiRequest, res: NextApiResponse) {
res.status(200).json({ name: 'John Doe' })
}
Тип
NextApiResponse
может также принимать обобщенный тип данных ответа.Компонент App - AppProps
import type { AppProps } from 'next/app'
export default function MyApp({ Component, pageProps }: AppProps) {
// ...
}
#nextjs #документация #typescript
👍3🔥1
Next.js. Динамические роуты
Про динамические роуты мы уже знаем: можно создать файл pages/post/[id].tsx и он будет соответствовать множеству страниц /post/1, post/2, post/hello и т.д.
При этом в компоненте страницы можно узнать конкретный id, воспользовавшись хуком
Но это только один уровень вложенности, то есть страницу /post/react/23 так не опишешь. Если требуется вложенная структура, Next и это умеет.
Создаем страницу pages/post/[...id].tsx и получаем все возможные пути с любым уровнем вложенности.
При этом
Если к этому набору урлов требуется добавить еще и просто /post (без id), название файла должно выглядеть так: pages/post/[[...id]].tsx.
#nextjs #серверныйроутинг #документация
Про динамические роуты мы уже знаем: можно создать файл pages/post/[id].tsx и он будет соответствовать множеству страниц /post/1, post/2, post/hello и т.д.
При этом в компоненте страницы можно узнать конкретный id, воспользовавшись хуком
useRouter
(в поле router.query.id
).Но это только один уровень вложенности, то есть страницу /post/react/23 так не опишешь. Если требуется вложенная структура, Next и это умеет.
Создаем страницу pages/post/[...id].tsx и получаем все возможные пути с любым уровнем вложенности.
При этом
router.query.id
будет не строкой, а массивом.Если к этому набору урлов требуется добавить еще и просто /post (без id), название файла должно выглядеть так: pages/post/[[...id]].tsx.
#nextjs #серверныйроутинг #документация
👍3🔥1
Next.js. Api-роуты: примеры использования
Обычно не следует вызывать из апи-роута другой апи, но есть пара случаев, когда можно:
- вы хотите спрятать урл, к которому обращаетесь (поэтому запрос с клиента происходит на ваш апи /api/secret, а уже оттуда - на нужный https://company.com/secret-url)
- вы хотите использовать какие-то переменные окружения для формирования запроса
#nextjs #серверныйрендеринг #документация
Обычно не следует вызывать из апи-роута другой апи, но есть пара случаев, когда можно:
- вы хотите спрятать урл, к которому обращаетесь (поэтому запрос с клиента происходит на ваш апи /api/secret, а уже оттуда - на нужный https://company.com/secret-url)
- вы хотите использовать какие-то переменные окружения для формирования запроса
#nextjs #серверныйрендеринг #документация
👍1🔥1
Next.js. Динамические api-роуты
Для апи работают те же самые правила, что и для страниц.
Динамическую часть можно указать в квадратных скобках - api/post/[id].ts.
Если добавить три точки, будут отслеживаться все уровни вложенности - api/post/[...ids].ts.
Если при этом поставить двойные квадратные скобки, то будет опциональный вариант (будет совпадение если нет параметров вообще - api/post).
Доступ к динамическим параметрам можно получить из
#nextjs #серверныйрендеринг #документация
Для апи работают те же самые правила, что и для страниц.
Динамическую часть можно указать в квадратных скобках - api/post/[id].ts.
Если добавить три точки, будут отслеживаться все уровни вложенности - api/post/[...ids].ts.
Если при этом поставить двойные квадратные скобки, то будет опциональный вариант (будет совпадение если нет параметров вообще - api/post).
Доступ к динамическим параметрам можно получить из
request.query
.#nextjs #серверныйрендеринг #документация
👍4
Next.js. Request и Response Helpers
В апи-роутах у нас приходит два параметра - объект запроса (req) и объект ответа (res).
-
-
-
-
-
-
-
-
Кроме того, из каждого роута в папке pages/api мы можем экспортировать объект конфигурации:
Подробнее можно посмотреть в документации:
https://nextjs.org/docs/api-routes/request-helpers
https://nextjs.org/docs/api-routes/response-helpers
#nextjs #серверныйрендеринг #документация
В апи-роутах у нас приходит два параметра - объект запроса (req) и объект ответа (res).
req
- это экземпляр класса http.IncomingMessage
, а res
- http.ServerResponse
, но и тот, и другой имеют дополнительные плюшки (хелперы).-
req.cookies
- все отправленные куки.-
req.query
- параметры строки запроса.-
req.body
- тело запроса, обработанное в соответствии с content-type
.-
res.status(code)
- метод для установки HTTP-кода ответа-
res.json(body)
- отправить JSON-
res.send(body)
- отправить HTTP-ответ (строчку, объект или Buffer)-
res.redirect([status, ], path)
- для редиректа-
res.revalidate(urlPath)
- ревалидация страницы по запросу.Кроме того, из каждого роута в папке pages/api мы можем экспортировать объект конфигурации:
export const config = {
api: {
}
}
Подробнее можно посмотреть в документации:
https://nextjs.org/docs/api-routes/request-helpers
https://nextjs.org/docs/api-routes/response-helpers
#nextjs #серверныйрендеринг #документация
🔥3👍1
Next.js. Деплой проекта на Vercel
Vercel - это удобный хостинг для проектов на Next.js.
Развернуть проект очень-очень просто, даже у меня быстро получилось.
Просто регистрируемся на Vercel.com, создаем репозиторий с проектом (GitHub, GitLab, BitBucket) и импортируем его в Vercel.
Полностью поддерживаются все фичи Next.js (со всякими инкрементальными регенерациями), проект автоматически пересобирается при пуше в репозиторий. Интерфейс вроде понятный. Можно даже свой домен выбрать.
Мой учебный проект: https://furrycat.vercel.app/
Есть еще вариант задеплоить на Netlify или Heroku (но сейчас Heroku не регистрирует пользователей из России).
Подробнее тут: https://dzen.ru/a/YmuUb-ZF519-uyRP
#nextjs #серверныйрендеринг #инструменты
Vercel - это удобный хостинг для проектов на Next.js.
Развернуть проект очень-очень просто, даже у меня быстро получилось.
Просто регистрируемся на Vercel.com, создаем репозиторий с проектом (GitHub, GitLab, BitBucket) и импортируем его в Vercel.
Полностью поддерживаются все фичи Next.js (со всякими инкрементальными регенерациями), проект автоматически пересобирается при пуше в репозиторий. Интерфейс вроде понятный. Можно даже свой домен выбрать.
Мой учебный проект: https://furrycat.vercel.app/
Есть еще вариант задеплоить на Netlify или Heroku (но сейчас Heroku не регистрирует пользователей из России).
Подробнее тут: https://dzen.ru/a/YmuUb-ZF519-uyRP
#nextjs #серверныйрендеринг #инструменты
👍2🔥1
Next.js. Деплой на Node-сервере
Если нужно развернуть проект на обычном хостинге с поддержкой Node (не на специальном Vercel), потребуются две команды:
-
-
#nextjs
Если нужно развернуть проект на обычном хостинге с поддержкой Node (не на специальном Vercel), потребуются две команды:
-
next build
- для сборки проекта-
next start
- для запуска Next-сервера#nextjs
👍4
Next.js. Подготовка к продакшену
Статья в документации (англ.): https://nextjs.org/docs/going-to-production
Вероятно, очень полезная статья о том, что нужно сделать перед тем, как отправлять проект в продакшн. Тут рассказывается о кешировании, обработке ошибок, оптимизации и уменьшении количества кода в клиентских бандлах.
Не буду детально разбирать, потому что не очень хорошо ориентируюсь в этих темах пока и хочу с основным функционалом разобраться в начале. Может быть, вернемся к этому позже.
#nextjs #серверныйрендеринг #документация #отложено #оптимизация
Статья в документации (англ.): https://nextjs.org/docs/going-to-production
Вероятно, очень полезная статья о том, что нужно сделать перед тем, как отправлять проект в продакшн. Тут рассказывается о кешировании, обработке ошибок, оптимизации и уменьшении количества кода в клиентских бандлах.
Не буду детально разбирать, потому что не очень хорошо ориентируюсь в этих темах пока и хочу с основным функционалом разобраться в начале. Может быть, вернемся к этому позже.
#nextjs #серверныйрендеринг #документация #отложено #оптимизация
nextjs.org
Deploying: Production Checklist
Recommendations to ensure the best performance and user experience before taking your Next.js application to production.
👍4