You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在React+Astro项目中使用GSAP ScrollTrigger出现模块导入错误

Astro + React 项目中 GSAP ScrollTrigger 导入错误解决方案

问题重现

在Astro框架的React项目中,按照常规方式导入GSAP和ScrollTrigger:

import { useEffect, useRef } from "react";
import gsap from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';

gsap.registerPlugin(ScrollTrigger);

启动开发环境后触发错误:

Cannot use import statement outside a module
Stack Trace
/Applications/MAMP/htdocs/Developer/Git/bitozzi-scale/node_modules/gsap/ScrollTrigger.js:12
import { Observer, _getTarget, _vertical, _horizontal, _scrollers, _proxies, _getScrollFunc, _getProxyProp, _getVelocityProp } from "./Observer.js";
^^^^^^

SyntaxError: Cannot use import statement outside a module
at internalCompileFunction (node:internal/vm:77:18)
at wrapSafe (node:internal/modules/cjs/loader:1288:20)
at Module._compile (node:internal/modules/cjs/loader:1340:27)
at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Module._load (node:internal/modules/cjs/loader:1023:12)
at cjsLoader (node:internal/modules/esm/translators:356:17)
at ModuleWrap. (node:internal/modules/esm/translators:305:7)
at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)

解决方案

1. 重装最新版GSAP

先卸载现有GSAP,重新安装最新稳定版,确保模块结构正确:

npm uninstall gsap
npm install gsap

2. 调整组件内的GSAP使用逻辑

GSAP依赖浏览器环境,必须在客户端执行,将插件注册和动画逻辑放在useEffect中,同时添加清理函数避免内存泄漏:

import { useEffect, useRef } from "react";
import gsap from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';

export default function AnimatedComponent() {
  const targetRef = useRef(null);

  useEffect(() => {
    // 仅在客户端注册插件
    gsap.registerPlugin(ScrollTrigger);

    // 初始化滚动动画
    if (targetRef.current) {
      const animation = gsap.from(targetRef.current, {
        y: 60,
        opacity: 0,
        duration: 0.8,
        ease: "power2.out"
      });

      ScrollTrigger.create({
        trigger: targetRef.current,
        start: "top 85%",
        end: "top 15%",
        animation: animation,
        toggleActions: "play reverse play reverse"
      });
    }

    // 组件卸载时清理ScrollTrigger实例
    return () => {
      ScrollTrigger.getAll().forEach(trigger => trigger.kill());
    };
  }, []);

  return <div ref={targetRef} className="animated-element">滚动触发动画的元素</div>;
}

3. 配置Astro的Vite优化规则

在astro.config.mjs中添加Vite配置,让Astro正确预编译GSAP的ES模块:

import { defineConfig } from 'astro/config';
import react from '@astrojs/react';

export default defineConfig({
  integrations: [react()],
  vite: {
    optimizeDeps: {
      include: ['gsap', 'gsap/ScrollTrigger']
    }
  }
});

4. 标记React组件为客户端组件

如果是在.astro页面文件中引入React组件,必须添加客户端指令(如client:load),确保组件在浏览器中运行:

---
import AnimatedComponent from '../components/AnimatedComponent.jsx';
---

<AnimatedComponent client:load />

错误原因

该错误是因为Node.js的CommonJS模块加载器尝试解析GSAP内部的ES模块语法(import语句),而Astro的服务端渲染环境默认使用CommonJS处理模块。通过上述配置,让Vite预编译GSAP为兼容格式,并确保GSAP代码仅在客户端执行,即可解决模块冲突问题。

内容的提问来源于stack exchange,提问作者Niko71

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:43:26