使用 React 和 React Three Fiber 将 Astro 部署到 Netlify/Vercel:“找不到组件”错误

问题描述 投票:0回答:1

我正在开发一个同时使用 React 和 React Three Fiber 的 Astro 网站。在本地,一切都按预期运行,没有任何问题或错误。但是,当我尝试将网站部署到 Netlify 或 Vercel 时,部署过程失败,并且日志表明它找不到特定组件。

9:24:42 AM: file: /opt/build/repo/src/layouts/MainLayout.astro
9:24:42 AM:  error   Could not resolve ../components/FiberCanvas.jsx from src/layouts/MainLayout.astro
9:24:42 AM:   File:
9:24:42 AM:     /opt/build/repo/src/layouts/MainLayout.astro
9:24:42 AM:   Stacktrace:
9:24:42 AM: RollupError: Could not resolve ../components/FiberCanvas.jsx from src/layouts/MainLayout.astro
9:24:42 AM:     at error (file:///opt/build/repo/node_modules/rollup/dist/es/shared/node-entry.js:2245:30)
9:24:42 AM:     at ModuleLoader.handleInvalidResolvedId (file:///opt/build/repo/node_modules/rollup/dist/es/shared/node-entry.js:24654:24)
9:24:42 AM:     at file:///opt/build/repo/node_modules/rollup/dist/es/shared/node-entry.js:24616:26
9:24:42 AM: error Command failed with exit code 1. (https://ntl.fyi/exit-code-1)
9:24:42 AM: info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.```

This is the code inside my `MainLayout.astro` file:

```---
import BaseHead from "../components/BaseHead.astro";
import Header from "../components/Header.astro";
import { SITE_TITLE, SITE_DESCRIPTION } from "../consts";
import FiberContainer from "../components/FiberCanvas.jsx";
---

<!DOCTYPE html>
<html lang="en">
  <head>
    <BaseHead title={SITE_TITLE} description={SITE_DESCRIPTION} />
  </head>
  <body>
    <FiberContainer client:load />
    <div id="mainFrame">
      <Header title={SITE_TITLE} />
    </div>
    <!-- <Footer /> -->
  </body>
</html>```

And the `FiberCanvas.jsx`:

```import { Canvas } from "@react-three/fiber";
import { OrbitControls, Stage } from "@react-three/drei";
import { EffectComposer, Scanline, Noise } from "@react-three/postprocessing";
import { BlendFunction } from "postprocessing";
import { Scene } from "./Scene";
import { Perf } from "r3f-perf";
import "../styles/fiberCanvas.css";
import { get } from "../pages/rss.xml";

export const FiberContainer = () => {
  const sceneCreated = ({ gl }) => {
    console.log("Scene created: ", gl);
    gl.setClearColor("black", 1);
  };

  return (
    <div id="fiberCanvas">
      <Canvas
        onCreated={sceneCreated}
        camera={{ position: [0, 0, 5], fov: 100 }}
      >
        <Perf />
        <Stage>
          <Scene />
        </Stage>
        <OrbitControls
          autoRotate
          autoRotateSpeed={3}
          minDistance={1}
          maxDistance={100}
        />
        <EffectComposer>
          <Noise blendFunction={BlendFunction.SOFT_LIGHT} opacity={0.2} />
        </EffectComposer>
      </Canvas>
    </div>
  );
};

export default FiberContainer;```

I'm using Astro version 2.9.2, and my Node version is 18.17.1
deployment vercel netlify react-three-fiber astrojs
1个回答
1
投票

w/Astro 3.0:

import { Canvas, useThree } from "@react-three/fiber";
import { CameraControls } from "@react-three/drei";
import { useEffect, useRef } from "react";

const Scene = () => {
  const { controls } = useThree();
  const meshRef = useRef();

  const margin = 0.2;
  useEffect(() => {
    if (controls) {
      controls.fitToBox(meshRef.current, true, {
        paddingTop: margin,
        paddingLeft: margin,
        paddingBottom: margin,
        paddingRight: margin,
      });
      controls.rotateTo(Math.PI / -0.4, Math.PI / 2.5, true);
    }
  }, [controls]);

  return (
    <>
      <mesh ref={meshRef}>
        <boxGeometry />
        <meshNormalMaterial />
      </mesh>
      <CameraControls makeDefault />
    </>
  );
};

export const Fiber = () => {
  return (
    <Canvas
      camera={{ position: [10, -20, 5], fov: 45 }}
      style={{ height: "100%" }}
    >
      <Scene />
    </Canvas>
  );
};

export default Fiber;

---
import Fiber from "../components/Fiber.jsx";
---

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
    <meta name="viewport" content="width=device-width" />
    <meta name="generator" content={Astro.generator} />
    <title>Astro + R3F</title>
  </head>
  <body>
    <Fiber client:load />
  </body>
</html>

<style>
  html,
  body,
  #root {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    background: #2b2b33;
  }
</style>

部署在vercel上:

https://astro-r3f-git-plain-seantai1.vercel.app/ https://github.com/seantai/astro-r3f/tree/plain

© www.soinside.com 2019 - 2024. All rights reserved.