Next.js 中的 new Image() ?

sam*_*m k 10 image next.js

您可以在 Next.js 中使用 new Image() 吗?我收到错误,说它没有定义。

我知道我可以简单地在 JSX 内部使用,但在这种情况下,我不确定它是否有效,因为我必须引用 JSX 外部的图像,如下所示。

如果无法使 new Image() 与 Next.js 一起使用,请展示一种不同的方法来使其工作。这个新的 Image() 用于制作 GSAP 滚动动画。

这是我的代码:

import Link from 'next/link'
import Head from 'next/head'
import Image from 'next/image'
import {useEffect, useRef, useState} from 'react'
import styles from '../styles/Home.module.css'
import {gsap} from 'gsap'
import { ScrollTrigger } from "gsap/dist/ScrollTrigger";

const Home = () => {

  const viewer = useRef(null)
  const image = new Image();

  if (typeof window !== "undefined") {
    gsap.registerPlugin(ScrollTrigger);
  }
  
  useEffect(()=>{

    const rows = 5
    const columns = 10
    const frame_count = rows * columns - 1
    // const imageWidth = 6336
    // const imageHeight = 1782
    const imageWidth = 4049
    const imageHeight = 3000
    const horizDiff = imageWidth / columns
    const vertDiff = imageHeight / rows
  
    const ctx = viewer.current.getContext("2d");
    viewer.current.width = horizDiff;
    viewer.current.height = vertDiff;
  

    const image = new Image()
    image.src = "./spriteDesk.jpg";
    // image.src = "./spriteMobile.jpg";
    image.onload = () => onUpdate();
  
    const setPos = gsap.quickSetter(viewer.current, "background-position");
  
    const obj = {num: 0};
    gsap.to(obj, {
      num: frame_count,
      ease: "steps(" + frame_count + ")",
      scrollTrigger: {
        trigger: ".section-one",
        start: "top top",
        end: "+=" + imageHeight,
        pin: true,
        anticipatePin: 1,
        scrub: 1
      },
      onUpdate
    });
  
    function onUpdate() {
      ctx.clearRect(0, 0, horizDiff, vertDiff);
      const x = Math.round((obj.num % columns) * horizDiff);
      const y = Math.round(Math.floor(obj.num / columns) * vertDiff);
      ctx.drawImage(image, x, y, horizDiff, vertDiff, 0, 0, horizDiff, vertDiff);
    }
  },[])





  return (
    <>
      <Head>
        <title>TalkingSkunk | Home</title>
        <meta name='keywords' content='talkingskunk' />
        <link rel="icon" href="/favicon.ico" />
        {/* <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.6.1/gsap.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.6.1/ScrollTrigger.min.js"></script> */}
      </Head>

      {/* <div className={styles.bgWrap}>
        <Image
        src="/spriteDesk.png"
        className='cityscape'
        data-speed="0.2"
        layout="fill"
        objectFit="cover"
        quality={100}
      /> */}

      {/* <Image src ='/spriteDesk.jpg' alt="spriteDesk" width ={4049} height = {3000} /> */}
      {/* <p className={styles.bgText}>
        Discover
      </p> */}


      <section className="styles.scene styles.section section-one">
        <canvas ref={viewer} className="styles.viewer"></canvas>
      </section>

    </>
  )
}

export default Home;
Run Code Online (Sandbox Code Playgroud)

Ber*_*rci 11

如果有人仍然需要这个,可以通过以下步骤来完成:

  1. 替换import Image from 'next/image'import NextImage from 'next/image'(或类似的东西),
  2. 将所有<Image ...标签替换为<NextImage ...(或者,如果没有标签,则仅删除导入)
  3. 使用Image()构造函数创建mdn 页面上描述的新 HTMLImageElement 实例。
  4. 如果您使用版本 11+(或更早版本),请使用此问题中Next.js描述的解决方案之一来禁用lint 以防止出现错误。no-img-element