По умолчанию встроенная оптимизация изображений Next.js отключена на App Hosting , если только вы явно не зададите параметру images.unoptimized
значение false или не используете пользовательский загрузчик изображений.
Вы можете настроить глобальный загрузчик изображений Next.js с помощью расширения Firebase для обработки изображений, чтобы включить оптимизацию по запросу и доставку изображений в вашем приложении Next.js на App Hosting .
Предпосылки
- У вас есть проект Firebase и бэкэнд App Hosting .
- В вашем проекте включено Cloud Storage .
- В вашем проекте включены Cloud Functions for Firebase .
Установить расширение
Перейдите к расширению обработки изображений в Firebase Extensions Hub и выберите Установить в Firebase Console . Следуйте инструкциям на экране.
Настройте локальную оптимизацию изображения (необязательно)
Если ваше приложение использует локальные изображения, которые вы хотите оптимизировать с помощью этого расширения, вам необходимо настроить параметр «Hostname» во время процесса установки расширения.
Во время настройки расширения: Когда вы дойдете до шага «Настройка расширения», найдите параметр «Имя хоста».
Установите Hostname: введите домен по умолчанию для вашего бэкэнда Firebase App Hosting . Этот домен обычно заканчивается на
.hosted.app
.
После завершения установки API обработки изображений должен быть развернут как функция в Cloud Functions . Перейдите на панель инструментов Functions в консоли Firebase и скопируйте URL-адрес триггера API обработки изображений.
Настройте пользовательский загрузчик изображений
Создайте загрузчик изображений , который использует развернутый API обработки изображений для каждого оптимизированного компонента изображения . В качестве оптимизации перепишите его так, чтобы он обслуживался в том же домене Firebase App Hosting и кэшировался в том же глобальном CDN, что и ваше приложение Next.js.
Сначала добавьте следующие поля в файл next.config.js
:
// @ts-check
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
loader: "custom",
loaderFile: "./loader.js",
},
async rewrites() {
return [
{
source: "/_fah/image/:path*",
destination:
"<CLOUD_FUNCTIONS_URL>/:path*",
},
];
},
}
module.exports = nextConfig;
Затем создайте файл loader.js
в корневом каталоге со следующим содержимым:
"use client"
export default function myImageLoader({ src, width, quality }) {
if (process.env.NODE_ENV === "development") {
return src;
}
const operations = [
{
operation: "input",
type: "url",
url: src,
},
{ operation: "resize", width: width },
{ operation: "output", format: "webp", quality: quality || 75 },
];
const encodedOperations = encodeURIComponent(JSON.stringify(operations));
return `/_fah/image/process?operations=${encodedOperations}`;
}
Создайте коммит, включающий эти изменения, и отправьте его в свою ветку live. Затем дождитесь завершения развертывания App Hosting .