{"id":494185,"date":"2026-09-10T08:28:57","date_gmt":"2026-09-10T08:28:57","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=494185"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=494185","title":{"rendered":"Next.js, image + metadata + build-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0434\u043e\u043c"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 Next.js \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, metadata \u0438 production build \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <code>next\/image<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. Metadata API \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 <code>&lt;title&gt;<\/code>, description, Open Graph \u0438 Twitter metadata. <code>next build<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 production-\u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0448\u0438\u0431\u043a\u0438 \u0432 \u044d\u0442\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0435 <code>next dev<\/code>. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, title \u0435\u0441\u0442\u044c. \u041d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 <code>Image<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u044b\u0439 URL, Open Graph \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <a href=\"http:\/\/localhost\" rel=\"noopener nofollow\">localhost<\/a>, production build \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u044d\u0442\u0438 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u00a0<a href=\"https:\/\/goods-finder-js.vercel.app\/\" rel=\"noopener nofollow\">Goods Finder<\/a>.<\/p>\n<h3>next\/image<\/h3>\n<p><code>Image<\/code> \u0438\u0437 <code>next\/image<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0432\u043d\u0435\u0448\u043d\u0438\u0439 URL \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 import. \u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <code>public<\/code> \u043f\u0443\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0441\u0430\u0439\u0442\u0430.<\/p>\n<pre><code class=\"javascript\">import Image from \"next\/image\";export default function Page() {  return (    &lt;Image      src=\"\/og-goods-finder.png\"      alt=\"\u041e\u0431\u043b\u043e\u0436\u043a\u0430\"      width={1200}      height={630}      style={{ width: \"100%\", height: \"auto\" }}    \/&gt;  );}                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>width<\/code> \u0438 <code>height<\/code> \u0437\u0430\u0434\u0430\u044e\u0442 intrinsic-\u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u044e, CSS \u0437\u0430\u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/p>\n<p>\u041f\u0440\u0438 <code>fill<\/code> \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443.<\/p>\n<pre><code class=\"javascript\">&lt;div className=\"relative aspect-[4\/3]\"&gt;  &lt;Image    src=\"\/product.png\"    alt=\"\u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0442\u043e\u0432\u0430\u0440\u0430\"    fill    sizes=\"(min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw\"    className=\"object-contain\"  \/&gt;&lt;\/div&gt;                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0451\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, <code>Image<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u044c.<\/p>\n<p><code>sizes<\/code> \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 viewport. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u0440\u0438 <code>fill<\/code> \u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0448\u0438\u0440\u0438\u043d\u044b <code>100vw<\/code> \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0437 <code>srcset<\/code> \u0444\u0430\u0439\u043b \u043a\u0440\u0443\u043f\u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e.<\/p>\n<h3>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 URL \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432 <code>next.config<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>images.remotePatterns<\/code>.<\/p>\n<pre><code class=\"javascript\">\/** @type {import(\"next\").NextConfig} *\/const nextConfig = {  images: {    remotePatterns: [      {        protocol: \"https\",        hostname: \"cdn.example.com\",        port: \"\",        pathname: \"\/product-images\/**\",        search: \"\",      },    ],  },};export default nextConfig;                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Next \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 protocol, hostname, port, pathname \u0438 search \u0441 URL \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0435\u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0438\u0439 URL Image Optimizer \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442.<\/p>\n<p><em> \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442. <\/em><code>*<\/code> \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043e\u043d\u0446\u0435 pathname \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e subdomain \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 hostname.<\/p>\n<p>\u0428\u0438\u0440\u043e\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u0440\u043e\u0434\u0435 <code>hostname: \"**\"<\/code> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432. \u0423\u0437\u043a\u0438\u0439 pattern \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442 host \u0438 path, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d <a href=\"http:\/\/cdn.dummyjson.com\" rel=\"noopener nofollow\"><code>cdn.dummyjson.com<\/code><\/a> \u0438 \u043f\u0443\u0442\u044c <code>\/product-images\/**<\/code>. \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 thumbnail \u0438\u0437 API, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 URL \u0432 <code>Image<\/code>.<\/p>\n<h3>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430<\/h3>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0441 <code>loading=\"lazy\"<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0430\u0447\u0435. \u0412 Next.js 16 \u0441\u0442\u0430\u0440\u044b\u0439 prop <code>priority<\/code> \u043f\u043e\u043c\u0435\u0447\u0435\u043d deprecated. \u0412 API \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <code>preload<\/code>.<\/p>\n<pre><code class=\"javascript\">&lt;Image  src={item.thumbnail}  alt={item.title}  fill  sizes=\"(min-width: 640px) 50vw, 100vw\"  preload\/&gt;                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>preload<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 <code>&lt;link&gt;<\/code> \u0432 <code>&lt;head&gt;<\/code>. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 <code>loading=\"eager\"<\/code> \u0438\u043b\u0438 <code>fetchPriority=\"high\"<\/code> \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 preload \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0412\u0441\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c preload \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<h3>Metadata \u0432 layout<\/h3>\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 metadata \u043c\u043e\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 <code>layout.js<\/code> \u0438\u043b\u0438 <code>page.js<\/code>.<\/p>\n<pre><code class=\"javascript\">export const metadata = {  title: {    default: \"Store\",    template: \"%s - Store\",  },  description: \"\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432\",};                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043e\u0447\u0435\u0440\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0439 title.<\/p>\n<pre><code class=\"javascript\">export const metadata = {  title: \"\u0421\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432\",};                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0438\u0437 layout \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 <code>&lt;title&gt;<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 title \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0441\u0430\u0439\u0442\u0430.<\/p>\n<p>Open Graph \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 layout.<\/p>\n<pre><code class=\"javascript\">export const metadata = {  title: \"Store\",  description: \"\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432\",  openGraph: {    title: \"Store\",    description: \"\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432\",    type: \"website\",    images: [      {        url: \"\/og.png\",        width: 1200,        height: 630,        alt: \"Store\",      },    ],  },};                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 <code>\/og.png<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441.<\/p>\n<h3>metadataBase<\/h3>\n<p><code>metadataBase<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 origin \u0434\u043b\u044f URL \u0432\u043d\u0443\u0442\u0440\u0438 metadata.<\/p>\n<pre><code class=\"javascript\">const metadataBase = new URL(  process.env.NEXT_PUBLIC_SITE_URL ?? \"http:\/\/localhost:3000\");export const metadata = {  metadataBase,  openGraph: {    images: [      {        url: \"\/og.png\",        width: 1200,        height: 630,      },    ],  },};                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 <code>metadataBase = <\/code><a href=\"https:\/\/example.com\" rel=\"noopener nofollow\"><code>https:\/\/example.com<\/code><\/a> \u043f\u0443\u0442\u044c <code>\/og.png<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/example.com\/og.png\" rel=\"noopener nofollow\"><code>https:\/\/example.com\/og.png<\/code><\/a>.<\/p>\n<p>\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 URL \u0432 metadata \u0431\u0435\u0437 <code>metadataBase<\/code> \u043c\u043e\u0433\u0443\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c build. \u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 URL \u043e\u0442 <code>metadataBase<\/code> \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442.<\/p>\n<p>Fallback \u043d\u0430 <a href=\"http:\/\/localhost\" rel=\"noopener nofollow\">localhost<\/a> \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0412 production \u0442\u0430\u043a\u043e\u0439 fallback \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0421\u0431\u043e\u0440\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0441 <a href=\"http:\/\/localhost:3000\" rel=\"noopener nofollow\"><code>http:\/\/localhost:3000<\/code><\/a> \u0432\u043d\u0443\u0442\u0440\u0438 metadata. Production env \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f production \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c fallback.<\/p>\n<pre><code class=\"javascript\">const siteUrl = process.env.NEXT_PUBLIC_SITE_URL;if (!siteUrl) {  throw new Error(\"NEXT_PUBLIC_SITE_URL is required\");}export const metadata = {  metadataBase: new URL(siteUrl),};                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u044f\u0432\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<h3>generateMetadata<\/h3>\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <code>metadata<\/code> \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 title \u0438 description. Dynamic route \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c metadata \u043f\u043e <code>params<\/code>.<\/p>\n<pre><code class=\"javascript\">export async function generateMetadata({ params }) {  const { id } = await params;  const item = await getProductById(id);  return {    title: item.title,    description: item.description,    openGraph: {      title: item.title,      description: item.description,      url: `\/goods\/${id}`,      images: [        {          url: item.thumbnail,          alt: item.title,        },      ],    },    twitter: {      card: \"summary_large_image\",      title: item.title,      description: item.description,      images: [item.thumbnail],    },  };}                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>generateMetadata<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 dynamic segment \u0447\u0435\u0440\u0435\u0437 <code>params<\/code>.<\/p>\n<p>Description \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 metadata.<\/p>\n<pre><code class=\"javascript\">function toShortText(value, maxLen = 160) {  const text = String(value || \"\")    .trim()    .replace(\/\\s+\/g, \" \");  if (!text) return \"\";  if (text.length &lt;= maxLen) return text;  return `${text.slice(0, maxLen - 1)}\u2026`;}                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0435\u0451 \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b.<\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f metadata \u0442\u043e\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<pre><code class=\"javascript\">export async function generateMetadata({ params }) {  const { id } = await params;  try {    const item = await getProductById(id);    return {      title: item.title,      description: toShortText(item.description),    };  } catch {    return {      title: \"\u0422\u043e\u0432\u0430\u0440 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\",      description: \"\u0417\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u0432\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\",    };  }}                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 fallback metadata.<\/p>\n<h3>Open Graph \u0438 remotePatterns<\/h3>\n<p><code>remotePatterns<\/code> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a <code>next\/image<\/code>. \u041f\u043e\u043b\u0435 <code>openGraph.images<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 URL \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 metadata.<\/p>\n<p>\u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 thumbnail \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445.<\/p>\n<pre><code class=\"javascript\">&lt;Image  src={item.thumbnail}  alt={item.title}  width={600}  height={400}\/&gt;                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e URL \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 <code>remotePatterns<\/code>.<\/p>\n<pre><code class=\"javascript\">return {  openGraph: {    images: [item.thumbnail],  },};                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c Next \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 <code>&lt;meta property=\"og:image\"&gt;<\/code> \u0441 URL.<\/p>\n<h3>Dev \u0438 build<\/h3>\n<p><code>next dev<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 development server. <code>next build<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 production-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412 package.json \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<pre><code class=\"javascript\">{  \"scripts\": {    \"dev\": \"next dev\",    \"build\": \"next build\",    \"start\": \"next start\",    \"lint\": \"eslint\"  }}                <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 Next.js 16 <code>next build<\/code> \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 ESLint. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 <code>next lint<\/code> \u0442\u043e\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 production \u0441\u0431\u043e\u0440\u043a\u043e\u0439 lint \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<pre><code class=\"typescript\">npm run lintnpm run build                  <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 ESLint. \u0412\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 production-\u0432\u0435\u0440\u0441\u0438\u044e Next.js.<\/p>\n<p>Build \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 production-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 Next \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438. \u0427\u0430\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f runtime, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e build \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f production server.<\/p>\n<pre><code class=\"typescript\">npm run start    <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>next start<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e <code>next build<\/code>.<\/p>\n<h3>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 production-\u0440\u0435\u0436\u0438\u043c\u0430<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 <code>next start<\/code> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u0441\u043f\u0438\u0441\u043e\u043a \u0438 dynamic route. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a Image Optimizer.<\/p>\n<p>\u0423 dynamic page \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f <code>&lt;head&gt;<\/code>. Title \u0438 description \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. <code>og:url<\/code> \u0438 <code>og:image<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 production origin, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URL \u0447\u0435\u0440\u0435\u0437 <code>metadataBase<\/code>.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 id \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 404. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0441\u043b\u0435 reload, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434.<\/p>\n<p>Production env \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u0434. <code>NEXT_PUBLIC_SITE_URL<\/code>, API base URL \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0434\u043e \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0438.<\/p>\n<p>\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c URL. \u041d\u043e\u0432\u044b\u0439 hostname \u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 pathname \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>remotePatterns<\/code>.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0434 \u0434\u0435\u043f\u043b\u043e\u0435\u043c<\/h3>\n<pre><code class=\"typescript\">npm run lintnpm run buildnpm run start                 <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, dynamic route, 404, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 metadata. Dev server \u0432 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1080700\/\">https:\/\/habr.com\/ru\/articles\/1080700\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 Next.js \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, metadata \u0438 production build \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. next\/image \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. Metadata API \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 &lt;title&gt;, description, Open Graph \u0438 Twitter metadata. next build \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 production-\u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0448\u0438\u0431\u043a\u0438 \u0432 \u044d\u0442\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0435 next dev. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, title \u0435\u0441\u0442\u044c. \u041d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0434\u043e\u043c\u0435\u043d\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 Image \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u044b\u0439 URL, Open Graph \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 localhost, production build \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u043b\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u044d\u0442\u0438 \u0442\u0440\u0438 \u0447\u0430\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u00a0Goods Finder.next\/imageImage \u0438\u0437 next\/image \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u0432\u043d\u0435\u0448\u043d\u0438\u0439 URL \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 import. \u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 public \u043f\u0443\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0441\u0430\u0439\u0442\u0430.import Image from &#171;next\/image&#187;;export default function Page() {  return (    &lt;Image      src=&#187;\/og-goods-finder.png&#187;      alt=&#187;\u041e\u0431\u043b\u043e\u0436\u043a\u0430&#187;      width={1200}      height={630}      style={{ width: &#171;100%&#187;, height: &#171;auto&#187; }}    \/&gt;  );}                  width \u0438 height \u0437\u0430\u0434\u0430\u044e\u0442 intrinsic-\u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u044e, CSS \u0437\u0430\u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\u041f\u0440\u0438 fill \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443.&lt;div className=&#187;relative aspect-[4\/3]&#187;&gt;  &lt;Image    src=&#187;\/product.png&#187;    alt=&#187;\u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u0442\u043e\u0432\u0430\u0440\u0430&#187;    fill    sizes=&#187;(min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw&#187;    className=&#187;object-contain&#187;  \/&gt;&lt;\/div&gt;                  \u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0451\u0442 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, Image \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043b\u043e\u0449\u0430\u0434\u044c.sizes \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 viewport. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u0440\u0438 fill \u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0448\u0438\u0440\u0438\u043d\u044b 100vw \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0437 srcset \u0444\u0430\u0439\u043b \u043a\u0440\u0443\u043f\u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e.\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0412\u043d\u0435\u0448\u043d\u0438\u0439 URL \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0432 next.config. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f images.remotePatterns.\/** @type {import(&#171;next&#187;).NextConfig} *\/const nextConfig = {  images: {    remotePatterns: [      {        protocol: &#171;https&#187;,        hostname: &#171;cdn.example.com&#187;,        port: &#171;&#187;,        pathname: &#171;\/product-images\/**&#187;,        search: &#171;&#187;,      },    ],  },};export default nextConfig;                  Next \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 protocol, hostname, port, pathname \u0438 search \u0441 URL \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0435\u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0438\u0439 URL Image Optimizer \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442. \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442. * \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043e\u043d\u0446\u0435 pathname \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e subdomain \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 hostname.\u0428\u0438\u0440\u043e\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u0440\u043e\u0434\u0435 hostname: &#171;**&#187; \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432. \u0423\u0437\u043a\u0438\u0439 pattern \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442 host \u0438 path, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438.\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d cdn.dummyjson.com \u0438 \u043f\u0443\u0442\u044c \/product-images\/**. \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 thumbnail \u0438\u0437 API, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 URL \u0432 Image.\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430\u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0441 loading=&#187;lazy&#187; \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0430\u0447\u0435. \u0412 Next.js 16 \u0441\u0442\u0430\u0440\u044b\u0439 prop priority \u043f\u043e\u043c\u0435\u0447\u0435\u043d deprecated. \u0412 API \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f preload.&lt;Image  src={item.thumbnail}  alt={item.title}  fill  sizes=&#187;(min-width: 640px) 50vw, 100vw&#187;  preload\/&gt;                  preload \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 &lt;link&gt; \u0432 &lt;head&gt;. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 loading=&#187;eager&#187; \u0438\u043b\u0438 fetchPriority=&#187;high&#187; \u0434\u043b\u044f \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 preload \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0412\u0441\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c preload \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430.Metadata \u0432 layout\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 metadata \u043c\u043e\u0436\u043d\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 layout.js \u0438\u043b\u0438 page.js.export const metadata = {  title: {    default: &#171;Store&#187;,    template: &#171;%s &#8212; Store&#187;,  },  description: &#171;\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432&#187;,};                  \u0414\u043e\u0447\u0435\u0440\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0439 title.export const metadata = {  title: &#171;\u0421\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0432\u0430\u0440\u043e\u0432&#187;,};                  \u0421 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0438\u0437 layout \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 &lt;title&gt; \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 title \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0441\u0430\u0439\u0442\u0430.Open Graph \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 layout.export const metadata = {  title: &#171;Store&#187;,  description: &#171;\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432&#187;,  openGraph: {    title: &#171;Store&#187;,    description: &#171;\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432&#187;,    type: &#171;website&#187;,    images: [      {        url: &#171;\/og.png&#187;,        width: 1200,        height: 630,        alt: &#171;Store&#187;,      },    ],  },};                  \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \/og.png \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441.metadataBasemetadataBase \u0437\u0430\u0434\u0430\u0451\u0442 origin \u0434\u043b\u044f URL \u0432\u043d\u0443\u0442\u0440\u0438 metadata.const metadataBase = new URL(  process.env.NEXT_PUBLIC_SITE_URL ?? &#171;http:\/\/localhost:3000&#187;);export const metadata = {  metadataBase,  openGraph: {    images: [      {        url: &#171;\/og.png&#187;,        width: 1200,        height: 630,      },    ],  },};                  \u041f\u0440\u0438 metadataBase = https:\/\/example.com \u043f\u0443\u0442\u044c \/og.png \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 https:\/\/example.com\/og.png.\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 URL \u0432 metadata \u0431\u0435\u0437 metadataBase \u043c\u043e\u0433\u0443\u0442 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c build. \u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 URL \u043e\u0442 metadataBase \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442.Fallback \u043d\u0430 localhost \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0412 production \u0442\u0430\u043a\u043e\u0439 fallback \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0421\u0431\u043e\u0440\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0441 http:\/\/localhost:3000 \u0432\u043d\u0443\u0442\u0440\u0438 metadata. Production env \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.\u0414\u043b\u044f production \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c fallback.const siteUrl = process.env.NEXT_PUBLIC_SITE_URL;if (!siteUrl) {  throw new Error(&#171;NEXT_PUBLIC_SITE_URL is required&#187;);}export const metadata = {  metadataBase: new URL(siteUrl),};                  \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u044f\u0432\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.generateMetadata\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 metadata \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 title \u0438 description. Dynamic route \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c metadata \u043f\u043e params.export async function generateMetadata({ params }) {  const { id } = await params;  const item = await getProductById(id);  return {    title: item.title,    description: item.description,    openGraph: {      title: item.title,      description: item.description,      url: `\/goods\/${id}`,      images: [        {          url: item.thumbnail,          alt: item.title,        },      ],    },    twitter: {      card: &#171;summary_large_image&#187;,      title: item.title,      description: item.description,      images: [item.thumbnail],    },  };}                  generateMetadata \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 dynamic segment \u0447\u0435\u0440\u0435\u0437 params.Description \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u0434\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 metadata.function toShortText(value, maxLen = 160) {  const text = String(value || &#171;&#187;)    .trim()    .replace(\/\\s+\/g, &#187; &#171;);  if (!text) return &#171;&#187;;  if (text.length &lt;= maxLen) return text;  return `${text.slice(0, maxLen &#8212; 1)}\u2026`;}                  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442 \u0435\u0451 \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b.\u041e\u0448\u0438\u0431\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f metadata \u0442\u043e\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434.export async function generateMetadata({ params }) {  const { id } = await params;  try {    const item = await getProductById(id);    return {      title: item.title,      description: toShortText(item.description),    };  } catch {    return {      title: &#171;\u0422\u043e\u0432\u0430\u0440 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d&#187;,      description: &#171;\u0417\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u0432\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.&#187;,    };  }}                  \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 fallback metadata.Open Graph \u0438 remotePatternsremotePatterns \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a next\/image. \u041f\u043e\u043b\u0435 openGraph.images \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 URL \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 metadata.\u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 thumbnail \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u0442\u0430\u0445.&lt;Image  src={item.thumbnail}  alt={item.title}  width={600}  height={400}\/&gt;                  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e URL \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 remotePatterns.return {  openGraph: {    images: [item.thumbnail],  },};                  \u0417\u0434\u0435\u0441\u044c Next \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 &lt;meta property=&#187;og:image&#187;&gt; \u0441 URL.Dev \u0438 buildnext dev \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 development server. next build \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 production-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412 package.json \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.{  &#171;scripts&#187;: {    &#171;dev&#187;: &#171;next dev&#187;,    &#171;build&#187;: &#171;next build&#187;,    &#171;start&#187;: &#171;next start&#187;,    &#171;lint&#187;: &#171;eslint&#187;  }}                \u0412 Next.js 16 next build \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 ESLint. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 next lint \u0442\u043e\u0436\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0430.\u041f\u0435\u0440\u0435\u0434 production \u0441\u0431\u043e\u0440\u043a\u043e\u0439 lint \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.npm run lintnpm run build                  \u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 ESLint. \u0412\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 production-\u0432\u0435\u0440\u0441\u0438\u044e Next.js.Build \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 production-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 Next \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438. \u0427\u0430\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f runtime, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e build \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f production server.npm run start    next start \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e next build.\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 production-\u0440\u0435\u0436\u0438\u043c\u0430\u041f\u043e\u0441\u043b\u0435 next start \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u0441\u043f\u0438\u0441\u043e\u043a \u0438 dynamic route. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a Image Optimizer.\u0423 dynamic page \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f &lt;head&gt;. Title \u0438 description \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. og:url \u0438 og:image \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 production origin, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URL \u0447\u0435\u0440\u0435\u0437 metadataBase.\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 id \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 404. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u0441\u043b\u0435 reload, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434.Production env \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u043e\u0434. NEXT_PUBLIC_SITE_URL, API base URL \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0434\u043e \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0438.\u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c URL. \u041d\u043e\u0432\u044b\u0439 hostname \u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 pathname \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f remotePatterns.\u041f\u0435\u0440\u0435\u0434 \u0434\u0435\u043f\u043b\u043e\u0435\u043cnpm run lintnpm run buildnpm run start                 \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, dynamic route, 404, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 metadata. Dev server \u0432 \u044d\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442.\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1080700\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-494185","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494185","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=494185"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494185\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=494185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=494185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=494185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}