Inline Images
Using Next.js Image component for inline images and media entities in body fields.
To handle inline images and media entities added via a WYSIWYG editor, we can use an html parser
to replace the `img` tags with the Next.js `Image` component.
Dependencies
Install html-react-parser.
yarn add html-react-parserComponent
Let's create a component to render a `text_long` (example: `node.body.processed`) field type.
components/body.tsx
import { HTMLReactParserOptions } from "html-react-parser"import { Element } from "domhandler/lib/node"import parse from "html-react-parser"import Image from "next/image"
const options: HTMLReactParserOptions = {  replace: (domNode) => {    // Look for an img tag and replace it with Image.    if (domNode instanceof Element && domNode.name === "img") {      const { src, alt, width, height } = domNode.attribs
      return (        <Image          src={`${process.env.NEXT_PUBLIC_DRUPAL_BASE_URL}/${src}`}          width={`${width}px`}          height={`${height}px`}          alt={alt}          layout="intrinsic"          objectFit="cover"        />      )    }  },}
export function Body({ value }: { value: string }) {  return <>{parse(value, options)}</>}We use `intrinsic` layout so that images scale down for smaller viewports but maintain the original dimensions for larger viewports.
Usage
pages/index.tsx
import { Body } from "components/body"
export default function Page({ node }) {  return (    <div variant="container">      <h1>{node.title}</h1>      <Body value={node.body.processed} />     </div>  )}Learn more about next/image.