Новый компонент next/image nextjs 13 не загружается с изображением sanity.io

Я пытаюсь получить простой компонент next/image, отображаемый правильно, но изображения просто не загружаются. Я использую только что выпущенный nextjs 13, так что это новая версия компонента.

Я использую sanity.io сзади, и мои изображения хранятся там. Мне неясно, вызвана ли эта проблема новым компонентом next/image или что-то не так с моим кодом. Реквизиты src и alt передаются правильно, и источник, кажется, правильно регистрируется (изображение ниже), но изображение не отображается.

/приложение/Рисунок.tsx:

"use client";
import Image from "next/image";

interface Props {
  src: string;
  alt: string;
  width: number;
  height: number;
}

export default function Figure(props: Props) {
  return (
    <figure>
      <style jsx>{`
        figure {
          position: relative;
          width: 100%;
          margin: 0;
          padding-top: ${((props.height / props.width) * 100).toFixed(2)}%;
        }
      `}</style>
      <Image src = {props.src} alt = {props.alt} fill />
    </figure>
  );
}

следующий.config.js:

  images: {
    domains: ["cdn.sanity.io", "images.pexels.com"],
  },

Результат

🤔 А знаете ли вы, что...
С React можно легко интегрировать с существующими проектами и кодом.


1
870
1

Ответ:

Решено

Если вы извлекаете изображение напрямую, вам необходимо преобразовать полученный ответ данных в blob, а затем создать URL-адрес объекта (URL.createObjectURL) для тега Image, который будет использоваться в качестве источника.

Я также сделал демо Stackblitz.

import Image from 'next/image';
import React from 'react';
import useSWR from 'swr';

const fetcher = (url) => fetch(url).then((res) => res.blob());

export default function App() {
  const url = 'https://source.unsplash.com/random';
  const { data, error } = useSWR(url, fetcher);

  if (error) return 'An error has occurred.';
  if (!data) return 'Loading...';

  const dataUrl = URL.createObjectURL(data);

  return (
    <figure>
      <style jsx>{`
      figure {
        position: relative;
        width: 100%;
        margin: 0;
        padding-top: ${((200 / 200) * 100).toFixed(2)}%;
      }
    `}</style>
      <Image src = {dataUrl} alt = {'test'} fill />
    </figure>
  );
}