From 8ed430d09808f40afaf73750f7545d895352c045 Mon Sep 17 00:00:00 2001 From: Steven Date: Sun, 19 Mar 2023 17:16:12 -0400 Subject: [PATCH 1/2] fix: handle different cases of React `fetchPriority` --- packages/next/src/client/image.tsx | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/next/src/client/image.tsx b/packages/next/src/client/image.tsx index d830fef14ec50c..5e13f317f34ae5 100644 --- a/packages/next/src/client/image.tsx +++ b/packages/next/src/client/image.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState, forwardRef, + version, } from 'react' import Head from '../shared/lib/head' import { getImageBlurSvg } from '../shared/lib/image-blur-svg' @@ -367,6 +368,23 @@ function handleLoading( }) } +function getDynamicProps( + fetchPriority?: string +): Record { + const [majorStr, minorStr] = version.split('.') + const major = parseInt(majorStr, 10) + const minor = parseInt(minorStr, 10) + if (major > 18 || (major === 18 && minor >= 3)) { + // In React 18.3.0 or newer, we must use camelCase + // prop to avoid "Warning: Invalid DOM property". + // See https://github.com/facebook/react/pull/25927 + return { fetchPriority } + } + // In React 18.2.0 or older, we must use lowercase prop + // to avoid "Warning: Invalid DOM property". + return { fetchpriority: fetchPriority } +} + const ImageElement = forwardRef( ( { @@ -401,10 +419,9 @@ const ImageElement = forwardRef( <> ( imageSrcSet={imgAttributes.srcSet} imageSizes={imgAttributes.sizes} crossOrigin={rest.crossOrigin} - // Keep lowercase until https://github.com/facebook/react/pull/25927 lands - fetchpriority={fetchPriority} + {...getDynamicProps(fetchPriority)} /> ) : null} From 6296b99b3b4ac3b537a0d9996f2dbd6d6df2c2d7 Mon Sep 17 00:00:00 2001 From: Steven Date: Sun, 19 Mar 2023 19:36:58 -0400 Subject: [PATCH 2/2] chore: add test --- test/integration/next-image-new/default/pages/priority.js | 6 ++++++ test/integration/next-image-new/default/test/index.test.ts | 1 + 2 files changed, 7 insertions(+) diff --git a/test/integration/next-image-new/default/pages/priority.js b/test/integration/next-image-new/default/pages/priority.js index 3cc02b89bcbfcd..57f025fe815a13 100644 --- a/test/integration/next-image-new/default/pages/priority.js +++ b/test/integration/next-image-new/default/pages/priority.js @@ -8,6 +8,7 @@ const Page = () => { basic-image { basic-image-crossorigin { load-eager { responsive1 { responsive2 { />